本来拿gui来做游戏蛮怪的,但这却是一个熟悉gui的不错的途径。今天我就学着使用GUI.Button做了一个十分简单的井字棋游戏。上个成品图:

首先创建一个C#脚本文件,去掉Update方法,因为这里我不会用到它。然后添加OnGUI方法。声明两个私有变量,一个用来记录是谁的回合, 假定turn为1是圈圈的回合,turn为-1是叉叉的回合。另一个变量为3*3的二维数组,用来记录当前九宫格的状态,假定1代表格子里是圈圈,2代表格子里是叉叉。函数reset用来初始化个参数,在脚本被调用时(Start)执行一次。

using UnityEngine;
using System.Collections;public class NewBehaviourScript : MonoBehaviour {private int turn = 1;    //记录是谁的回合private int[,] state = new int[3,3];  //九方格数据//参数初始化void Start() {reset();}void OnGUI() {}//重置参数void reset() {turn = 1;for (int i=0; i<3; ++i) {for (int j=0; j<3; ++j) {state[i,j] = 0;}}}
}

接着在OnGUI里面用一个两重循环添加出九宫格Button。为了让button点击时能发生变化(修改button的text),开始我以为能通过获得button的对象,然后通过对象的OnClick事件来处理,但查阅了资料发现几乎不可能做到,后来发现OnGUI类似一个绘图的方法,每一帧都会清理掉上一帧的所有对象,即刷屏。因此必须另外想办法。而这个办法便是使用state二维数组记录九宫格的状态。除此之外,必须添加一个check方法来决定游戏是否结束,一旦游戏结束,那么就需要一个Label来显示游戏结果,并且不再允许玩家点击Buttons。Reset按钮可以重置游戏,即调用reset方法。

void OnGUI() {if (GUI.Button(new Rect(20,300,100,50),"Reset"))reset();int result = check();  // 返回0代表游戏没有结束,1代表圈圈赢,2代表叉叉赢。if (result==1) {GUI.Label(new Rect(50,230,100,50),"O wins!");}else if (result==2) {GUI.Label(new Rect(50,230,100,50),"X wins!");}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,j*50,50,50),"O");if (state[i,j]==2)GUI.Button(new Rect(i*50,j*50,50,50),"X");if(GUI.Button(new Rect(i*50,j*50,50,50),"")) {if (result==0) {if (turn == 1)state[i,j] = 1;elsestate[i,j] = 2;turn = -turn;}}}}}

查看游戏是否结束,无非就是看有没有连成一线的圈圈或者叉叉。粗暴一点的办法就是列出所有可能的情况,简单一点的就可以使用循环,先横向一排排看过去,再纵向一列列看过去,有一样的非零状态就直接返回该状态即可。最后再看看斜向的两种情况,一样且非零的话直接返回中间交点的状态值就可以了。

//判断游戏结束条件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 j=0; j<3; ++j) {if (state[0,j]!=0 && state[0,j]==state[1,j] && state[1,j]==state[2,j]) {return state[0,j];}}//斜向连线if (state[1,1]!=0 &&state[0,0]==state[1,1] && state[1,1]==state[2,2] ||state[0,2]==state[1,1] && state[1,1]==state[2,0]) {return state[1,1];}return 0;}

好了,井字棋游戏就做好了,本来我还想加个AI,思路挺简单的,在玩家每次点击一个按钮后,首先检查自己有没有赢的可能,再判断玩家有没有赢的可能,有的话直接封住,没有的话优先给自己创造机会。不过想想井字棋9个格就那几种走法,会玩的最后肯定打平,除非要做一个几乎没有边界的棋盘,不过那AI就没那么简单了。最后上一个完整的代码,代码直接作为组件挂载在主摄像机上就能跑了。

using UnityEngine;
using System.Collections;public class jingziqi : MonoBehaviour {private int turn = 1;  //记录是谁的回合private int[,] state = new int[3,3];  //九方格数据//参数初始化void Start() {reset();}void OnGUI() {if (GUI.Button(new Rect(20,300,100,50),"Reset"))reset();int result = check();if (result==1) {GUI.Label(new Rect(50,230,100,50),"O wins!");}else if (result==2) {GUI.Label(new Rect(50,230,100,50),"X wins!");}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,j*50,50,50),"O");if (state[i,j]==2)GUI.Button(new Rect(i*50,j*50,50,50),"X");if(GUI.Button(new Rect(i*50,j*50,50,50),"")) {if (result==0) {if (turn == 1)state[i,j] = 1;elsestate[i,j] = 2;turn = -turn;}}}}}//重置参数void reset() {turn = 1;for (int i=0; i<3; ++i) {for (int j=0; j<3; ++j) {state[i,j] = 0;}}}//判断游戏结束条件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 j=0; j<3; ++j) {if (state[0,j]!=0 && state[0,j]==state[1,j] && state[1,j]==state[2,j]) {return state[0,j];}}//斜向连线if (state[1,1]!=0 &&state[0,0]==state[1,1] && state[1,1]==state[2,2] ||state[0,2]==state[1,1] && state[1,1]==state[2,0]) {return state[1,1];}return 0;}
}

在学习Unity自带的GUI过程中,我发现大家普遍提倡使用Unity的第三方库NGUI来代替GUI,看来NGUI更适合实际的游戏开发。

Unity3D学习笔记(2)——用GUI制作井字棋游戏相关推荐

  1. Python基础编程案例:简单的井字棋游戏设计与制作

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 前言 python井字棋游戏虽然看上去非常简陋,但是却非常值得学习. 先看怎么玩 ...

  2. php井字游戏,python实现井字棋游戏

    #本游戏python3.4.0下编写调试,只能在windows下运行. import random import subprocess import time #定义函数 def draw_board ...

  3. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  4. C++井字棋游戏,DOS界面版

    据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /*N字棋游戏PVP版,DOS版本 ...

  5. python井字棋ai_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  6. React官网的井字棋游戏

    React官网的井字棋游戏 这个是我在官网再次复习这个小游戏时梳理的一些思路,其中也包含了我在尝试时出的一些bug 文章目录 React官网的井字棋游戏 1.整体分析项目 2.为变量添加state并绑 ...

  7. python井字棋游戏大作业实验报告_Part 1.2 - 实现一个井字棋游戏的gym环境

    上文已经描述了怎么创建和注册一个自定义的gym环境.但是环境类中的4个函数都是空的,本文将描述怎么实现那4个函数,实现一个完整的井字棋游戏的环境. 游戏规则:两个玩家在3x3的棋盘上,一方执X,一方执 ...

  8. python井字棋_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  9. 用JavaFX写的井字棋游戏

    用JavaFX写的井字棋游戏 游戏界面 未来改进之处:(有时间的话也许会回来优化吧 )(论鸽子的自我修养) 算法提升: 判断是否填满棋盘的方法可以改进为计数的方法 判断是否赢得比赛得方法可以改进为最后 ...

最新文章

  1. 巨大的需求之下 人工智能如何更快落地?
  2. 手把手教你用Keras进行多标签分类(附代码)_数据派THU-CSDN博客 (翻译:程思衍校对:付宇帅)
  3. JavaScript 判断对象中是否有某属性
  4. 【算法】Hash实现环形链表【LeetCode】
  5. 防止头文件重复包含之pragma once与#ifndef
  6. linux c 程序崩溃日志,C:Linux:调用write()时TCP / IP程序崩溃
  7. 企业实战|Mysql不停机维护主从同步
  8. 多项目加载顺序修改_面试官:Java 类在 Tomcat 中是如何加载的?
  9. BS架构和CS架构的区别
  10. 小白如何搭建自己的网络服务器
  11. Android 蓝色光滤波器(护眼神器) 反编译
  12. 禁止iphone浏览器拖动反弹(橡皮筋效果)
  13. 【IP协议(一)】——IP数据报格式及其含义,IP数据报的切分
  14. python生成word文档_python实现的生成word文档功能示例
  15. 2021-08-10第一章绪论1.1统计学与医学统计学
  16. x79主板配什么cpu好 x79主板组装电脑教程
  17. luogu2657-Windy数题解--数位DP
  18. Arch Linux控制台字符间距变大
  19. ASP.NET Web API入门介绍(一)
  20. 移轴镜头摄影计算机作业模板,梦寐以求的移轴效果,被我用50mm定焦镜头实现了,简单易学出效果...

热门文章

  1. potplayer插件_Potplayer 百度在线翻译插件
  2. web平台安装程序_工商银行打造在线诊断平台的探索与实践
  3. WIN10上IPFS的简单使用(2021版)
  4. 一键下载:将知乎专栏导出成电子书
  5. 老板给了你1000张美女model照片,让你选5位出来参加展会,请问你如何选
  6. 巧用二分法实现数学开方(sqrt)运算
  7. dd if=/dev/zero of=的含义是什么?Linux 下的dd命令使用详解
  8. 倍福TwinCAT(贝福Beckhoff)应用教程11.1 TwinCAT应用小程序1 贝福IO模块介绍
  9. 三八节送女生什么礼物好?四款好看的蓝牙耳机推荐
  10. Canvas API