用陣列寫三子棋游戲
建立一個井字棋盤,玩家與電腦分別下棋,三個棋子能連成一條線就獲勝,
玩家和電腦每次落子之后,都列印出棋盤的情況,并將其儲存,
1、前期準備作業
建立game.h頭檔案,text.c檔案, game.c檔案,
game.h頭檔案用于宣告函式,text.c檔案用于撰寫游戲流程,game.c檔案用于撰寫函式內容

2、設立選單、棋盤
在text.c內進行操作:
引入自定義頭檔案用#include “game.h”,不同于引入C語言自帶的頭檔案用< >,引入自定義的頭檔案要用" ",
設主函式:
int main()
{
text();
return 0;
}
設text函式:(因為需要游戲可以重復玩,所有使用do…while陳述句,在選單內輸入1進行游戲,輸入0退出游戲,輸入其他數字,提示錯誤)
void test()
{
int input = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸出錯誤,請重新輸入\n");
break;
}
}while(input);
}
設立選單menu函式:
void menu()
{
printf("********************************\n");
printf("*********1.play 0.exit**********\n");
printf("********************************\n");
}
輸出的結果如下圖:

設立棋盤
棋盤為一個3*3而且沒有邊框的井字形狀,需要用到設定陣列board[ ][ ]代表坐標,
在game.h頭檔案進行定義,定義ROW 為行,并且值為3,COL為列,值也為3,
#define ROW 3
#define COL 3
定義函式DispalyBoard 列印棋盤
i代表行,j代表列,第一行先列印(空格)%c(空格) 說明玩家輸入坐標或者電腦進行隨機填空時,輸入的一個字符*或者#,之后列印 | 進行豎分割,但只列印兩個豎分割符號,之后進行換行列印- - -進行橫分割,之后列印 | 進行豎分割,
void DispalyBoard (char board[ROW][COL],int row ,int col)
{
int i = 0;
for(i = 0; i<row; i++)
{
int j = 0;
for(j=0; j<col; j++)
{
printf(" %c ",board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i< row-1)
{
for(j = 0; j<col; j++)
{
printf("---");
if(j < col-1)
printf("|");
}
printf("\n");
}
}
}
列印出來的結果如下:

3、設定玩家下棋,電腦下棋,
玩家下棋
讓玩家輸入X,Y坐標,并在棋盤上顯示,用“*”,因為陣列的下標是從0開始,當時輸入坐標是1~3,所以需要在設計陣列時,需要進行-1操作,如果輸入的坐標上已有值,提示“該坐標已經有棋子”,并重新輸入,如果輸入超過3的值,則提醒:“坐標非法,請重新輸入!”
自定義函式PlayerMove ( )
void PlayerMove(char board[ROW][COL],int row ,int col)
{
int x= 0;
int y= 0;
printf("玩家走:>\n");
while(1)
{
printf("請輸入要下棋的坐標:>");
scanf("%d%d",&x,&y);
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(board[x-1][y-1] == ' ')
{
board[x-1][y-1] = '*';
break;
}
else
{
printf("該坐標已經有棋子\n");
}
}
else
{
printf("坐標非法,請重新輸入!\n");
}
}
}
電腦下棋
電腦下棋使用srand函式以時間來呼叫rand函式:srand((unsigned) time(NULL));
在test函式內呼叫srand函式,用“#”代表電腦下棋
自定義ComputerMove函式:
void ComputerMove(char board[ROW][COL],int row ,int col)
{
int x = 0;
int y = 0;
printf("電腦走:>\n");
while(1)
{
x = rand() %row;
y = rand() %col;
if(board[x][y]== ' ')
{
board[x][y] = '#';
break;
}
}
}
X= rand()%row,說明X的取值范圍就在1~ 3,同理,Y的取值范圍也是1~ 3,
設定好玩家與電腦的下棋步驟之后,需要在每次玩家或者電腦落棋之后,列印出棋盤情況,需要在函式下,加入列印棋盤函式DispalyBoard()即:
PlayerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
ComputerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
四、判斷獲勝條件
游戲分別有以下三種情況:
- 1、其中一方獲勝:當有一方的棋子連成一條線,即三個相同棋子連成一條豎線或者橫線,再或者斜線,
- 2、雙方平局:當所有的格子都已經有棋子,并且沒有出現三子連線的情況,雙方平局,
- 3、游戲繼續:當棋盤還有空格子,并且沒有出現三子連線的情況,游戲繼續,
由于獲勝條件需要在每一方落子之后,進行判斷,所以在PlayMove函式和ComputerMove函式加入IsWin函式,用于判斷游戲情況,
1)其中一方獲勝:
char IsWin(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][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[1][i] != ' ' )
{
return board[1][i];//判斷縱向是否有三子相等,而且不是空格子,若相等,回傳表達贏家的值
}
}
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[2][2] != ' ' )
{
return board[1][1];
}
if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ' )
{
return board[1][1];//判斷斜對角線是否有三子相等,而且不是空格子,若相等,回傳表達贏家的值
2)雙方平局:
設定IsFull()函式判斷上述沒有出現獲勝情況,并且格子已滿,
int IsFull(char board[ROW][COL],int row ,int col)
{
int i= 0;
int j= 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if(board[i][j] ==' ')
{
return 0;
}
}
}
return 1;
}
...
if (1 == IsFull(board,ROW,COL))
{
return 'Q';
}
3)游戲繼續:
當上述兩種情況都沒有發生時,游戲依然處于進行當中,所以需要在IsWin函式最后加入return ‘c’;代表游戲繼續,
此時游戲可以正常運行:

完整代碼為:
game.h檔案下:
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InitBoard(char board[ROW][COL],int row, int col);
void DispalyBoard (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 IsWin(char board[ROW][COL],int row ,int col);
int IsFull(char board[ROW][COL],int row ,int col);
game.c檔案下:
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROW][COL],int row, int col)
{
int i = 0;
int j = 0;
for (i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
board[i][j]= ' ';
}
}
}
void DispalyBoard (char board[ROW][COL],int row ,int col)
{
int i = 0;
for(i = 0; i<row; i++)
{
int j = 0;
for(j=0; j<col; j++)
{
printf(" %c ",board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i< row-1)
{
for(j = 0; j<col; j++)
{
printf("---");
if(j < col-1)
printf("|");
}
printf("\n");
}
}
}
void PlayerMove(char board[ROW][COL],int row ,int col)
{
int x= 0;
int y= 0;
printf("玩家走:>\n");
while(1)
{
printf("請輸入要下棋的坐標:>");
scanf("%d%d",&x,&y);
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(board[x-1][y-1] == ' ')
{
board[x-1][y-1] = '*';
break;
}
else
{
printf("該坐標已經有棋子\n");
}
}
else
{
printf("坐標非法,請重新輸入!\n");
}
}
}
void ComputerMove(char board[ROW][COL],int row ,int col)
{
int x = 0;
int y = 0;
printf("電腦走:>\n");
while(1)
{
x = rand() %row;
y = rand() %col;
if(board[x][y]== ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(char board[ROW][COL],int row ,int col)
{
int i= 0;
int j= 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if(board[i][j] ==' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(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][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[1][i] != ' ' )
{
return board[1][i];
}
}
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[2][2] != ' ' )
{
return board[1][1];
}
if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ' )
{
return board[1][1];
}
if (1 == IsFull(board,ROW,COL))
{
return 'Q';
}
return 'c';
}
text.c檔案下:
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("********************************\n");
printf("*********1.play 0.exit**********\n");
printf("********************************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL]={0};
InitBoard(board,ROW,COL);
DispalyBoard(board,ROW,COL);
while(1)
{
PlayerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
ret = IsWin(board,ROW,COL);
if(ret != 'c')
{
break;
}
ComputerMove(board,ROW,COL);
DispalyBoard(board,ROW,COL);
ret = IsWin(board,ROW,COL);
if(ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏\n");
}
else if (ret == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸出錯誤,請重新輸入\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
缺點就是電腦下棋都是隨機的,只要帶著腦子玩這個游戲,基本不會輸,我也想寫出有腦子的電腦,奈何我還不會 ╮(╯_╰)╭
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276691.html
標籤:其他
上一篇:撲克牌算24點
