成品展示
实现
OnGUI
-
OnGUI()函数可以在每帧调用,利用它不断渲染button构造3x3棋盘并且判断游戏状态。
Button
-
使用GUI.Button()方法添加按钮,当该方法返回true时,表示按钮被按下了,这样我们就可以在按钮点击后作出相应记录和显示操作。
思路
-
每一帧都用button渲染出3x3的棋盘,用一个3x3数组记录落子状态。
-
在OnGUI函数中先检测游戏状态,若未分胜负,则根据数组记录继续渲染出button以及button应该显示的棋子(空表示未下子,O或√分别表示两个玩家)。
-
游戏状态判断,3行3列2斜行,直接遍历棋盘判断,有3个棋子相同则分出胜负,若下子数目达到9而还不出胜负则平局。
完整代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playGame : MonoBehaviour {
private static int player;
private static int count;
private int winner;
private int[,] chessBoard = new int[3, 3];
void Start () {
Restart();
}
void OnGUI()
{
GUI.Box(new Rect(225, 25, 200, 300), "");
if (GUI.Button(new Rect(275, 250, 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;
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;
}
}