Unity3d简易五子棋源码

Unity3d部分
对C#源码进行了改写简化:

using UnityEngine;
using System.Collections;public class chess : MonoBehaviour
{//四个锚点位置,用于计算棋子落点public GameObject LeftTop;public GameObject RightTop;public GameObject LeftBottom;public GameObject RightBottom;//主摄像机public Camera cam;//锚点在屏幕上的映射位置Vector3 LTPos;Vector3 RTPos;Vector3 LBPos;Vector3 RBPos;Vector3 PointPos;//当前点选的位置float gridWidth = 1; //棋盘网格宽度float gridHeight = 1; //棋盘网格高度float minGridDis;  //网格宽和高中较小的一个Vector2[,] chessPos; //存储棋盘上所有可以落子的位置int[,] chessState; //存储棋盘位置上的落子状态enum turn { black, white };turn chessTurn; //落子顺序public Texture2D white; //白棋子public Texture2D black; //黑棋子public Texture2D blackWin; //白子获胜提示图public Texture2D whiteWin; //黑子获胜提示图int winner = 0; //获胜方,1为黑子,-1为白子bool isPlaying = true; //是否处于对弈状态void Start(){chessPos = new Vector2[15, 15];chessState = new int[17, 16];/*原来定义是new int[15, 15],这里将原来数组chessState上、下和右边各加一排数据,也就相当于在棋盘的上、下和右边各填加一排隐形的棋道。原因后面解释*/chessTurn = turn.black;//计算锚点位置LTPos = cam.WorldToScreenPoint(LeftTop.transform.position);RTPos = cam.WorldToScreenPoint(RightTop.transform.position);LBPos = cam.WorldToScreenPoint(LeftBottom.transform.position);RBPos = cam.WorldToScreenPoint(RightBottom.transform.position);//计算网格宽度gridWidth = (RTPos.x - LTPos.x) / 14;gridHeight = (LTPos.y - LBPos.y) / 14;minGridDis = gridWidth < gridHeight ? gridWidth : gridHeight;//计算落子点位置for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){chessPos[i, j] = new Vector2(LBPos.x + gridWidth * j, LBPos.y + gridHeight * i);//这里和源程序定义稍有不同,这里i定位行,j为列}}}void Update(){//检测鼠标输入并确定落子状态if (isPlaying && Input.GetMouseButtonDown(0)){PointPos = Input.mousePosition;for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){//找到最接近鼠标点击位置的落子点,如果空则落子if (Dis(PointPos, chessPos[i, j]) < minGridDis / 2 && chessState[i + 1, j] == 0)/*这里chessState行要加1,因为上、下和右边各多加了一排,要空出来,chessPos的i行对应chessState的i+1行*/{//根据下棋顺序确定落子颜色chessState[i + 1, j] = chessTurn == turn.black ? 1 : -1;//同理//落子成功,更换下棋顺序chessTurn = chessTurn == turn.black ? turn.white : turn.black;}}}//调用判断函数,确定是否有获胜方int re = result();if (re == 1){Debug.Log("黑棋胜");winner = 1;isPlaying = false;}else if (re == -1){Debug.Log("白棋胜");winner = -1;isPlaying = false;}}//按下空格重新开始游戏if (Input.GetKeyDown(KeyCode.Space)){for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){chessState[i + 1, j] = 0;//同理}}isPlaying = true;chessTurn = turn.black;winner = 0;}}//计算平面距离函数float Dis(Vector3 mPos, Vector2 gridPos){return Mathf.Sqrt(Mathf.Pow(mPos.x - gridPos.x, 2) + Mathf.Pow(mPos.y - gridPos.y, 2));}void OnGUI(){//绘制棋子for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){if (chessState[i + 1, j] == 1)//同理{GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), black);}if (chessState[i + 1, j] == -1)//同理{GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), white);}}}//根据获胜状态,弹出相应的胜利图片if (winner == 1){GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), blackWin);}if (winner == -1)GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), whiteWin);}//改写result函数/*解释:C语言中,这样的表达式:chessState[i]&&chessState[i+1]&&chessState[i+2]&&chessState[i+3]&&chessState[i+4],如果* chessState[i]为False,则不管B是真是假或者是异常都不会运行,利用这一点,在chessState的右边、上边和下边各加一行为0的数据,* 这样在判断连续五个棋子的状态时,就不用担心chessState数组的索引值超出范围。例如:chessState[i+4]的索引值i+4刚好超出范围,* 通过在原来数组chessState的上、下和右边个添加一排为0的数,这样chessState[i+3]==0,于是就可以避免引起异常,从而简化代码*/int result(){int flag = 0;if (chessTurn == turn.white){for (int i = 1; i <= 15; i++)//这里的i从1开始{for (int j = 0; j <= 14; j++)//j不用变{if ((chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)//向右横向|| (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)//向上横向|| (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)//向右上斜向|| (chessState[i, j] == 1 && chessState[i - 1, j + 1] == 1 && chessState[i - 2, j + 2] == 1 && chessState[i - 3, j + 3] == 1 && chessState[i - 4, j + 4] == 1))//向右下斜向{flag = 1;}}}}else if (chessTurn == turn.black){for (int i = 1; i <= 15; i++)//这里的i从1开始{for (int j = 0; j <= 14; j++){if ((chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)|| (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1)|| (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)|| (chessState[i, j] == -1 && chessState[i - 1, j + 1] == -1 && chessState[i - 2, j + 2] == -1 && chessState[i - 3, j + 3] == -1 && chessState[i - 4, j + 4] == -1)){flag = -1;}}}}return flag;}
}

[C#|Unity3D学习笔记]简易五子棋源码相关推荐

  1. unity3d c语言,Unity3D实现简易五子棋源码

    本文实例为大家分享了Unity3d简易五子棋源码,供大家参考,具体内容如下 对C#源码进行了改写简化: using UnityEngine; using System.Collections; pub ...

  2. JUC.Condition学习笔记[附详细源码解析]

    JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...

  3. K8s基础知识学习笔记及部分源码剖析

    K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...

  4. The Things Network LoRaWAN Stack V3 学习笔记 1.2 源码编译

    前言 源码编译是重头戏,这节笔记记录如何使用 make 命令编译相关部件.由于部分包在墙外,带来了一点麻烦,还分享一个 replace 方式来翻墙的办法. 小能手这段时间在学习 The Things ...

  5. Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)

    在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...

  6. 【从线性回归到 卷积神经网络CNN 循环神经网络RNN Pytorch 学习笔记 目录整合 源码解读 B站刘二大人 绪论(0/10)】

    深度学习 Pytorch 学习笔记 目录整合 数学推导与源码详解 B站刘二大人 目录传送门: 线性模型 Linear-Model 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人( ...

  7. Netty学习笔记 - 1 (带源码分析部分)

    2021年12月 北京 xxd 一.Netty是什么 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用 ...

  8. The Things Network LoRaWAN Stack V3 学习笔记 1.2 源码编译 - 190821

    文章目录 前言 1 依赖包替换 2 编译准备 3 编译 3.1 cli 编译 3.2 stack 编译 3.3 前端编译 END 前言 源码编译是重头戏,这节笔记记录如何使用 make 命令编译相关部 ...

  9. jMetal学习笔记(二)-NSGAii源码解读

    前言 上篇笔记根据使用手册介绍了jMetal的架构,但是由于使用手册撰写时间太早(最近更新时间是08年),现在jmetal框架更新了,所以很多都已经不适用,这篇笔记会穿插讲解jmetal架构知识. 其 ...

最新文章

  1. 2021年甘肃省副高考试成绩查询,2021年甘肃卫生资格考试成绩查询-中国卫生人才网...
  2. IO系统性能之一:衡量性能的几个指标
  3. 关于webrtc视频会议的解决方案
  4. 换血吃药改基因,硅谷富豪们想用钱收买死神丨视频
  5. TensorFlow基本原理,入门教程网址
  6. 27 Python - 数值 日期与时间
  7. 想拥有高清壁纸不用那么麻烦!
  8. gerber文件_90%的工程师容易忽视(一):PCB输出gerber文件,这样操作才正确
  9. oracle行号排序问题
  10. 不休息的工作都是浪费时间
  11. 望眼科技:另类资产管理数据--夜光数据
  12. 弱电智能化施工组织设计方案
  13. 会议纪要模板----邮件
  14. Face detection in color images, 彩色图像中的人脸检测
  15. Java编程:基于socket实现局域网双人联机对战五子棋
  16. ArcGIS JS API 4.x(二) 加载 3.x所说的动态地图服务图层
  17. 一些时间的概念与区分(UTC、GMT、LT、TAI等)
  18. 胡适最著名演讲:天下没有白费的努力!
  19. 文字转语音的配音软件,萝莉等语音资源可以自行编辑声音文本内容
  20. 记账软件怎么设置着色,收支明细添加颜色

热门文章

  1. C++ 圆与圆之间的距离是不能一概而论的
  2. Unity 2Drpg
  3. 赚钱 36 计 - 第五计:逆向计
  4. 国内OA在线试用地址
  5. 做亚马逊测评现的注意事项有哪些?亚马逊测评靠什么盈利,测评项目揭秘!
  6. word 文档批量查找和批量替换
  7. 公众号查题接口 搜题公众号 搭建教程 对接千万级别题库 不限次数接口
  8. ElasticSearch 8.6.1详解(一):Windows安装教程
  9. python代码:基于强化学习的智能电网的动态定价方法 摘要:提出了一种考虑服务提供商(SP)利润和用户(CUs)成本的分级电力市场中能量管理的动态定价DR算法
  10. ESP8266 MP3制作——OLED显示之取模软件的使用