设计的游戏的实现较为简单易懂,适合上手。
题主在这里使用了Visual Stdio 2019。包括VS中自带的C#库、以及较易使用的winForm界面。
以下是这个游戏github链接:GitHub - KANIOYH/Gobang: A simple gobang game
如果觉得有帮助,烦请帮题主在github右上角点一颗Star;
首先我们来分析一下五子棋的游戏规则:
棋盘由若干条横纵线交错构成
- 落子位置在线交点处
- 两人对战,轮流下棋
- 棋子只有两种黑或白
- 每次只允许下一颗棋子
- 率先连成五颗相同棋子即为获胜
- 落子位置不可以重合
五子连线获胜情况可分为如下四类:
已悉知规则后,我们现在来考虑如何将一局游戏的信息进行存储 。
我们可以从整个棋盘的落子位置来入手。一个棋盘有若干个可放置棋子的交点。交点只有三种状态:还未落子、已落黑子、已落白子。
这些交点是横竖有规律排列的点阵,因此我们可以由行和列来确定一个点的位置。这样的排列特性与二维数组相似。因此我们可以利用二维数组来存储一个棋盘。
int[,] table = new int[39, 39];//新建一个二维数组,长宽均为39
接下来我们要在table数组中表示每个交点的状态。可以这样进行表示:
0:还未落子; 1:已落白子;-1:已落黑子。
我们现在已经有了基本的下棋方法了,代码示例如下:
void putPiece(int x,int y){
table[x,y] = 1;//代表第(x+1)行,第(y+1)列下了一个白色棋子 ps:从0开始
}
然后,我们还需要让下棋的两个玩家轮流下棋,即为黑白棋子交替放置。这里可以设置一个变量来表示当前下棋的玩家,每次下完棋后,我们需要改变当前的玩家,代码示例如下:
int nowPlayer = 1;
int putPiece(int x,int y,int nowPlayer){
table[x,y] = nowPlayer;
return changePlayer(nowPlayer);
}
int changePlayer(int nowPlayer){
return -1 * nowPlayer;
}
修改后的方法里,putPiece方法直接让落子位置的值等于了当前玩家(即nowPlayer)的值,然后利用changePlayer方法将nowPlayer取反,实现正负值交替。
我们还知道,在落子的时候要保证当前拟位置没有棋子,所以我们还需要一个判断是否可以落子的判别方法,发现当前数组位置值为0才允许落子。代码示例如下:
bool isOK(int x,int y){
bool flag = false;
if(table[x,y] == 0){
flag = True;
}
return flag;
}
现在我们已经有了基本的对弈结构了,将上述方法稍加组织,示例代码如下:
int[,] table = new int[39, 39];//新建一个二维数组,长宽均为39
init(tabel)//初始化,所有值赋0
int nowPlayer = 1;
bool flag = True;
while(flag){
flag = isWin(table); //胜利判断方法
while(True){ //直到找到能下棋的落点为止
int x = getNowX();
int y = geyNowY();
if( isOK(x,y) ){
putPiece(x,y);
break; //可以下棋,跳出true循环
}
}
}
代码段中给出了isWin方法,后续文章将会更新isWin方法的具体内容。
To be continue...
待续...