IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity编程实践-井字棋 -> 正文阅读

[游戏开发]unity编程实践-井字棋

游戏要求

游戏内容:井字棋

技术限制: 仅允许使用 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()函数来初始化棋盘及一些变量
restart

OnGUI()函数为制作UI的函数

首先,选取合适的位置,合适的大小画出棋盘

GUI.Box(new Rect(225, 25, 200, 300), "");

然后也选取合适的位置,合适的大小画出重置按钮“Restart”

if (GUI.Button(new Rect(275, 225, 100, 50), "Restart")) Restart();

棋盘初始化后如图

chess

然后利用for循环画出在游戏过程中棋盘每个位置的值及棋盘当前进行游戏的情况。chessBoard数组中,0代表该位置没有值,1代表该位置为“O”,2代表该位置为“X”。

for

最后的GameOver()函数来实现井字棋的逻辑,通过枚举获胜的各种情况来判断这次棋局最后的情况。

首先是一行或一列连成一线的情况,这两种情况类似,比如行的情况,每一行查看是否三个方格是否棋子一样,若一样则说明分出了胜负

rowcol

对角线获胜的判断分为两种,包括正对角线和反对角线。

duijiaoxian

最后是获胜玩家或游戏平局的显示

shuying

如图

win

演示视频链接

视频链接: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;
    }

}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-23 11:46:48  更:2021-09-23 11:48:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 4:34:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码