作业要求
游戏内容:五子棋游戏、井字棋游戏或自己拟定主题(需要有创意)
技术限制:仅使用IMGUI构建UI
作业目的
了解 OnGUI() 事件,提升 debug 能力
提升阅读 API 文档能力
需求分析
棋盘大小为3x3
任意一格子只能有一个棋子
两位玩家(“叉”和“圈”)交替下棋,每次能且只能下一枚棋子
当出现:三个同种棋子连成一线时,判定此方获胜,游戏结束
游戏实现
下文分两步介绍游戏实现过程:制作UI和代码化表示游戏规则。
(一)制作UI
先选取合适的位置,合适的大小画出棋盘:
int w=Screen.width/2;
GUI.Box(new Rect(w-150,50,300,400),"井字棋");
再画出目前的游戏状态,比如play(游戏中),O win(玩家1胜利)等:
GUI.Box(new Rect(w-50,80,100,35),"Play!");
然后画出重置按钮,便于重新开始游戏:
if(GUI.Button(new Rect(w-50,415,100,35),"Reset"))
reset();
最后用border来表示各个位置的值,画出棋盘上的每个位置:
private int[][] border=new int[3][]{new int[3],new int[3],new int[3]};
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(border[i][j]==0){
GUI.Button(new Rect(w-150+i*100,115+j*100,100,100),"O");
}else if(border[i][j]==1){
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),"")){
//空按钮被点击的操作
}
}
}
}
UI的简要设计就完成了。下面是第二部分:用代码实现井字棋的逻辑。
(二)规则代码化
我们发现:主要的操作分为两部分,第一部分为点击空按钮是发生的事件,第二部分为点击reset按钮是发生的事件。
点击reset只需要重置所有变量即可,因此把重点放在实现空按钮点击即可。
空按钮点击时发生的事件:
判断当前游戏是否已经分出胜负,若分出胜负则不做任何操作:
private int end=0;
if(点击空按钮){
if(end==1) break;
}
改变当前位置的值为当前玩家所代表的值:
private int player=0;
if(点击空按钮){
border[i][j]=player;
}
判断这步之后是否分出胜负:
private int res=-1;
if(点击空按钮){
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;
}
使用res来标记当前游戏的状态,-1代表游戏正在进行,而0或者1代表决出胜负。
四行if:
第一行if用来判断同一列是否连成线;
第二行if用来判断同一行是否连成线;
第三四两行if用来判断对角线是否连成线。
判断是否平局:
private int cnt=0;
if(点击空按钮){
cnt++;
if(res!=-1 && cnt==9) res=2;
if(res!=-1) end=1;
}
使用变量cnt来表示已经点击过的空按钮数量,假如达到9而且未分出胜负,则平局。
res为2代表平局。
如果res不为-1,则代表游戏已经结束,改变end。
根据胜负改变"Play!"位置的值:
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),"Play!");
}
}
点击reset按钮发生的事件:
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;
}
}
}