c语言改u3d游戏,使用Unity3D怎么制作一个五子棋游戏
使用Unity3D怎么制作一個(gè)五子棋游戲
發(fā)布時(shí)間:2021-04-17 17:56:36
來(lái)源:億速云
閱讀:106
作者:Leah
本篇文章為大家展示了使用Unity3D怎么制作一個(gè)五子棋游戲,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。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;?//棋盤(pán)網(wǎng)格寬度
float?gridHeight?=?1;?//棋盤(pán)網(wǎng)格高度
float?minGridDis;?//網(wǎng)格寬和高中較小的一個(gè)
Vector2[,]?chessPos;?//存儲(chǔ)棋盤(pán)上所有可以落子的位置
int[,]?chessState;?//存儲(chǔ)棋盤(pán)位置上的落子狀態(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[17,?16];/*原來(lái)定義是new?int[15,?15],這里將原來(lái)數(shù)組chessState上、下和右邊各加一排數(shù)據(jù),
也就相當(dāng)于在棋盤(pán)的上、下和右邊各填加一排隱形的棋道。原因后面解釋*/
chessTurn?=?turn.black;
//計(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?
//計(jì)算落子點(diǎn)位置
for?(int?i?=?0;?i?
{
for?(int?j?=?0;?j?
{
chessPos[i,?j]?=?new?Vector2(LBPos.x?+?gridWidth?*?j,?LBPos.y?+?gridHeight?*?i);//這里和源程序定義稍有不同,這里i定位行,j為列
}
}
}
void?Update()
{
//檢測(cè)鼠標(biāo)輸入并確定落子狀態(tài)
if?(isPlaying?&&?Input.GetMouseButtonDown(0))
{
PointPos?=?Input.mousePosition;
for?(int?i?=?0;?i?
{
for?(int?j?=?0;?j?
{
//找到最接近鼠標(biāo)點(diǎn)擊位置的落子點(diǎn),如果空則落子
if?(Dis(PointPos,?chessPos[i,?j])?
因?yàn)樯稀⑾潞陀疫吀鞫嗉恿艘慌?#xff0c;要空出來(lái),chessPos的i行對(duì)應(yīng)chessState的i+1行*/
{
//根據(jù)下棋順序確定落子顏色
chessState[i?+?1,?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;
}
}
//按下空格重新開(kāi)始游戲
if?(Input.GetKeyDown(KeyCode.Space))
{
for?(int?i?=?0;?i?
{
for?(int?j?=?0;?j?
{
chessState[i?+?1,?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?
{
for?(int?j?=?0;?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);
}
}
}
//根據(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);
}
//改寫(xiě)result函數(shù)
/*解釋:C語(yǔ)言中,這樣的表達(dá)式:chessState[i]&&chessState[i+1]&&chessState[i+2]&&chessState[i+3]&&chessState[i+4],如果
*?chessState[i]為False,則不管B是真是假或者是異常都不會(huì)運(yùn)行,利用這一點(diǎn),在chessState的右邊、上邊和下邊各加一行為0的數(shù)據(jù),
*?這樣在判斷連續(xù)五個(gè)棋子的狀態(tài)時(shí),就不用擔(dān)心chessState數(shù)組的索引值超出范圍。例如:chessState[i+4]的索引值i+4剛好超出范圍,
*?通過(guò)在原來(lái)數(shù)組chessState的上、下和右邊個(gè)添加一排為0的數(shù),這樣chessState[i+3]==0,于是就可以避免引起異常,從而簡(jiǎn)化代碼*/
int?result()
{
int?flag?=?0;
if?(chessTurn?==?turn.white)
{
for?(int?i?=?1;?i?<=?15;?i++)//這里的i從1開(kāi)始
{
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開(kāi)始
{
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;
}
}
上述內(nèi)容就是使用Unity3D怎么制作一個(gè)五子棋游戲,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
總結(jié)
以上是生活随笔為你收集整理的c语言改u3d游戏,使用Unity3D怎么制作一个五子棋游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 旺财存款可以退掉吗 需要到银行办理
- 下一篇: android上滑隐藏动画,ListVi