上篇博客實作了三子棋的小游戲,那么如何實作五子棋和多子棋呢?
文章目錄
- 棋盤外觀的小優化
- 第一類五子棋
- 第二類五子棋
- 多子棋
- 寫在后面
??先說一下棋盤的問題,因為后期我在測驗的時候,不能一眼看出來棋落子的坐標,所以對棋盤進行了一點小優化,我只優化了3X3—9X9的棋盤布局,因為10X10的話,縱坐標10會占兩個空,需要另外設計,效果如下:

棋盤外觀的小優化
??對棋盤列印函式做了如下改變,新增和改動已在注釋標出,
//列印棋盤
void DisplayBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < col; i++) //新增
{
if (i == 0) //新增
{
printf(" %d ", i + 1);//新增
}
else //新增
{
printf("%d ", i + 1);
}
}
printf("\n"); //新增,棋盤網格上加入相應列數
for ( int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (j == 0) //新增
{
printf("%d %c |",i+1,board[i][j]); //新增,在第一列之前列印出相應行數,
}
else if (j>0 && j < col - 1) //改動
{
printf(" %c |", board[i][j]);
}
else
printf(" %c ", board[i][j]);
}
printf("\n");
if (i < row - 1)
{
for (int k = 0; k < col; k++)
{
if (k == 0)
{
printf(" ---|");
}
else if (k>0 && k < col - 1)
{
printf("---|");
}
else
{
printf("---");
}
}
}
printf("\n");
}
}
??說明一下,我理解的五子棋這里有兩種:
- 5X5的棋盤,行、列、對角線連成線,即為游戲勝利,
- 多行X多列,行、列,對角線存在五子成線,即為游戲勝利,
??這里的多子棋指的是:
- 多行X多列,行、列、對角線存在N子成線,即為游戲勝利,
??下面逐一對游戲實作程序進行分析,
第一類五子棋
??思考在原有的三子棋基礎上改變哪些量可以實作第一類五子棋,
- 棋盤大小(五行&五列)
- 勝負判斷條件(行,列,對角線存在五子連線)
??對原有三子棋程式做出如下更改,
- 改變宏定義中
ROW和COL的值為5,意思是棋盤的規格是五行五列,頭檔案更改后的代碼如下,
//宏定義
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 5
#define COL 5
//參考庫函式
#include<stdio.h>
#include<stdlib.h>
//函式宣告
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char Win(char board[ROW][COL], int row, int col);
char Full(char board[ROW][COL], int row, int col);
- 勝負判斷條件
//判斷勝負
char Win(char board[ROW][COL], int row, int col)
{
int i = 0;
//判斷行
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][2] == board[i][3] && board[i][3] == board[i][4] && board[i][1] != ' ')//行元素一樣且不是空格
{
return board[i][1];
}
}
//判斷列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] &&board[2][i] == board[3][i] && board[3][i] == board[4][i] && board[1][i] != ' ')//列元素一樣且不是空格
{
return board[1][i];
}
}
//判斷對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] &&board[2][2] == board[3][3] && board[3][3] == board[4][4] && board[1][1] != ' ')//對角線元素一樣且不是空格
{
return board[1][1];
}
if (board[4][0] == board[3][1] && board[3][1] == board[2][2] && board[2][2] == board[1][3] && board[1][3] == board[0][4] &&board[2][2] != ' ')
{
return board[1][1];
}
//判斷是否平局
if (1 == Full(board, ROW, COL))//平局判斷,函式在下面,已在頭檔案中宣告,位置就無所謂了
{
return 'Q';
}
return 'C';
}
??經測驗,程式可執行,且無bug,
第二類五子棋
??思考在原有的第一類五子棋的基礎上改變和加入哪些量可以實作第二類五子棋,
- 棋盤大小(多行多列,以9*9的棋盤為例)
- 勝負判斷條件(行,列,對角線存在五子連線)
??對原有的三子棋(第一類五子棋)程式做出如下更改,
- 改變宏定義中
ROW和COL的值為9,意思是棋盤的規格是九行九列,頭檔案更改后的代碼如下
//新加入一個CHESS常量,意味設定幾個棋子連線為勝利,
//宏定義
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 9
#define COL 9
#define CHESS 5//!!!!新加入的量
//參考庫函式
#include<stdio.h>
#include<stdlib.h>
//函式宣告
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char Win(char board[ROW][COL], int row, int col);
char Full(char board[ROW][COL], int row, int col);
- 勝負判斷條件
char Win(char board[ROW][COL], int row, int col)//五子棋
{
int x = 0;
int y = 0;
int i = 0;
for (x = 0; x < row; x++)
{
for (y = 0; y < col; y++)
{
//縱向
for (i = 0; i < CHESS - 1; i++)
{
if (board[x][y] == board[x][y + i] && board[x][y] != ' ')
{
continue;
}
else
break;
}
if (board[x][y] == board[x][y + i] && board[x][y] != ' ')
{
return board[x][y];
}
//橫向
for (i = 0; i < CHESS - 1; i++)
{
if (board[x][y] == board[x + i][y] && board[x][y] != ' ')
{
continue;
}
else
break;
}
if (board[x][y] == board[x + i][y] && board[x][y] != ' ')
{
return board[x][y];
}
//捺 斜向
for (i = 0; i < CHESS - 1; i++)
{
if (board[x][y] == board[x + i][y + i] && board[x][y] != ' ')
{
continue;
}
else
break;
}
if (board[x][y] == board[x + i][y + i] && board[x][y] != ' ')
{
return board[x][y];
}
//撇 斜向
for (i = 0; i < CHESS - 1; i++)
{
if (board[x][y] == board[x - i][y + i] && board[x][y] != ' ')
{
continue;
}
else
break;
}
if (board[x][y] == board[x - i][y + i] && board[x][y] != ' ')
{
return board[x][y];
}
}
}
if (Full(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
??經測驗,程式可執行,且無bug,
多子棋
??思考在原有的第二類五子棋上改變和添加哪些量可以實作多子棋,
其實在這里將五子棋和多子棋分開是為了更好的理解
多子棋的實作只要更改第二類五子棋中宏定義下的
ROWCOLCHESS三個值就可以實作了
- 比如更改下面的代碼代表游戲模式為13*13的方陣棋盤中,六子成龍(六個棋子連成一條線)即為勝利
#define ROW 13
#define COL 13
#define CHESS 6
- 下面的代碼代表15*15的方陣棋盤中,八子成龍(八個棋子連成一條線)即為勝利
#define ROW 15
#define COL 15
#define CHESS 8
寫在后面
??這篇博客對原有的三子棋進行了擴展,擴展到了五子棋以及多子棋,但是電腦下棋的演算法采用的仍然是偽亂數,電腦還是個智障,下篇博客對電腦演算法進行優化吧,
??依然如此,如果上述程式中的代碼邏輯或者是表述有問題,還請各位大佬批評指正哈,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256699.html
標籤:其他
