3D游戏设计(一)井字棋

运行效果:

实现过程


声明变量:

  1. public Texture2D O;
  2. public Texture2D X;
  3. GUIStyle myStyle;
  4. private int turn = 1;
  5. /*记录谁的回合:turn=1为,turn==2为×*/
  6. int[][] board = new int[3][] { new int[3], new int[3], new int[3] };

reset()函数:用于重新开始游戏

  1. /*重新开局*/
  2. void reset() {
  3. turn = 1;
  4. for (int i = 0; i < 3; ++i) {
  5. for (int j = 0; j < 3; ++j) {
  6. board[i][j] = 0;
  7. }
  8. }
  9. Debug.Log("game reset");
  10. }

check()函数:检查游戏是否结束:未结束返回0,O胜利返回1,X胜利返回2,平局返回3。

  1. /*检查胜利条件*/
  2. int check() {
  3. /*横线获胜*/
  4. for (int i = 0; i < 3; i++) {
  5. if (board[i][0] != 0 && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
  6. return board[i][0];
  7. }
  8. }
  9. /*纵线获胜*/
  10. for (int i = 0; i < 3; i++) {
  11. if (board[0][i] != 0 && board[0][i] == board[1][i] && board[1][i] == board[2][i]) {
  12. return board[0][i];
  13. }
  14. }
  15. /*斜线获胜*/
  16. if (board[1][1] != 0 &&
  17. board[0][0]== board[1][1] && board[2][2] == board[1][1] ||
  18. board[0][2] == board[1][1] && board[2][0] == board[1][1]) {
  19. return board[1][1];
  20. }
  21. /*对局还没结束*/
  22. for (int i = 0; i < 3; ++i) {
  23. for (int j = 0; j < 3; ++j) {
  24. if (board[i][j] == 0) return 0;
  25. }
  26. }
  27. /*平局*/
  28. return 3;
  29. }

display_result()函数:显示目前的游戏状态。

  1. /*显示对局情况*/
  2. void display_result(int res) {
  3. int m = Screen.width / 2;
  4. if (res == 0) {
  5. if (turn == 1)
  6. GUI.Box(new Rect(m - 50, 115, 100, 35), "O is going");
  7. else
  8. GUI.Box(new Rect(m - 50, 115, 100, 35), "X is going");
  9. }
  10. else if (res == 1) {
  11. GUI.Box(new Rect(m - 50, 115, 100, 35), "O WIN");
  12. }
  13. else if (res == 2) {
  14. GUI.Box(new Rect(m - 50, 115, 100, 35), "X WIN");
  15. }
  16. else if (res == 3) {
  17. GUI.Box(new Rect(m - 50, 115, 100, 35), "Draw");
  18. }
  19. }

OnGUI()函数:实时渲染,采用预设的O、X图片来表示O、X已经下过的棋子。

  1. void OnGUI() {
  2. int m = Screen.width / 2;
  3. GUI.Box(new Rect(m - 150, 80, 300, 420), "井字棋");
  4. /*如果reset被点击则重开*/
  5. if (GUI.Button(new Rect(m - 50, 160, 100, 35), new GUIContent("Reset", "点击重新开始"))) reset();
  6. GUI.Label(new Rect(m - 150, 170, 150, 35), GUI.tooltip);
  7. int res = check();
  8. for (int i = 0; i < 3; ++i) {
  9. for (int j = 0; j < 3; ++j) {
  10. if (board[i][j] == 1) {
  11. GUI.Button(new Rect(m - 150 + i * 100, 200 + j * 100, 100, 100), O);
  12. }
  13. else if (board[i][j] == 2) {
  14. GUI.Button(new Rect(m - 150 + i * 100, 200 + j * 100, 100, 100), X);
  15. }
  16. if(GUI.Button(new Rect(m - 150 + i * 100, 200 + j * 100, 100, 100), "")) {
  17. if (res == 0) {
  18. if (turn == 1) {
  19. board[i][j] = turn;
  20. turn = 2;
  21. }
  22. else {
  23. board[i][j] = turn;
  24. turn = 1;
  25. }
  26. }
  27. }
  28. }
  29. }
  30. display_result(res);
  31. }

可能存在的问题及解决方案:

可能存在井字棋显示不全的问题,此时把视野调至标准的1024*768即可。

Unity3d 游戏设计(一)井字棋的更多相关文章

  1. JavaFX 井字棋游戏

    利用JavaFX设计一个井字棋游戏,其中包括了能够与玩家对战的AI.AI的实现相比五子棋来说要简单得多,可以保证AI在后手情况下绝对不会输,具体实现如下: /* * To change this li ...

  2. [LeetCode] 348. Design Tic-Tac-Toe 设计井字棋游戏

    Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...

  3. 井字棋游戏升级版 - TopTicTacToe项目 简介

    一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的 ...

  4. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  5. [C++] 井字棋游戏源码

    TicTac.h #define EX 1 //该点左鼠标 #define OH 2 //该点右鼠标 class CMyApp : public CWinApp { public: virtual B ...

  6. [游戏学习22] MFC 井字棋 双人对战

    >_<:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! >_<:注意这里必须用MFC和前面的Win32不一样啦! >_<:这也 ...

  7. [HTML5实现人工智能]小游戏《井字棋》发布,据说IQ上200才能赢

    一,什么是TicTacToe(井字棋)   本 游戏 为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿 ...

  8. python 游戏(井字棋)

    1. 游戏思路和流程图 实现功能,现实生活中的井字棋玩法 游戏流程图 2. 使用模块和游戏提示 import random def game_info(): print('欢迎来到井字棋游戏') pr ...

  9. 『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】

    一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎. ...

随机推荐

  1. 第2章 执行SparkSQL查询

    第2章 执行SparkSQL查询 2.1 命令行查询流程 打开Spark shell 例子:查询大于30岁的用户 创建如下JSON文件,注意JSON的格式: {"name":&qu ...

  2. 思索-js 页面ID识别及数据缓存

    思索-页面ID识别及数据缓存 页面 ID 识别的思路 多页应用在移动端是较为常见的一种架构,它可以和APP 内的 webview 配合,达到类似原生的体验,这一点是单页应用无法做到的(比如手势滑动等, ...

  3. Robot Framework(2)——简单运行案例

    1.打开RIDE 之前介绍的3种方式都可以 2.创建工程和测试套件 1>点击File-New Project ①Name:工程命名 ②Parent Directory:上级目录,工程会创建在这个 ...

  4. Statistics and Samples in Distributional Reinforcement Learning

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1902.08102v1 [stat.ML] 21 Feb 2019 Abstract 我们通过递归估计回报分布的统计量,提供 ...

  5. ubuntu18.04 开机定时启动任务

    1,crontab 格式:M H D m d cmd == 分 时 天 月 周几 命令 参数 : crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑 ...

  6. CF1271C Shawarma Tent 题解

    通过分析样例可以发现,离学校越近的地点经过的路线也会越多,因此我们只要考虑学校周围的八个点即可.而且可以发现,对于一个点,路线会经过这个点的节点是确定的.因此在输入的时候可以统计学校周围八个节点被经过 ...

  7. 【socket编程基础模板】

    网络编程的基础是基于socket编程.socket(TCP)编程基于固定编程模板 server端: socket(声明socket类型) bind(命令socket,绑定地址和端口) listen(创 ...

  8. OC基础--字符串

    前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...

  9. MD5截断比较验证 - 补充

    继上篇MD5截断比较验证文章之后有朋友提示除了数字以外,许多字母数字混合的明文在MD5加密之后也是可以达到同样效果的 同时在De1CTF中Web4题目中遇到了另一种较为特殊的截断比较验证,如图所示: ...

  10. Zookeeper源码解读

    1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...