成品展示

这里写图片描述

实现

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];//3x3棋盘

    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;//默认玩家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;
    }

}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐