资源下载地址:https://download.csdn.net/download/sheziqiong/86871335
资源下载地址:https://download.csdn.net/download/sheziqiong/86871335

Unity设计的井字棋小游戏

作业要求

编程实践,小游戏

  • 游戏内容: 井字棋 或 贷款计算器 或 简单计算器 等等
  • 技术限制: 仅允许使用 IMGUI 构建 UI
  • 作业目的:
    • 了解 OnGUI() 事件,提升 debug 能力
    • 提升阅读 API 文档能力

井字棋,有ESC的概念,展示逻辑与业务逻辑要分开

3D作业评分指标:ECS的基本理念要在实验报告中体现。一个具体指标就是OnGUI代码少

项目文档

游戏说明

这是一个在Unity3D上,使用IMGUI做的一个井字棋小游戏,界面上参照网站 https://playtictactoe.org/。

游戏具备双人模式和人机模式,通过点击右下角的小人图标即可转换模式,通过点击右下角的刷新图标可以重新开启一盘棋,先后手会随着游戏的进行而来回转变,战绩显示在右中间一栏,为"O胜局:平局:X胜局"。

ECS

  • 实体: 唯一的游戏对象Tictactoe。

  • 组件: Prefabs文件夹里的图标文件和声明样式的GUISkin文件。

  • 系统: Scripts文件夹里的四个C#文件 TheGame、ChessBoard、Player、Robot,负责处理游戏逻辑。

游戏效果

  • 双人模式(可以看到连成一线的一方棋子会被高亮)

  • 单人模式

UML类图

UML类图如下所示,游戏有四个类组成,其中TheGame是主类。

项目配置

游戏搭建过程:

  1. 创建一个Unity 2D项目 Tictactoe

  2. 右键创建一个空的游戏对象 Tictactoe

  3. 在资源区(Assets)创建一个文件夹 Prefabs,并将所有图片资源拖进去(备注:所有资源已打包到Gitee仓库)

  1. 在资源区创建一个文件夹 Scripts,将所有C#文件拖进去(TheGame,Player,Robot,ChessBoard类)

  1. 创建一个GUISkin,配置TheSkin,配置内容如下:(背景:资源文件Black,文字颜色:白, 字体大小:20+)

    Box Button Label

  1. 点击游戏对象Tictactoe,将The Game类拖给该对象,然后按照如下方式配置The Game脚本里的所有GUISkin和Texture2D

注意不要忘记配置GUIStyle White Background,展开White Background并将GreyWhite拖入即可,如下所示

  1. 配置完成后的资源文件如下,点击运行即可开始游戏

OnGUI逻辑说明

  • OnGUI()函数在每一帧都会调用,用于刷新游戏界面。在下面代码中,该函数负责整个游戏界面的布局,和游戏主要逻辑函数的调用。

    • 界面布局包括:背景板、棋盘、标题、更新按钮、变换模式按钮
    • 游戏逻辑大体是:下棋 - 判定,相关函数如下:
      • robotAction():如果是在人机模式下机器人的回合,机器人会决定下一步要走的棋子并推进游戏过程,在其他状态下不进行操作
      • chessBoradUpdate():生成棋子,并接受玩家的点击事件
      • gameCheck(): 进行胜负判定,如果有一方获胜或平局则锁定棋盘
    • 在IMGUI设计上,使用成组(BeginGroup/EndGroup)来生成相对位置简化各个组件的定位
void OnGUI(){GUI.skin = customSkin;// Generate GamePadGUI.Box(new Rect(0, 0, Screen.width, Screen.height), ""); // Full Screen Game PadGUI.BeginGroup(new Rect(Screen.width * 0.5f - 300, Screen.height * 0.5f - 200, gamePadWidth, gamePadHeight));GUI.Box(new Rect(padding + 2, padding + 2, 3 * chessSideLength - 4, 3 * chessSideLength - 4), "", whiteBackground); // 棋盘robotAction(); // 机器人回合:机器人下棋chessBoardUpdate(); // 显示棋子 + 玩家回合:玩家下棋gameCheck(); // 判定胜负GUI.Label(new Rect (2 * padding + 3 * chessSideLength, padding, 150, 100), "The Game"); // 游戏TitlegradeLabelUpdate(); // 更新比分表GUI.BeginGroup(new Rect(2 * padding + 3 * chessSideLength, padding + 200, 150, 100));setResetButton(); // Reset Button: 重新开启一盘棋setGameModeButton(); // Game Mode Button: 更改游戏模式 - 人机/双人GUI.EndGroup ();GUI.EndGroup ();
}

Robot的算法说明

众所周知,井字棋是一个先手必不输,后手必不赢的游戏,下面算法纯属是我脑洞,机器人也有可能会输(不然谁还愿意玩呢)。

  1. 敌方棋子赋予权值-50,右方棋子赋予权值60,空位置权值为0。
  2. 井字棋的赢法共有8种:横横横竖竖竖撇捺,每次在下棋前计算每一种赢法对应的位置棋子的权值之和的绝对值
  3. 每一个空位置的优先级等于与它相关的赢法的权值的最大值。(例如最左上的位置,与他相关的赢法由最上一横和最左一竖)
  4. 找到一个最大优先级的空位置,作为Robot下棋的位置。

举例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XvhQjh5i-1662706285215)(image/Robot.png)]

O是玩家,X是机器人,下棋顺序是 O[1,1] -> X[2,0] -> O[2,1],现在第四回合,轮到机器人下棋:

权值矩阵是:[[0,0,0],[0,-50,0],[60,-50,0]]

赢法矩阵是:[0,50,10,60,100,0,50,10] (横,横,横,(从左到右)竖,竖,竖,(从上到下)捺,撇)

优先级矩阵是:[[60,100,10],[60,0,50],[0,0,60]]

故选择位置[0,1]作为下一步棋。

资源下载地址:https://download.csdn.net/download/sheziqiong/86871335
资源下载地址:https://download.csdn.net/download/sheziqiong/86871335

基于Unity设计的井字棋小游戏相关推荐

  1. 基于vue框架使用canvas实现井字棋小游戏

    引言:最近实现了一个图片上传压缩的功能,使用了canvas,所以学习一下canvas的语法,实现一个井字棋小游戏,这个小游戏可以人人对弈,如果大家有兴趣,可以对代码进行迭代,比如采用极大值极小值搜索法 ...

  2. 用Unity3D实现简单的井字棋小游戏

    用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private co ...

  3. python井字棋_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  4. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  5. python井字棋_python实现井字棋小游戏

    本文为大家分享了python实现井字棋小游戏,供大家参考,具体内容如下 周五晚上上了python的选修课,本来以为老师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前 ...

  6. 井字棋小游戏代码(Visual Studio)

    #include<graphics.h> #include<conio.h> #include<iostream> #include "ImagePng. ...

  7. python如何在前面加井_python入门之井字棋小游戏

    引言: 刚学python好几天了,从java到python,基础学起来确实比较容易,语法掌握,基本概念上都比较容易入脑. 唯一比较郁闷的是老想着用java的语法去学python代码,这点还需要后面慢慢 ...

  8. python井字棋小游戏代码_python实现井字棋小游戏

    本文为大家分享了python实现井字棋小游戏,供大家参考,具体内容如下 周五晚上上了python的选修课,本来以为老师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前 ...

  9. C语言初学——井字棋小游戏

    hello呀!小伙伴们,今天小刘同学要带着大家学习的内容是--井字棋小游戏!!! 在本次学习中,我们将会运用到的主要内容是数组,函数,循环和判断. 当然,本次学习的内容并不困难,希望本次教学结束大家都 ...

最新文章

  1. python 获取当前class名和方法名
  2. python的windows出现问题_Windows下使用python库 curses遇到错误消息的解决方案
  3. jsoup HTML parser hello world examples--转
  4. SpringMVC的表单标签库
  5. webGIS(离线版)研究路线归总
  6. SQL之SELECT语句执行顺序及子句功能
  7. C++子类父类构造函数的关系
  8. [USACO]地震 (二分答案+最优比率生成树详解)
  9. 2018年度计算机视觉GtiHub top开源项目!
  10. Java-Exception异常
  11. ubuntu18.04虚拟机突然连不上网
  12. 计算机算法设计与分析 最长递增子序列
  13. 机器翻译先驱 Jaime Carbonell 去世,创立卡内基梅隆大学语言技术学院
  14. 《Arduino实战》——1.7 为代码编写注释
  15. MySQL · 答疑解惑 · MySQL Sort 分页
  16. java识别图片验证码_JAVA---获取图片验证码
  17. DUKE大学BOE数据集 OCT图像积液分割/层分割数据集
  18. srt字幕怎么导入视频 (视频字幕合并教程)
  19. R语言|forest plot
  20. 胡伟立-孤独[影视配乐扒曲]

热门文章

  1. python定时器库_python定时器示例代码
  2. 点焊机器人焊接超时_焊接机器人常见故障原因及解决措施
  3. 实现ChatGPT项目(可商用:web端、接入qq群、公众号、企业微信)
  4. 缅怀TOC理论的创建者高德拉特先生
  5. 论文学习:CAC模型
  6. 轻量级私有云解决方案
  7. CSharp与Python中的输入输出语句对比
  8. t检验.医学统计实例详解
  9. 亚马逊商品详情API接口-(item_get-获得AMAZON商品详情接口),亚马逊详情API接口
  10. 十分钟看懂语义分割技术【转载】