日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Unity3D入门教程】Unity3D开发实战之五子棋

發(fā)布時(shí)間:2024/3/26 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Unity3D入门教程】Unity3D开发实战之五子棋 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

經(jīng)過前面《Unity3D入門教程》系列講解,再加上我們自己的探索,相信大家已經(jīng)掌握了Unity3D的相關(guān)知識(shí)和基本方法。本文將使用前面學(xué)到的知識(shí),開發(fā)一款簡單的五子棋程序。本文用到的東西其實(shí)不多,非常簡單。在最后我們會(huì)把完整工程的源代碼發(fā)布出來,以供初學(xué)者參考。先展示一下最后的運(yùn)行效果吧。

1 準(zhǔn)備工作

(1)開發(fā)環(huán)境:Win10 + Unity5.4.1

(2)圖片素材準(zhǔn)備:

黑棋子和白棋子

? ?

棋盤

獲勝提示圖片

2 開發(fā)流程

上文提到的素材可以直接下載我們給出的這些圖,也可以自己制作。注意黑白棋子要做成PNG格式,以保證顯示的時(shí)候棋子四個(gè)角是透明的。將用到的圖片素材導(dǎo)入到工程當(dāng)中。新建一個(gè)場景,創(chuàng)建一個(gè)Plane,作為MainCamera的子物體。將棋盤貼圖拖動(dòng)到Plane上,并且將Plane正面面向攝像機(jī)。

再創(chuàng)建四個(gè)sphere,作為Plane的子物體,分別命名為LeftTop、RightTop、LeftBottom、RightBottom。然后把他們的MeshRenderer勾選掉。這些球是為了計(jì)算棋子落點(diǎn)所設(shè)置的,所以需要把它們與棋盤的四個(gè)角點(diǎn)對(duì)準(zhǔn)。

然后我們創(chuàng)建一個(gè)chess.cs腳本,綁定到MainCamera上。腳本中包含了所有的功能。需要綁定的一些物體如圖所示。

chess.cs腳本如下:

using UnityEngine; using System.Collections;public class chess : MonoBehaviour {//四個(gè)錨點(diǎn)位置,用于計(jì)算棋子落點(diǎn)public GameObject LeftTop;public GameObject RightTop;public GameObject LeftBottom;public GameObject RightBottom;//主攝像機(jī)public Camera cam;//錨點(diǎn)在屏幕上的映射位置Vector3 LTPos;Vector3 RTPos;Vector3 LBPos;Vector3 RBPos;Vector3 PointPos;//當(dāng)前點(diǎn)選的位置float gridWidth =1; //棋盤網(wǎng)格寬度float gridHeight=1; //棋盤網(wǎng)格高度float minGridDis; //網(wǎng)格寬和高中較小的一個(gè)Vector2[,] chessPos; //存儲(chǔ)棋盤上所有可以落子的位置int[,] chessState; //存儲(chǔ)棋盤位置上的落子狀態(tài)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; //是否處于對(duì)弈狀態(tài)void Start () {chessPos = new Vector2[15, 15];chessState =new int[15,15];chessTurn = turn.black;}void Update () {//計(jì)算錨點(diǎn)位置LTPos = cam.WorldToScreenPoint(LeftTop.transform.position);RTPos = cam.WorldToScreenPoint(RightTop.transform.position);LBPos = cam.WorldToScreenPoint(LeftBottom.transform.position);RBPos = cam.WorldToScreenPoint(RightBottom.transform.position);//計(jì)算網(wǎng)格寬度gridWidth = (RTPos.x - LTPos.x) / 14;gridHeight = (LTPos.y - LBPos.y) / 14;minGridDis = gridWidth < gridHeight ? gridWidth : gridHeight;//計(jì)算落子點(diǎn)位置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);}}//檢測(cè)鼠標(biāo)輸入并確定落子狀態(tài)if (isPlaying && Input.GetMouseButtonDown(0)){PointPos = Input.mousePosition;for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){ //找到最接近鼠標(biāo)點(diǎn)擊位置的落子點(diǎn),如果空則落子if (Dis(PointPos, chessPos[i, j]) < minGridDis / 2 && chessState[i,j]==0){//根據(jù)下棋順序確定落子顏色chessState[i, j] = chessTurn == turn.black ? 1 : -1;//落子成功,更換下棋順序chessTurn = chessTurn == turn.black ? turn.white : turn.black; }}}//調(diào)用判斷函數(shù),確定是否有獲勝方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;} }//計(jì)算平面距離函數(shù)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);} }}//根據(jù)獲勝狀態(tài),彈出相應(yīng)的勝利圖片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);}//檢測(cè)是夠獲勝的函數(shù),不含黑棋禁手檢測(cè)int result(){int flag = 0;//如果當(dāng)前該白棋落子,標(biāo)定黑棋剛剛下完一步,此時(shí)應(yīng)該判斷黑棋是否獲勝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; } }}}//如果當(dāng)前該黑棋落子,標(biāo)定白棋剛剛下完一步,此時(shí)應(yīng)該判斷白棋是否獲勝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;} }

運(yùn)行效果截圖:

小結(jié)

本程序?qū)崿F(xiàn)了五子棋的基本功能,純屬娛樂而作。暫時(shí)沒有加入各種UI、網(wǎng)絡(luò)模塊等。本程序經(jīng)過了簡單的測(cè)試,沒有什么問題,如果大家在使用的時(shí)候發(fā)現(xiàn)有什么Bug,請(qǐng)聯(lián)系我改正,謝謝。

*************************************************************************************

下面是工程源碼下載地址:

GitHub - zzlyw/Gobang_Tutorial

總結(jié)

以上是生活随笔為你收集整理的【Unity3D入门教程】Unity3D开发实战之五子棋的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。