游戏要求
游戏内容:井字棋
技术限制: 仅允许使用 IMGUI 构建 UI
作业目的:了解 OnGUI() 事件,提升 debug 能力;提升阅读 API 文档能力
项目的配置
此次项目的实现主要是利用c#代码
首先建立一个3d物体 ,取名为cube,再通过创建一个c#代码块并拖到到Assert上实现相应功能。
接下来介绍c#代码块的具体实现:
实现过程和方法(算法)
井字棋游戏首先需要初始化棋盘,将棋盘分为9个小方格,小方格上内容清空实现初始化。棋盘的初始化及后面的棋子的摆放需要用到GUI的Box和Button函数,在指定位置按键即为在该方格落下棋子。
此时,井字棋游戏包括两个玩家,在这里记为玩家1和玩家2,玩家1的棋子用“O”代表,玩家2的棋子用“X”代表,默认玩家1为先手。
游戏实现的关键在于判断游戏是玩家1获胜,玩家2获胜还是平局。该游戏判断的依据是玩家1玩家2谁先在9宫格棋盘上实现某一行或某一列或对角线上自己的棋子连成一线,则该玩家获胜,若在9宫格全部有了棋子且无人先连成一线,则说明该局为平局。这一步可以通过枚举各种情况,利用if else语句实现。
变量声明
在ChessClass类中,需要声明的变量有:
private static int player;
private static int count;//落子数目
private int winner;//记录胜者
private int[,] chessBoard = new int[3, 3];//3x3棋盘
player用来指代棋手,count用来计算现在总共落子的数目,winner用来记录获胜选手,chessBoard数组用来存放九宫格棋盘
重要函数
在ChessClass类中:
Start()函数调用restart()函数来初始化棋盘及一些变量
OnGUI()函数为制作UI的函数
首先,选取合适的位置,合适的大小画出棋盘
GUI.Box(new Rect(225, 25, 200, 300), "");
然后也选取合适的位置,合适的大小画出重置按钮“Restart”
if (GUI.Button(new Rect(275, 225, 100, 50), "Restart")) Restart();
棋盘初始化后如图
然后利用for循环画出在游戏过程中棋盘每个位置的值及棋盘当前进行游戏的情况。chessBoard数组中,0代表该位置没有值,1代表该位置为“O”,2代表该位置为“X”。
最后的GameOver()函数来实现井字棋的逻辑,通过枚举获胜的各种情况来判断这次棋局最后的情况。
首先是一行或一列连成一线的情况,这两种情况类似,比如行的情况,每一行查看是否三个方格是否棋子一样,若一样则说明分出了胜负
对角线获胜的判断分为两种,包括正对角线和反对角线。
最后是获胜玩家或游戏平局的显示
如图
演示视频链接
视频链接:https://www.bilibili.com/video/bv1Gv411A7Az
平台:哔哩哔哩
完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChessClass : MonoBehaviour {
private static int player;
private static int count;//落子数目
private int winner;//记录胜者
private int[,] chessBoard = new int[3, 3];//3x3棋盘
void Start () {
Restart();
}
void OnGUI(){
GUI.Box(new Rect(225, 25, 200, 300), "");
if (GUI.Button(new Rect(275, 225, 100, 50), "Restart")) Restart();
if (!GameOver()) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (chessBoard[i, j] == 0 && GUI.Button(new Rect(250 + j * 50, 50 + i * 50, 50, 50), "")) {
chessBoard[i, j] = player;
player = 3 - player;
count++;
}
else if (chessBoard[i, j] == 1) {
GUI.Button(new Rect(250 + j * 50, 50 + i * 50, 50, 50), "O");
}
else if (chessBoard[i, j] == 2) {
GUI.Button(new Rect(250 + j * 50, 50 + i * 50, 50, 50), "X");
}
}
}
}
}
void Restart() {
player = 1;//默认玩家1先下
winner = 0;
count = 0;
//初始化棋盘
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
chessBoard[i, j] = 0;
}
}
}
bool GameOver() {
for(int i = 0; i < 3; i++) {
//行
if (chessBoard[i, 0] != 0 && chessBoard[i, 0] == chessBoard[i, 1] && chessBoard[i, 0] == chessBoard[i, 2]) {
winner = chessBoard[i, 0];
}
//列
if (chessBoard[0, i] != 0 && chessBoard[0, i] == chessBoard[1, i] && chessBoard[0, i] == chessBoard[2, i]) {
winner = chessBoard[0, i];
}
}
//对角线
if (chessBoard[0, 0] != 0 && chessBoard[0, 0] == chessBoard[1, 1] && chessBoard[0, 0] == chessBoard[2, 2]) {
winner = chessBoard[0, 0];
}
if (chessBoard[0, 2] != 0 && chessBoard[0, 2] == chessBoard[1, 1] && chessBoard[0, 2] == chessBoard[2, 0]) {
winner = chessBoard[0, 2];
}
if (count < 9 && winner == 0) return false;
//有人赢了
if (winner != 0) {
GUI.Box(new Rect(235, 35, 180, 200), "\n\n\nCongratulations!\n Player "+winner+" has won.\nPress Restart to start again.");
}
//平局
else {
GUI.Box(new Rect(235, 35, 180, 200), "\n\n\nA draw.\nPress Restart to start again.");
}
return true;
}
}
|