Csharp/C#教程:Unity3D开发实战之五子棋游戏分享

前言

经过前面《Unity3D入门教程》系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法。本文将使用前面学到的知识,开发一款简单的五子棋程序。本文用到的东西其实不多,非常简单。在最后我们会把完整工程的源代码发布出来,以供初学者参考。先展示一下最后的运行效果吧。

Unity3D开发实战之五子棋游戏

1准备工作

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

(2)图片素材准备:

黑棋子和白棋子

Unity3D开发实战之五子棋游戏Unity3D开发实战之五子棋游戏

棋盘

Unity3D开发实战之五子棋游戏

获胜提示图片

Unity3D开发实战之五子棋游戏

Unity3D开发实战之五子棋游戏

2开发流程

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

Unity3D开发实战之五子棋游戏

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

Unity3D开发实战之五子棋游戏

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

Unity3D开发实战之五子棋游戏

chess.cs脚本如下:

usingUnityEngine; usingSystem.Collections; publicclasschess:MonoBehaviour{ //四个锚点位置,用于计算棋子落点 publicGameObjectLeftTop; publicGameObjectRightTop; publicGameObjectLeftBottom; publicGameObjectRightBottom; //主摄像机 publicCameracam; //锚点在屏幕上的映射位置 Vector3LTPos; Vector3RTPos; Vector3LBPos; Vector3RBPos; Vector3PointPos;//当前点选的位置 floatgridWidth=1;//棋盘网格宽度 floatgridHeight=1;//棋盘网格高度 floatminGridDis;//网格宽和高中较小的一个 Vector2[,]chessPos;//存储棋盘上所有可以落子的位置 int[,]chessState;//存储棋盘位置上的落子状态 enumturn{black,white}; turnchessTurn;//落子顺序 publicTexture2Dwhite;//白棋子 publicTexture2Dblack;//黑棋子 publicTexture2DblackWin;//白子获胜提示图 publicTexture2DwhiteWin;//黑子获胜提示图 intwinner=0;//获胜方,1为黑子,-1为白子 boolisPlaying=true;//是否处于对弈状态 voidStart(){ chessPos=newVector2[15,15]; chessState=newint[15,15]; chessTurn=turn.black; } voidUpdate(){ //计算锚点位置 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(inti=0;i<15;i++) { for(intj=0;j<15;j++) { chessPos[i,j]=newVector2(LBPos.x+gridWidth*i,LBPos.y+gridHeight*j); } } //检测鼠标输入并确定落子状态 if(isPlaying&&Input.GetMouseButtonDown(0)) { PointPos=Input.mousePosition; for(inti=0;i<15;i++) { for(intj=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; } } } //调用判断函数,确定是否有获胜方 intre=result(); if(re==1) { Debug.Log("黑棋胜"); winner=1; isPlaying=false; } elseif(re==-1) { Debug.Log("白棋胜"); winner=-1; isPlaying=false; } } //按下空格重新开始游戏 if(Input.GetKeyDown(KeyCode.Space)) { for(inti=0;i<15;i++) { for(intj=0;j<15;j++) { chessState[i,j]=0; } } isPlaying=true; chessTurn=turn.black; winner=0; } } //计算平面距离函数 floatDis(Vector3mPos,Vector2gridPos) { returnMathf.Sqrt(Mathf.Pow(mPos.x-gridPos.x,2)+Mathf.Pow(mPos.y-gridPos.y,2)); } voidOnGUI() { //绘制棋子 for(inti=0;i<15;i++) { for(intj=0;j<15;j++) { if(chessState[i,j]==1) { GUI.DrawTexture(newRect(chessPos[i,j].x-gridWidth/2,Screen.height-chessPos[i,j].y-gridHeight/2,gridWidth,gridHeight),black); } if(chessState[i,j]==-1) { GUI.DrawTexture(newRect(chessPos[i,j].x-gridWidth/2,Screen.height-chessPos[i,j].y-gridHeight/2,gridWidth,gridHeight),white); } } } //根据获胜状态,弹出相应的胜利图片 if(winner==1) GUI.DrawTexture(newRect(Screen.width*0.25f,Screen.height*0.25f,Screen.width*0.5f,Screen.height*0.25f),blackWin); if(winner==-1) GUI.DrawTexture(newRect(Screen.width*0.25f,Screen.height*0.25f,Screen.width*0.5f,Screen.height*0.25f),whiteWin); } //检测是够获胜的函数,不含黑棋禁手检测 intresult() { intflag=0; //如果当前该白棋落子,标定黑棋刚刚下完一步,此时应该判断黑棋是否获胜 if(chessTurn==turn.white) { for(inti=0;i<11;i++) { for(intj=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; returnflag; } //纵向 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; returnflag; } //右斜线 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; returnflag; } //左斜线 //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; //returnflag; //} } elseif(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; returnflag; } //纵向 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; returnflag; } //右斜线 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; returnflag; } //左斜线 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; returnflag; } } 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; //returnflag; //} //纵向 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; returnflag; } //右斜线 //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; //returnflag; //} //左斜线 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; returnflag; } } } } for(inti=11;i<15;i++) { for(intj=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; returnflag; } } } } //如果当前该黑棋落子,标定白棋刚刚下完一步,此时应该判断白棋是否获胜 elseif(chessTurn==turn.black) { for(inti=0;i<11;i++) { for(intj=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; returnflag; } //纵向 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; returnflag; } //右斜线 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; returnflag; } //左斜线 //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; //returnflag; //} } elseif(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; returnflag; } //纵向 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; returnflag; } //右斜线 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; returnflag; } //左斜线 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; returnflag; } } 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; //returnflag; //} //纵向 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; returnflag; } //右斜线 //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; //returnflag; //} //左斜线 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; returnflag; } } } } for(inti=11;i<15;i++) { for(intj=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; returnflag; } } } } returnflag; } }

运行效果截图:

Unity3D开发实战之五子棋游戏

Unity3D开发实战之五子棋游戏

小结

本程序实现了五子棋的基本功能,纯属娱乐而作。暂时没有加入各种UI、网络模块等。本程序经过了简单的测试,没有什么问题,如果大家在使用的时候发现有什么Bug,请联系我改正,谢谢。

下面是工程源码下载地址

您可能感兴趣的文章:Unity3D实现简易五子棋源码

标签: 五子棋 ni 实战 五子棋游戏

Unity3D实现简易五子棋源码

Unity实现简易日志输出功能

上述就是C#学习教程:Unity3D开发实战之五子棋游戏分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/908463.html

(0)
上一篇 2021年10月25日
下一篇 2021年10月25日

精彩推荐