Unity3D游戏开发:使用IMGUI的井字棋
井字棋游戏规则:
- 棋盘大小为3*3,对战双方只能在这个范围内、按次序轮流下棋
- 先手的棋的形状是O, 后手的棋的形状是X
- 先将自己的棋子连成一条直线(横、竖、斜都可以)的一方获胜
基本设计思路:
- 采用一个二维数组作为存储结构,每个单元初始状态为0,被先手O下了变为1,被后X手下了变为2
在这里插入代码片
public int turn;//表示轮流下棋
public int count;//累计数量,为9未决出输赢时是平局
private int[,] cells = new int[3, 3];//用来储存九个格子
- 检测当前状态,如果分为:先手赢、后手赢、输赢待定、平局四个状态这里用winCherck()函数判断:对于先、后手赢、平局状态应该输出,先后手赢需要检查3行、3列、2斜来判定。平局状态应该用一个计数器来判定,每下一个子++,但它值为9的时候还没有输赢,先手赢返回1、后手赢返回2、输赢待定返回0、平局返回3;
在这里插入代码片
private int winCheck(){
for(int i=0;i<3;i++){
if(cells[i,0]==cells[i,1]&&cells[i,1]==cells[i,2]){
if(cells[i,0]==1){
return 1;
}
if(cells[i,0]==2){
return 2;
}
}
}
for(int i=0;i<3;i++){
if((cells[0,i]==cells[1,i]&&cells[1,i]==cells[2,i])){
if(cells[0,i]==1){
return 1;
}
if(cells[0,i]==2){
return 2;
}
}
}
if(cells[0,0]==1&&cells[1,1]==1&&cells[2,2]==1||cells[0,2]==1&&cells[1,1]==1&&cells[2,0]==1){
return 1;
}
if(cells[0,0]==2&&cells[1,1]==2&&cells[2,2]==2||cells[0,2]==2&&cells[1,1]==2&&cells[2,0]==2){
return 2;
}
if(count==9){
return 3;
}
return 0;
}
- 那么就是平局了输赢待定时,先渲染当前的棋盘,然后如果当前为空的棋盘被点击,则在该处下子、接着轮到对手下。
在这里插入代码片
// 下子,棋盘渲染
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(cells[i,j]==1){
GUI.Button(new Rect(20+100*i,50+j*100,80,80),"O");
}
if(cells[i,j]==2){
GUI.Button(new Rect(20+100*i,50+j*100,80,80),"X");
}
if(GUI.Button(new Rect(20+100*i,50+j*100,80,80), ""))
{
if (result == 0)
{
if (turn == 1) cells[i, j] = 1;
else cells[i, j] = 2;
count++;
turn = -turn;
}
}
}
}
}
4.游戏结果结果输出:
在这里插入代码片
//判断谁赢;
int result = winCheck();
switch(result){
case 1:
GUI.Box(new Rect(420,300,80,30),"O WIN");break;
case 2:
GUI.Box(new Rect(420,300,80,30),"X WIN");break;
case 3:
GUI.Box(new Rect(420,300,80,30),"DAUL");break;
}

额外自己添加设计思路:
- 背景图设计:
在这里插入代码片
GUI.Label(new Rect(0,0,Screen.width,Screen.height),back);

- 游戏重启键设计restart()函数:
在这里插入代码片
void restart(){
turn = 1;
for (int i = 0; i < 3; ++i){
for (int j = 0; j < 3; ++j){
cells[i, j] = 0;
}
}
count = 0;
}

完整代码:
在这里插入代码片
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour{
public int turn;//用于规定次序
public int count;//判断操作数
public Texture2D back;
private int[,] cells = new int[3,3];
// Start is called before the first frame update
void Start () {
restart();
}
void restart(){
turn = 1;
for (int i = 0; i < 3; ++i){
for (int j = 0; j < 3; ++j){
cells[i, j] = 0;
}
}
count = 0;
}
private int winCheck(){
for(int i=0;i<3;i++){
if(cells[i,0]==cells[i,1]&&cells[i,1]==cells[i,2]){
if(cells[i,0]==1){
return 1;
}
if(cells[i,0]==2){
return 2;
}
}
}
for(int i=0;i<3;i++){
if((cells[0,i]==cells[1,i]&&cells[1,i]==cells[2,i])){
if(cells[0,i]==1){
return 1;
}
if(cells[0,i]==2){
return 2;
}
}
}
if(cells[0,0]==1&&cells[1,1]==1&&cells[2,2]==1||cells[0,2]==1&&cells[1,1]==1&&cells[2,0]==1){
return 1;
}
if(cells[0,0]==2&&cells[1,1]==2&&cells[2,2]==2||cells[0,2]==2&&cells[1,1]==2&&cells[2,0]==2){
return 2;
}
if(count==9){
return 3;
}
return 0;
}
// Update is called once per frame
void Update(){
}
void OnGUI (){
GUI.Label(new Rect(0,0,Screen.width,Screen.height),back);
// Make a background box
GUI.Box(new Rect(10,10,300,330), "GAME");
if(GUI.Button(new Rect(320,300,80,30),"Restart")){
restart();
}
//判断谁赢;
int result = winCheck();
switch(result){
case 1:
GUI.Box(new Rect(420,300,80,30),"O WIN");break;
case 2:
GUI.Box(new Rect(420,300,80,30),"X WIN");break;
case 3:
GUI.Box(new Rect(420,300,80,30),"DAUL");break;
}
// 下子
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(cells[i,j]==1){
GUI.Button(new Rect(20+100*i,50+j*100,80,80),"O");
}
if(cells[i,j]==2){
GUI.Button(new Rect(20+100*i,50+j*100,80,80),"X");
}
if(GUI.Button(new Rect(20+100*i,50+j*100,80,80), ""))
{
if (result == 0)
{
if (turn == 1) cells[i, j] = 1;
else cells[i, j] = 2;
count++;
turn = -turn;
}
}
}
}
}
}
992

被折叠的 条评论
为什么被折叠?



