第一次作业是井字棋,本人去年已经学过3dgame了,因为考试当天熬夜准备考试,玩了一个晚上的3dunity,导致第二天考试的时候睡着了,旷考。今年回头二战。
可以先看下去年我们的作业叫做连珠游戏,五子棋,去年的作业难度就更大一点和今年作业是一个类型的。
先上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//连珠游戏(五子棋)
public class Chess : MonoBehaviour
{
//开始游戏和重新开始游戏没有区别,所以只需要调用重新开始游戏即可
void Start()
{
restart();
}
//一个20*20的二维数组用于记录棋盘当前的状态
int[,] board = new int[20, 20];
//一个变量用于记录当前轮到哪一方下棋
int turn = 1;
void restart()
{
//开始游戏需要重置棋盘和turn变量
for (int i = 0; i < 20; i++)
for (int j = 0; j < 20; j++)
board[i, j] = 0;
turn = 1;
}
void OnGUI()
{
//开始游戏按钮
if (GUI.Button(new Rect(30, 100, 100, 60), "开始游戏"))
{
restart();
}
//判断游戏是否结束
int flag = judge();
//0代表游戏继续
//1代表先手胜利
//2代表后手胜利
//3代表平局
if (flag == 1)
{
GUI.Label(new Rect(30, 200, 100, 60), "先手胜利!");
}
else if (flag == 2)
{
GUI.Label(new Rect(30, 200, 100, 60), "后手胜利!");
}
else if (flag == 3)
{
GUI.Label(new Rect(30, 200, 100, 60), "平局");
}
//生成20*20棋盘
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
if (board[i, j] == 1)
{
GUI.Button(new Rect(200 + i * 20, 20 + j * 20, 20, 20), "o");
}
else if (board[i, j] == 2)
{
GUI.Button(new Rect(200 + i * 20, 20 + j * 20, 20, 20), "x");
}
else if (GUI.Button(new Rect(200 + i * 20, 20 + j * 20, 20, 20), "") && flag == 0)
{
if (turn == 1) board[i, j] = 1;
else board[i, j] = 2;
turn = -turn;
}
}
}
}
int judge()
{
//横向连珠
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 16; j++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i, j + 1] &&
board[i, j] == board[i, j + 2] &&
board[i, j] == board[i, j + 3] &&
board[i, j] == board[i, j + 4])
return board[i, j];
}
}
//纵向连珠
for (int j = 0; j < 20; j++)
{
for (int i = 0; i < 16; i++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i + 1, j] &&
board[i, j] == board[i + 2, j] &&
board[i, j] == board[i + 3, j] &&
board[i, j] == board[i + 4, j])
return board[i, j];
}
}
//两种斜向连珠
for (int i = 0; i < 16; i++)
{
for (int j = 0; j < 16; j++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i + 1, j + 1] &&
board[i, j] == board[i + 2, j + 2] &&
board[i, j] == board[i + 3, j + 3] &&
board[i, j] == board[i + 4, j + 4])
return board[i, j];
}
}
for (int i = 0; i < 16; i++)
{
for (int j = 5; j < 20; j++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i + 1, j - 1] &&
board[i, j] == board[i + 2, j - 2] &&
board[i, j] == board[i + 3, j - 3] &&
board[i, j] == board[i + 4, j - 4])
return board[i, j];
}
}
//平局(棋盘满)
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
if (board[i, j] == 0)
return 0;
}
}
return 3;
}
}
这里给上课没听讲并且也不愿意查资料的同学解释一下,
rect函数
基本概念:
Rect(int x, int y, int width, int height);
参数含义:
Rect(左上角 x 坐标 ?, ?左上角 y 坐标,矩形的宽,矩形的高)
其实就是生成了一个20×20的按钮作为棋盘,用了一个turn来记录是先手还是后手,先手就圆圈,后手就差,先手的时候形成连珠那就是先手胜,后手的时候满足连珠就是后手胜,全下满也没有形成连珠就平局(虽然有点不合理在五子棋里,因为没人会下满会留下很多边角空位)。
然后后部分就是大量的代码用来检测是否形成连珠。
这是游戏截图
然后github项目地址:https://github.com/17343083/3dgame/tree/main/Renjuhttps://github.com/17343083/3dgame/tree/main/Renju
再来看下我们这次的井字棋
看下代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//连珠游戏(井字棋)
public class Chess : MonoBehaviour
{
//开始游戏和重新开始游戏没有区别,所以只需要调用重新开始游戏即可
void Start()
{
restart();
}
//一个3*3的二维数组用于记录棋盘当前的状态
int[,] board = new int[3, 3];
//一个变量用于记录当前轮到哪一方下棋
int turn = 1;
void restart()
{
//开始游戏需要重置棋盘和turn变量
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
board[i, j] = 0;
turn = 1;
}
void OnGUI()
{
//开始游戏按钮
if (GUI.Button(new Rect(30, 100, 100, 60), "开始游戏"))
{
restart();
}
//判断游戏是否结束
int flag = judge();
//0代表游戏继续
//1代表先手胜利
//2代表后手胜利
//3代表平局
if (flag == 1)
{
GUI.Label(new Rect(30, 200, 100, 60), "先手胜利!");
}
else if (flag == 2)
{
GUI.Label(new Rect(30, 200, 100, 60), "后手胜利!");
}
else if (flag == 3)
{
GUI.Label(new Rect(30, 200, 100, 60), "平局");
}
//生成3*3棋盘
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (board[i, j] == 1)
{
GUI.Button(new Rect(200 + i * 100, 20 + j * 100, 100, 100), "o");
}
else if (board[i, j] == 2)
{
GUI.Button(new Rect(200 + i * 100, 20 + j * 100, 100, 100), "x");
}
else if (GUI.Button(new Rect(200 + i * 100, 20 + j * 100, 100, 100), "") && flag == 0)
{
if (turn == 1) board[i, j] = 1;
else board[i, j] = 2;
turn = -turn;
}
}
}
}
int judge()
{
//横向连珠
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 1; j++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i, j + 1] &&
board[i, j] == board[i, j + 2])
return board[i, j];
}
}
//纵向连珠
for (int j = 0; j < 3; j++)
{
for (int i = 0; i < 1; i++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i + 1, j] &&
board[i, j] == board[i + 2, j] )
return board[i, j];
}
}
//两种斜向连珠
for (int i = 0; i < 1; i++)
{
for (int j = 0; j < 1; j++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i + 1, j + 1] &&
board[i, j] == board[i + 2, j + 2])
return board[i, j];
}
}
for (int i = 0; i < 1; i++)
{
for (int j = 2; j < 3; j++)
{
if (board[i, j] != 0 &&
board[i, j] == board[i + 1, j - 1] &&
board[i, j] == board[i + 2, j - 2] )
return board[i, j];
}
}
//平局(棋盘满)
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (board[i, j] == 0)
return 0;
}
}
return 3;
}
}
?主要改动就是把button的大小改大,然后让棋盘,连珠判断由20×20变3×3,5变成3。
其实后面的判断连珠可以简单一些减少循环,因为很多时候参数是固定的,不需要循环。因为棋盘长宽都和连珠长度一样。
当然这无所谓,应该没有人在乎。
项目地址:3dgameunity/Renju at master · 17343083/3dgameunity · GitHubContribute to 17343083/3dgameunity development by creating an account on GitHub.https://github.com/17343083/3dgameunity/tree/master/Renju
?游戏截图:
?附上演示的视频链接:
3d游戏第一次作业 井字棋游戏 17343083简介:3d游戏课程第一次作业 井字棋;更多实用攻略教学,爆笑沙雕集锦,你所不知道的游戏知识,热门游戏视频7*24小时持续更新,尽在哔哩哔哩bilibilihttps://www.bilibili.com/video/BV1Y34y1D7Yu?spm_id_from=333.999.0.0
|