使用IMGUI构建UI,做一个井字棋游戏。IMGUI文档
目的:
1. 提升 debug 能力
2. 提升阅读 API 文档能力
GUI.Button(new Rect(x, y, width, height), “Something you want to show in Button”);
该函数用于创建一个button,点击button,该函数返回true,可用于if语句中的检测条件,判断button是否被点击。
GUI.Label(new Rect(x, y, width, height), “Something you want to show in Button”);
与GUI.Button不同的是,该函数是不具有交互性的,只生成用于显示某些内容的label,该label无法点击。
turn用来记录玩家的回合,为1的时候是玩家1的回合,2的时候是玩家2的回合;
grid数组用于记录3X3格子的状态,值为1的时候认为被格子被玩家1点击,2的时候被玩家2点击,0的时候还没有被点击过。
private int turn = 1; private int[,] grid = new int[3, 3];
通过start函数调用restart函数,进行数组初始化
// 重新开始游戏 void Start () { Restart(); } void Restart(){ turn = 1; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { grid[i, j] = 0; } } }
GUI.skin.button.fontSize用来设置所有button中的字体大小
style则用来设置label中字体大小与字体颜色
//设置button中字体的大小 GUI.skin.button.fontSize = 20; //设置label中字体大小和颜色 GUIStyle style = new GUIStyle(); style.fontSize = 40; style.normal.textColor = new Color(255, 255, 255);
if语句判断restart按钮是否被点击,被点击时,调用restart函数,重置格子状态
GUI.Button()在指定位置上生成一个具有Restart字体内容的button
//判断是否点击Restart按钮 if(GUI.Button(new Rect(360, 500, 80, 80), "Restart")){ Restart(); }
result用于记录judge函数返回的值,judge函数用于判断当前游戏是否有游戏玩家胜利,或者游戏结束却没有玩家取得胜利。
//判断游戏是否结束 int result = judge(); if (result == 1) { GUI.Label(new Rect(340, 170, 100, 50), "O wins!", style); } else if (result == 2) { GUI.Label(new Rect(340, 170, 100, 50), "X wins!", style); }else if (result == 3) { GUI.Label(new Rect(300, 170, 100, 50), "GameOver!", style); } //judge函数 int judge() { // 横向连线 for (int i = 0; i < 3; ++i) { if (grid[i, 0] != 0 && grid[i, 0] == grid[i, 1] && grid[i, 1] == grid[i, 2]) { return grid[i, 0]; } } //纵向连线 for (int j = 0; j < 3; ++j) { if (grid[0, j] != 0 && grid[0, j] == grid[1, j] && grid[1, j] == grid[2, j]) { return grid[0, j]; } } //斜向连线 if (grid[1, 1] != 0 && grid[0, 0] == grid[1, 1] && grid[1, 1] == grid[2, 2] || grid[0, 2] == grid[1, 1] && grid[1, 1] == grid[2, 0]) { return grid[1, 1]; } //全部格子都被点击 bool allClick = true; for (int i=0; i<3; i++) { for (int j=0; j<3; j++) { if (grid[i, j] == 0) { allClick = false; } } } if (allClick) return 3; return 0; }
循环中对每个格子的状态进行判断,当值为1时,button内容显示O;值为2时,显示X;值为0时,对格子进行赋值,以此确认别哪个玩家点击
//生成棋盘并判断格子是否被点击 for (int i=0; i<3; i++) { for(int j=0; j<3; j++) { if (grid[i, j] == 1) { GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "O"); }else if (grid[i, j] == 2) { GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "X"); }else if (GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "")&&result==0) { if (turn == 1) { grid[i, j] = 1; }else { grid[i, j] = 2; } turn = -turn; } } }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Chess : MonoBehaviour {
private int turn = 1;
private int[,] grid = new int[3, 3];
// 重新开始游戏
void Start () {
Restart();
}
void Restart()
{
turn = 1;
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
grid[i, j] = 0;
}
}
}
void OnGUI()
{
//设置button中字体的大小
GUI.skin.button.fontSize = 20;
//设置label中字体大小和颜色
GUIStyle style = new GUIStyle();
style.fontSize = 40;
style.normal.textColor = new Color(255, 255, 255);
//判断是否点击Restart按钮
if(GUI.Button(new Rect(360, 500, 80, 80), "Restart")){
Restart();
}
//判断游戏是否结束
int result = judge();
if (result == 1)
{
GUI.Label(new Rect(340, 170, 100, 50), "O wins!", style);
}
else if (result == 2)
{
GUI.Label(new Rect(340, 170, 100, 50), "X wins!", style);
}else if (result == 3)
{
GUI.Label(new Rect(300, 170, 100, 50), "GameOver!", style);
}
//生成棋盘并判断格子是否被点击
for (int i=0; i<3; i++)
{
for(int j=0; j<3; j++) {
if (grid[i, j] == 1)
{
GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "O");
}else if (grid[i, j] == 2)
{
GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "X");
}else if (GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "")&&result==0)
{
if (turn == 1)
{
grid[i, j] = 1;
}else
{
grid[i, j] = 2;
}
turn = -turn;
}
}
}
}
int judge()
{
// 横向连线
for (int i = 0; i < 3; ++i)
{
if (grid[i, 0] != 0 && grid[i, 0] == grid[i, 1] && grid[i, 1] == grid[i, 2])
{
return grid[i, 0];
}
}
//纵向连线
for (int j = 0; j < 3; ++j)
{
if (grid[0, j] != 0 && grid[0, j] == grid[1, j] && grid[1, j] == grid[2, j])
{
return grid[0, j];
}
}
//斜向连线
if (grid[1, 1] != 0 &&
grid[0, 0] == grid[1, 1] && grid[1, 1] == grid[2, 2] ||
grid[0, 2] == grid[1, 1] && grid[1, 1] == grid[2, 0])
{
return grid[1, 1];
}
//全部格子都被点击
bool allClick = true;
for (int i=0; i<3; i++)
{
for (int j=0; j<3; j++)
{
if (grid[i, j] == 0)
{
allClick = false;
}
}
}
if (allClick)
return 3;
return 0;
}
}