Unity3d井字棋实现

unity实现井字棋小游戏 unity实现井字棋小游戏 前言 这是中山大学数据科学与计算机学院2019年3D游戏编程与设计的第二次作业 所有项目与代码已上传至github当中,欢迎大家访问。 github个人主页: https://starashzero.github.io 3D游戏编程与设计主页: https://starashzero.github.io/3DGameDesign 本次作业项目地址: https://gi... 阅读详情
整体框架:

首先我们要明确我们要做什么,需要什么函数实现。我只是设计了简单的双人游戏模式,在这个模式中,我们需要下列几个函数:

  • 重置函数Reset();
  • 棋盘界面,我们用OnGUI();函数创建棋盘,该函数用于渲染和处理GUI事件,这意味着每次落子都会调用此函数渲染棋盘。
  • 判断函数Check();用于判断输赢。

一开始我们用一个3*3二维数组创建棋盘,并将数组的初始值设定为0,如果O方在此位置下了,将此位置的值设为1,如果X方在此位置下了,将值设为2。创建一个变量指定是谁的回合,在OnGUI()函数中,对应值为1的地方创建O的button,而对应值为2的地方创建X的button,每次落子后改变回合数。
接下来我们实现Reset()函数:

void reset()
    {
        turn = 1;//回合计数器,初始设为O的回合。
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                state [i, j] = 0;
            }
        }
    }

将这个函数放到start()中,让程序在一开始运行时初始化棋盘。
接下来我们实现判断函数check():

int check()
    {
        for (int i = 0; i < 3; i++) {
            if (state [i, 0] != 0 && state [i, 0] == state [i, 1] && state [i, 1] == state [i, 2])
                return state [i, 0];
        }
        for (int i = 0; i < 3; i++) {
            if (state [0, i] != 0 && state [0, i] == state [1, i] && state [1, i] == state [2, i])
                return state [0, i];
        }
        int flag = state [0, 0];
        int flag2 = state [0, 2];
        for (int i = 0; i < 3; i++) {
            if (state [i, i] != flag && state [i, 2 - i] != flag2)
                return 0;
        }
        if (flag == state [2, 2])
            return flag;
        else
            return flag2;
    }

采用枚举的方法判断每行,每列,每条对角线是否为3个相同的值。
最后,我们实现OnGUI函数,在实现这一函数前,我们需要具备几个与GUI有关的知识:

GUI.Box(new Rect(596, 100, 160, 350), "");//用于在GUI层上创建框架容纳包括文本,图片等元素。
GUIStyle style = new GUIStyle ();//用于改变默认GUIStyle的字体颜色,大小等属性。
GUI.Button (new Rect (x, y, width, height), String string, GUIStyle)//创建一个按钮,包括位置,大小,内容等属性,返回Boolean值表示当点击时返回true,否则返回false。
GUI.Label (new Rect (x, y, width, height), String string, GUIStyle);//Label控件(标签控件)以文本的形式来显示一串字符串信息,该控件不仅可以输入字符串信息,还可以输入贴图。

现在我们可以设计GUI了:
先建立变量result=check(),然后判断当result=1时为O赢,=2时为X赢,而平局的判定我是用遍历数组看看是否所有的棋格都已落子,若都已落子则判断为平局。
落子阶段使用循环查找空的棋格落子并且判断回合数。
具体代码如下:

void OnGUI()
    {
        GUI.Box(new Rect(596, 100, 160, 350), "");
        GUIStyle style = new GUIStyle ();
        style.normal.textColor = new Color (46f / 256f, 163f / 256f, 256f / 256f);
        style.fontSize = 24;
        if (GUI.Button (new Rect (625, 380, 100, 50), "reset")) {
            reset ();
        }
        int result = check ();
        if (result == 1) {
            GUI.Label (new Rect (630, 300, 100, 50), "O win!!!", style);
        } else if (result == 2) {
            GUI.Label (new Rect (630, 300, 100, 50), "X win!!!", style);
        }
        int flag = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (state [i, j] == 0)
                    flag = 1;
            }
        }
        if (flag == 0) {
            GUI.Label (new Rect (650, 300, 100, 50), "平局", style);
        }
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (state [i, j] == 1) {
                    GUI.Button (new Rect (i * 50+600, j * 50+100, 50, 50), "O");
                }
                if (state [i, j] == 2) {
                    GUI.Button (new Rect (i * 50+600, j * 50+100, 50, 50), "X");
                }
                if (GUI.Button (new Rect (i * 50+600, j * 50+100, 50, 50), "")) {
                    if (result == 0) {
                        if (turn == 1)
                            state [i, j] = 1;
                        else
                            state [i, j] = 2;
                        turn = -turn;
                    }
                }
            }
        }
    }

到这一步基本完成了井字棋的设计了,再把脚本挂到一个空对象上就可以了。之后我添加了小小的背景音乐,具体操作就是在main camera的Audio source属性的Audio clip中添加音乐即可,当然,前提是音乐要传到asset文件夹中。
成果图:
这里写图片描述
以上是本人的初代版本。
接下来是单人模式,我设置了先手和后手模式,整体框架不变,只是添加了三个函数分别为:

void robotWin();//检测电脑怎么走才能赢
void playerWin();//检测电脑怎么走才能防止玩家赢
void randomStep();//在无法预测下一步输赢时候的走法

在两个检测函数中我都是通过枚举与循环交替使用进行检测,具体顺序是检测两条对角线,每行,每列。
之后是先后手模式下的设置,我通过设置一个按钮改变回合数以检测先后手。

if (GUI.Button (new Rect (500, 100, 80, 50), "后手")) {
            if (turn_flag == 0)
                turn = -1;
            turn_flag = 1;
        }

效果图:
这里写图片描述
由于代码过长就不列出来了,具体请上本人的github井字棋人机版

用unity3D做一个简单的2D井字棋游戏 Unity3D制作2D井字棋 因为刚入门比较笨,所以一开始,是自己先手动建立一个九方格,如图 这里采用2D视图,因为毕竟是一个2D游戏。 然后,9个立方体排好后,命名如右图 接着,编写一个hit脚本,来处理简单的点击事件。 这里的C#代码用到几个全局变量如图 因为,新手,对unity的一些update,start运用不是很娴熟 这里按照自己的逻辑设计代码,在我的代码里 阅读详情

相关推荐

离散仿真引擎基础——井字棋

简答题 解释游戏对象(GameObjects)和资源(Assets)的区别与联系。 对象:对象直接出现在游戏场景中,是资源整合的具体表现,对象一般有玩家,敌人,游戏场景,摄像机等虚拟父类,这些父类没有实例化,而他们的子类实例化并包含了这些游戏对象,我们可以对这些对象进行操作。 资源:资源可以是我们自定义或下载下来的素材,可以被多个对象使用,有些资源可以做为模板并实例化为对象。资源文件夹(Asse...

Jenny_Shirunhao的博客 717

基于Unity设计的井字棋小游戏

编程实践,小游戏井字棋,有ESC的概念,展示逻辑与业务逻辑要分开3D作业评分指标:ECS的基本理念要在实验报告中体现。一个具体指标就是OnGUI代码少。

毕业作品网站 1065

unity-3d离散仿真引擎基础

作业内容 简答题 解释游戏对象(GameObjects) 和 资源(Assets)的区别与联系。 - 游戏对象: 游戏对象是直接出现在场景Scene中,是资源整合的具体表现,游戏中的所有对象本质上都是游戏对象。 - 资源:资源可以是我们自定义或下载下来的素材,可以被多个对象使用,有些资源可以做为模板并实例化为对象。 - 联系:资源可以作为模板创建游戏对象,游戏对象可以作为资源保存。 下...

weixin_37863947的博客 481

unity井字棋

unity 井字棋游戏

cuihuanxi的博客 282

飞机井字棋

Unity3D是由Unity Technologies开发的一个强大的游戏引擎。Unity3D具有入门快,操作方便,开发迅速等特点同时支持开发3D和2D游戏,使得开发游戏门槛大大降低。本次源码根据井字棋游戏改编而成,加入飞机的元素,并且有一定的AI技术,是一款新的井字棋游戏,可以直接导入Unity运行。

基于强化学习的井字棋

语言是用python,窗体基于tkinter,算法基于强化学习,采用最简单的qLearing 基本思想参考博客https://blog.youkuaiyun.com/JerryLife/article/details/81385766 注释编码是gbk,若编码乱码,注意更改编码格式

用Unity3D实现简单的井字棋小游戏

用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private const int NOPLAYER = 0; // 0代表这个棋格没有玩家 private const int PLAYER1 = 1; // 1代表玩家1占据这个棋格 private const int PLAYER2 = 2; // 2代表玩家2占据这个棋格 /* 整个游戏需要用到的逻辑控制变量 *

StuGeek的博客 2242

C语言实现井字棋

可以联机对战的井字棋 C语言小程序 对C库socket的简单应用

Unity 3D游戏编程与设计-井字棋

技术基础: 本此实践主要使用unity 自带的即时模式GUI(IMGUI)完成游戏设计。IMGUI是Unity主要基于GameObject的UI的完全独立功能系统, 是一个代码驱动的GUI系统。它通过在任何实现它的脚本上调用OnGUI函数来驱动。例如,下面代码: void OnGUI() { if (GUILayout.Button("Press Me")) Debug.Log("Hell...

Zhaomy8的博客 809

Unity围棋项目源码

包含围棋的基本步骤, 吃子、打劫、上一步下一步。 可以用于布局死活的研究。

三子棋(井字棋)C#程序

这是我用C#实现的一个三子棋的小程序,在VS2005上开发的。包括可运行的程序,和必要的注释。

Unity3D 实践学习1 GUI井字棋的实现

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是我学Unity3D的第一个小游戏,挺简单的,代码量也不多,参考博客是 UNITY3D学习(1)之GUI井字棋。对于Unity3D,想必大家都比较熟悉了的,我就不多作介绍了。需要了解Unity3D的,可以去这个博客——【Unity3D入门教程】Unity3D简介、安装和程序发布。 &nbsp;&nbsp;&nbsp;&nbsp;&nb...

ShenDW818的博客 752

别再乱点U盘里的.exe了!手把手教你清除‘Usb Disk.exe’病毒并恢复隐藏文件

本文详细介绍了如何识别和清除U盘病毒(如Usb Disk.exe),并提供从终止病毒进程到恢复隐藏文件的完整步骤。通过禁用自动播放、清理注册表和使用命令行工具,帮助用户彻底清除病毒并预防未来感染,确保数据安全。

weixin_42530732的博客 591

Unity 3D游戏开发学习笔记(1) 井字棋

第一次用Unity 3D写游戏,做了个井字棋。 由于不熟悉onGUI()和C#,参考了师兄的笔记。代码实际上很简单,逻辑也简单,主要是通过这个小游戏来熟悉一下Unity 3D的一些基本操作实现,比如OnGUI()的原理,实际上这里面的Button并不是点击触发的效果,而是每一帧都在发生改变,因此这里Button实际上是不断重叠制造的吧。(显然变深色了),我感觉这样的做法不太好,但暂时不知道怎么

没有标题 705

ANSYS HFSS 中的相控天线阵列仿真方法

相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境(即附近的天线)和平台对其性能的影响。本博客介绍了可用于有效仿真相控天线阵列的不同方法。以下是不同仿真方法的简要概述,视频链接中提供了完整的演示。ANSYS HFSS 提供 4 种不同的相控天线阵列仿真方法:1) 晶胞-无限阵列。

jkh920184196的博客 4253

睿尔曼复合机器人之底盘操作流程

控制键”按下后,可在键盘上通过‘i’(向前),‘k’(向后),‘j’(向左旋转),‘l’(向右旋转)四个按键对底盘进行运动控制。选中禁⾏线功能后,使⽤⿏标在界⾯内点击选择起点,继续在其他地⽅点击,两点之间会连成⼀条线,可以进⾏多次连续点击,形成连续线条。4)扫图完成后,软件会重新启动,返回到监控页面,点击“激光”可看到当前机器激光扫描的实时数据,在页面上表现为红色边界线,点击菜单栏“控制”键使底盘在一定范围内运动,扫描到尽可能多的边界线,可发现与实际地图的黑色边界线不同,需要进行手动校正。

realman_Rop的博客 1474

unity3d(人机博弈,棋类相关)

2018/08/26,主要是一个井字棋的实现(人人版),代码用的是c#  /*不带AI,版本1.0beta*/ using UnityEngine; using System.Collections; public class Chess : MonoBehaviour { private int turn = 1;//规定是谁的回合,1代表对手,-1代表自己 private int[,...

Every Master was once a disaster or beginner. 1512

手把手教你配置微信商户平台IP白名单:企业付款到零钱必备步骤

本文详细解析了微信商户平台IP白名单的配置原理与实操步骤,这是实现企业付款到零钱功能的关键安全环节。文章从理解IP白名单的安全逻辑出发,指导开发者精准定位服务器公网IP,并提供了在商户平台后台的详细配置流程与常见问题排查指南,帮助开发者高效完成配置,确保企业付款API的顺利调用。

weixin_29326909的博客 737

unity3D入门-制作简单计算器

通过对井字棋代码的学习,了解 OnGUI() 事件,提升阅读 API 文档能力,在编写代码时能运用数据-控制分离的编程思维,现在尝试参考“井字棋”案例,制作一个简单的计算器。代码需要实现的内容有:最基本的加减乘除运算。编写完脚本代码后,创建一个空的模型(Create Empty),命名为int,将calculator.cs拖动到init上面。小结:计算器逻辑简单,适合进行初步上手,用于熟悉C#的编码,锻炼数据-控制分离的编程思维。首先创建一个3D工程项目,再在Assets中创建一个脚本,命名为cal。

m0_56138124的博客 401

Linux新手必看:FinalShell连接不上?从检查IP到配置固定地址的完整排错指南

本文为Linux新手提供了FinalShell连接失败的完整排错指南,涵盖IP检查、SSH服务状态、防火墙配置和静态IP设置等关键步骤。通过详细的命令行操作和配置示例,帮助用户快速解决远程连接问题,提升Linux使用效率。

weixin_30675247的博客 753

【Altium designer】如何添加过孔阵列

按下图1指示,执行【Tool】菜单栏下【Via Stitching/Shielding】选项卡中的【Add Stitching to Net...】选项 图1 “添加过孔阵列”选项 点击【Add Stitching to Net...】选项后,会跳出一个窗口,让我们设置过孔阵列的参数信息,如下图2所示。 图2 过孔阵列参数设置 过孔阵列区域:勾选该选项框,即可绘制多边形区域; 过孔内径与焊盘直径:比如内径 【Hole Size】设为12mil,焊盘直径【Diameter】设为24mil; .

夜半少年的博客 2万+

Unity-3D-H2

1、简答题【建议做解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。   游戏对象:直接出现在游戏的场景中,是资源整合的具体表现,对象通过层次结构来组织,通过整体-部分的关系构成层次结构。资源:资源通过文件夹的形式组织,包含常用的图像,视频,脚本文件,预制文件等等,可以被一个或者多个对象使用。 下载几个游戏案例,分别总结资源、对象组织...

weixin_38168484的博客 307

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(三)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)A.错误B.正确参考答案:BA.getB.try_getC.peekD.put参考答案:B。

qq_42135020的博客 1917

php 井字棋,Unity3D 井字棋

Unity3D 井字棋今天第一次Unity实战,先用GUI写个井字棋的小游戏。先上成品图:首先创建c#脚本,添加GUI方法。此时考虑到要记录九宫格每个位置的状态以及此时是谁在点击,所以创建两个私有变量。private int count = 0;private int[,] map = new int[3, 3];OnGUI函数在每帧被调用,每次调用OnGUI函数时,先调用Check()函数判断是...

weixin_30293523的博客 187

WIFI和BT测试(射频工程师)

买不了吃亏买不了上当,我卖的是技能,你收获的是经验。

m0_58834499的博客 599

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Unity编程实战——井字棋 TicTacToe

项目地址 TicTacToe 完成效果图 使用AI有些不恰当的是AI是无智能的随机下棋。 Turns下面的蓝点表示该哪名玩家 下棋,Reset重置,Result显示结果Ai 按钮代表下一步棋AI会随机下一步,如果已经分出胜负的话这个按钮就没用了。 私有成员变量: private int turn = 1; //1 - Player 1, 0 - Player 2 ...

Peanut的3D游戏学习记录 1553

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Unity3d离散仿真引擎基础
下一篇: Unity3d空间与运动
hellowangld
博客等级 码龄10年 15粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellowangld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值