3D游戏设计-井字棋

设计要求

  • 游戏内容: 井字棋
  • 技术限制: 仅允许使用 IMGUI 构建 UI
  • 作业目的:
    – 了解 OnGUI() 事件,提升 debug 能力
    – 提升阅读 API 文档能力

项目配置

  • 使用unity创建一个空物体
    在这里插入图片描述
  • 在空物体上挂在脚本
    在这里插入图片描述

代码实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Game : MonoBehaviour
{
    
    private int player=0;   // 0代表'O'玩家,1代表'x'玩家
    private int cnt=0;      // 已被使用的九宫格个数
    private int end=0;      // 0表示游戏继续,1表示游戏结束
    private int res=-1;     // -1表示没有输赢,0表示O玩家赢,1表示X玩家赢
    private int[][] border=new int[3][]{new int[3],new int[3],new int[3]};  // 3×3九宫格

    // 游戏开始,游戏初始化
    void Start(){
        reset();
        Debug.Log("game start!");
    }

    // 初始化数据和九宫格
    void reset(){
        player=0;
        cnt=0;
        end=0;
        res=-1;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                border[i][j]=-1;
            }
        }
        Debug.Log("game reset!");
    }

    // 打印游戏结果
    void printRes(int res){
        int w=Screen.width/2;
        if(res==0){
            GUI.Box(new Rect(w-50,80,100,35),"O win!");
        }else if(res==1){
            GUI.Box(new Rect(w-50,80,100,35),"X win!");
        }else if(res==2){
            GUI.Box(new Rect(w-50,80,100,35),"Draw!");
        }else{
            GUI.Box(new Rect(w-50,80,100,35),"Game Start!");
        }
    }

    // 构建游戏的GUI界面并实现游戏的逻辑结构
    void OnGUI(){
        int w=Screen.width/2;
        GUI.Box(new Rect(w-150,50,300,400),"井字棋");   // 标题

        if(GUI.Button(new Rect(w-50,415,100,35),"Reset")) reset();  // reset按钮
        GUI.Label(new Rect(w-50,450,100,35),GUI.tooltip);

        //逻辑结构
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(border[i][j]==0){    // O玩家
                    GUI.Button(new Rect(w-150+i*100,115+j*100,100,100),"O");
                }else if(border[i][j]==1){  // X玩家
                    GUI.Button(new Rect(w-150+i*100,115+j*100,100,100),"X");
                }else{  // 判定是否三点一线
                    if(GUI.Button(new Rect(w-150+i*100,115+j*100,100,100),"")){
                        if(end==1) break;

                        border[i][j]=player;
                        cnt++;
                        if(border[0][j]==border[1][j] && border[0][j]==border[2][j]) res=player;    // 竖直线
                        else if(border[i][0]==border[i][1] && border[i][0]==border[i][2]) res=player;   // 横直线
                        else if(i==j && border[0][0]==border[1][1] && border[0][0]==border[2][2]) res=player;   // 斜直线
                        else if(i+j==2 && border[0][2]==border[1][1] && border[0][2]==border[2][0]) res=player; // 斜直线
                        
                        if(cnt==9 && res==-1) res=2;    // 平局
                        if(res!=-1) end=1; 
                        Debug.Log("res="+res);
                        Debug.Log("end="+end);
                        player=player^1;    // 换玩家
                    }
                }
            }
        }
        printRes(res);
    }
}

效果

  • 游戏开始
    在这里插入图片描述
  • O玩家先行
    在这里插入图片描述
  • O玩家和X玩家交替行走
    在这里插入图片描述
  • O玩家胜
    在这里插入图片描述
  • X玩家胜
    在这里插入图片描述
  • 平局
    在这里插入图片描述
  • 初始化(reset)
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值