怎么用Unity3D开发五子棋游戏

发布时间:2021-08-21 03:32:21 作者:chen
来源:亿速云 阅读:91

这篇文章主要介绍“怎么用Unity3D开发五子棋游戏”,在日常操作中,相信很多人在怎么用Unity3D开发五子棋游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Unity3D开发五子棋游戏”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1 准备工作

(1)开发环境:Win10 + Unity5.4.1

(2)图片素材准备:

黑棋子和白棋子

棋盘

获胜提示图片

2 开发流程

上文提到的素材可以直接下载我们给出的这些图,也可以自己制作。注意黑白棋子要做成PNG格式,以保证显示的时候棋子四个角是透明的。将用到的图片素材导入到工程当中。新建一个场景,创建一个Plane,作为MainCamera的子物体。将棋盘贴图拖动到Plane上,并且将Plane正面面向摄像机。

再创建四个sphere,作为Plane的子物体,分别命名为LeftTop、RightTop、LeftBottom、RightBottom。然后把他们的MeshRenderer勾选掉。这些球是为了计算棋子落点所设置的,所以需要把它们与棋盘的四个角点对准。

然后我们创建一个chess.cs脚本,绑定到MainCamera上。脚本中包含了所有的功能。需要绑定的一些物体如图所示。

chess.cs脚本如下:

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[15,15]; chessTurn = turn.black;  }  void Update () {  //计算锚点位置 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 * i, LBPos.y + gridHeight * j); } } //检测鼠标输入并确定落子状态 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,j]==0) { //根据下棋顺序确定落子颜色 chessState[i, 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, 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, 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, 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);  } //检测是够获胜的函数,不含黑棋禁手检测 int result() { int flag = 0; //如果当前该白棋落子,标定黑棋刚刚下完一步,此时应该判断黑棋是否获胜 if(chessTurn == turn.white) { for (int i = 0; i < 11; i++) { for (int j = 0; j < 15; j++) { if (j < 4) { //横向 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) { flag = 1; return flag; } //纵向 if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1) { flag = 1; return flag; } //右斜线 if (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; } //左斜线 //if (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; //} } else if (j >= 4 && j < 11) { //横向 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) { flag = 1; return flag; } //纵向 if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1) { flag = 1; return flag; } //右斜线 if (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; } //左斜线 if (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; } } else { //横向 //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) //{ // flag = 1; // return flag; //} //纵向 if (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1) { flag = 1; return flag; } //右斜线 //if (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; //} //左斜线 if (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; } }  } } for (int i = 11; i < 15; i++)  { for (int j = 0; j < 11; 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)  {  flag = 1;  return flag;  }  } } } //如果当前该黑棋落子,标定白棋刚刚下完一步,此时应该判断白棋是否获胜 else if(chessTurn == turn.black) { for (int i = 0; i < 11; i++) { for (int j = 0; j < 15; j++) { if (j < 4) { //横向 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) { flag = -1; return flag; } //纵向 if (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1) { flag = -1; return flag; } //右斜线 if (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; } //左斜线 //if (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; //} } else if (j >= 4 && j < 11) { //横向 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) { flag = -1; return flag; } //纵向 if (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1) { flag = -1; return flag; } //右斜线 if (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; } //左斜线 if (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; } } else { //横向 //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) //{ // flag = -1; // return flag; //} //纵向 if (chessState[i, j] == -1 && chessState[i + 1, j] ==- 1 && chessState[i + 2, j] ==- 1 && chessState[i + 3, j] ==- 1 && chessState[i + 4, j] == -1) { flag = -1; return flag; } //右斜线 //if (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; //} //左斜线 if (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; } } } } for (int i = 11; i < 15; i++)  { for (int j = 0; j < 11; 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)  {  flag = -1;  return flag;  }  } } }  return flag; } }

到此,关于“怎么用Unity3D开发五子棋游戏”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Unity3D开发类似保龄球游戏
  2. 用JAVA实现五子棋游戏的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

unity3d

上一篇:SQL Server怎么将已分区表转换成普通表

下一篇:kubeadm下安装kubernetes1.12.1的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》