C語言實作三字棋小游戲
- 前言
- 游戲效果
- 游戲實作
前言
本三字棋小游戲是依靠二維陣列為核心來實作的,可以更加好理解掌握c語言陣列的概念知識,依靠做小游戲專案,把學到了知識在輸出出來加已鞏固,最后有源代碼
游戲效果

游戲實作
1.做出游戲選單
2.游戲棋盤的創建
3.游戲開始下棋
4.判斷游戲結束
5.源代碼
printf("******************\n");
printf("**** 1.play ******\n");
printf("**** 0.exit *****\n");
printf("******************\n");
在到main函式中呼叫
2.游戲棋盤的創建

這里可以看見玩家的落子的位置,和電腦落子的位置都給記錄下來了,所以這里寫一個game()函式
1.創建存盤資料的容器

char board[3][3];
- 這里有個問題就是要是以后我們不想只玩三字棋,想玩五子棋,或者十字棋怎么辦呢?
- 陣列大小寫死了,缺少了靈活性,所以我們試著把陣列大小寫都頭檔案去,以后只要應用一下頭檔案就可以獲取變數了,而且以后修改只需要改頭檔案里面的變數就可以了,

創建一個頭檔案,里面定義陣列大小

創建一個game.c的檔案,函式的實作在這個檔案里
#pragma once
#define ROW 3
#define COL 3

前臺參考一下頭檔案,這樣就可以到處使用剛剛定義的變數了
2.初始化棋盤
-
其實初始化棋盤,就是往棋盤里面放空格
這里的引數是要傳過去一個棋盤,和具體的幾行幾列,才好把每一個二維陣列添加空格子進去

頭檔案里面宣告一下
game函式里面,定義一個初始化棋盤函式
InitBorad(board,ROW,COL);

初始化棋盤函式的實作,是在game.c檔案里面實作

void InitBorad(char borad[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i=0 ; i < row; i++)
{
for ( j = 0; j < col; j++)
{
borad[i][j] = ' ';
}
}
}
2.列印棋盤
- 在game.h定義列印棋盤函式

- 在主方法test.c檔案,引入列印棋盤函式

- 實作列印棋盤函式
void DisplayBoard(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)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}

3.游戲開始下棋
- 玩家下棋
game.h里面定義函式

void PlayerMove(char board[ROW][COL],int row,int col);
test.c里面參考函式

PlayerMove(board,ROW,COL);
DisplayBoard(board, ROW, COL); //玩家下好棋 列印棋盤
game.c里面實作玩家下棋函式

void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下>\n");
while (1)
{
printf("請輸入下棋的坐標:>");
scanf("%d %d\n",&x,&y);
if (x>=1 && x<=row && y>=1 && y<=col) //判斷下棋落子 是否在坐標內
{
if (board[x-1][y-1] == ' ') //因為用戶 并不是程式員不知道陣列是從0開始的,所以減1
{
board[x - 1][y - 1] == '*'; //用戶下子 *代替
break;
}
else
{
printf("坐標已有棋,請重新輸入\n");
}
}
else
{
printf("坐標非法,請重新輸入\n");
}
}
}
- 電腦下棋
在game.h里面定義一個電腦下棋函式

void ComputerMover( char board[ROW][COL],int row, int col);
在主方法main里面參考

在game.c里面實作電腦下棋

void ComputerMover(char board[ROW][COL], int row, int col)
{
printf("電腦下:>\n");
while (1)
{
int x = rand() % row; //%3 就是余數0-2
int y = rand() % col;
if (board[x][y] ==' ') //電腦判斷是否是可下的地方
{
board[x][y] = '#'; //電腦下棋
break;
}
}
}
注意rand()函式要搭配srand()函式一起使用

亂數需要參考的頭檔案,直接在game.h 檔案里面參考

4.判斷輸贏
-
在寫之前,我們是否需要定一個規矩,游戲輸贏有4種情況
1.玩家贏了 - *
2.電腦贏了 - #
3.平局 - Q
4.游戲繼續 - C立下這個規則,我們才正式開始
在game.h定義函式

char IsWin(char board[ROW][COL], int row, int col);
在test.c 寫入以下代碼

char ret = 0; //接受游戲狀態
while (1)
{
//玩家玩
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL); //玩家下好棋 列印棋盤
ret = IsWin(board, ROW, COL); //判斷輸贏
if (ret != 'C') //C是我們的繼續,如果我們不是C 那就是其他的結局 那么游戲結束
{
break;
}
//電腦玩
ComputerMover(board, ROW, COL);
DisplayBoard(board, ROW, COL); //電腦下好棋 列印棋盤
ret = IsWin(board, ROW, COL); //判斷輸贏
if (ret != 'C') //C是我們的繼續,如果我們不是C 那就是其他的結局 那么游戲結束
{
break;
}
}
if (ret == '*')
{
printf("玩家贏了");
}
else if (ret == '#')
{
printf("電腦贏了");
}else
{
printf("平局\n");
}
DisplayBoard(board, ROW, COL); //電腦下好棋 列印棋盤
在game.c實作函式

//判斷游戲是否有輸贏
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[2][i] != ' ')
{
return board[1][i]; //不管里面是什么元素 都要回傳回去
}
}
//對角線
if(board[0][0] == board[1][1]&& board[1][1]==board[2][2]&&board[1][1]!=' ')
{
return board[1][1];
}
//對角線
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判斷平局
//如果棋盤滿了回傳1 ,不滿回傳 0
int ret = IsFull(board, row, col); //是否棋盤滿
if (ret == 1 )
{
return 'Q';
}
//繼續
return 'C';
}
里面有個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; //滿了回傳1
}
好了以上就是三字棋小游戲的代碼了,快來自己動手實作一下吧,這需要一定的二維陣列基礎知識,其實代碼實作不難,嘗試去做就可以了,
三字棋源代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282740.html
標籤:其他
上一篇:背包問題——無限物品的背包問題,0-1背包問題與勁歌金曲(uva12563)
下一篇:DAY 13

