十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
三字棋大家應(yīng)該不陌生,那么如何去利用C/C++去實(shí)現(xiàn)三字棋游戲的書寫呢?
下面這些代碼將會帶你寫出三字棋(我優(yōu)化的不是很好):
1.? 前期準(zhǔn)備創(chuàng)建文件目錄如下圖
文件目錄創(chuàng)建好了過后,就開始準(zhǔn)備書寫了,最后寫好的代碼會放在文章末尾。
2.?初始化棋盤因?yàn)槿制宓哪邮窍旅孢@樣的:
創(chuàng)建一個二維數(shù)組,就可以存放電腦與你下的棋字的位置信息。
于是,初始化棋盤代碼段:
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] = ' ';
}
}
}
3.?打印棋盤創(chuàng)建好棋盤過后,要去打印棋盤;打印棋盤的代碼段如下(個人寫的不好,自己可以嘗試修改):
void Displayboard(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++)
{
printf(" %c ", board[i][j]);
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
for (j = 0; j< col - 1; j++)
{
if (i< row - 1)
{
printf("---");
if (j< col - 1)
{
printf("|");
}
}
}
if (i< row - 1)
{
printf("---");
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
}
}
然后就可以得到打印出來的棋盤了:
使用char ret? 來獲取游戲狀態(tài)的參變量,然后就是玩家與電腦輪流進(jìn)行下棋了,玩家下棋為“*”;電腦下棋為“#”,然后如果某一方贏了,ret中將會得到返回值"*"或者“#”。當(dāng)然,也有可能平局,也可能沒有產(chǎn)生結(jié)果。所以,設(shè)置四個可能的ret來獲取游戲的狀態(tài):*:玩家贏了,#:電腦贏了,C:繼續(xù)游戲, Q:平局了。寫出的兩個判斷函數(shù)如下(棋盤滿了,沒有分出勝負(fù),則平局;)
5.?判斷平局條件: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;
}
6.?判斷勝負(fù)條件:char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
//判斷3行
for (i = 0; i< row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][1];
}
}
//判斷3列
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[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];
}
//上述是判斷是否贏了,接下來判斷是否平局
int ret = IsFull(board, row, col);
if (ret == 1)
{
return 'Q';
}
return 'C';
}
7.?玩家下棋:void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("請輸入你要下入的坐標(biāo):>\n");
while (1)
{
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("這個地方已經(jīng)有棋子了!\n");
}
}
else
{
printf("坐標(biāo)非法,重新輸入:\n");
break;
}
}
}
8.?電腦下棋:void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("電腦下棋 :>\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
9.?一些說明:在生成隨機(jī)數(shù)的時候,需要引用頭文件:#include
且在主函數(shù)中,需要用到srand((unsigned int)time(NULL));來利用當(dāng)前的時間戳生成隨機(jī)數(shù)。
#define _CRT_SECURE_NO_WARNINGS 1? ? ? ? 這行是為了解決使用scanf時的提醒
三字棋總體來說不是很復(fù)雜,只要能夠理清楚邏輯,再一步步去解決邏輯框架中的問題,那么就可以順利實(shí)現(xiàn)三字棋了!
在其中,我在test中的game函數(shù)中提前創(chuàng)建了board數(shù)組,然后利用數(shù)組名(首元素地址),來實(shí)現(xiàn)其他函數(shù)對于數(shù)組的內(nèi)容修改。(具體知識點(diǎn)請參考指針)
10.?頭文件game.h(全部內(nèi)容)#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include#include#includevoid 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 IsWin(char board[ROW][COL], int row, int col); //判斷是否贏了
11.源文件game.c的全部內(nèi)容#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 Displayboard(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++)
{
printf(" %c ", board[i][j]);
if (j< col - 1)
{
printf("|");
}
}
printf("\n");
for (j = 0; j< col - 1; j++)
{
if (i< row - 1)
{
printf("---");
if (j< col - 1)
{
printf("|");
}
}
}
if (i< row - 1)
{
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("請輸入你要下入的坐標(biāo):>\n");
while (1)
{
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("這個地方已經(jīng)有棋子了!\n");
}
}
else
{
printf("坐標(biāo)非法,重新輸入:\n");
break;
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("電腦下棋 :>\n");
while (1)
{
int x = rand() % row;
int 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;
//判斷3行
for (i = 0; i< row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][1];
}
}
//判斷3列
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[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];
}
//上述是判斷是否贏了,接下來判斷是否平局
int ret = IsFull(board, row, col);
if (ret == 1)
{
return 'Q';
}
return 'C';
}
12.?源文件test.c的全部內(nèi)容:#define _CRT_SECURE_NO_WARNINGS 1
#include#include "game.h"
void meun()
{
printf("**********************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("**********************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
Initboard (board, ROW, COL);
Displayboard (board, ROW, COL);
char ret = 0; //獲取游戲狀態(tài)的參變量
while (1)
{
PlayerMove(board, ROW, COL); //玩家下棋,且打印棋盤
Displayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
ComputerMove(board, ROW, COL);
Displayboard(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret = '#')
printf("玩家獲勝!\n");
else if (ret = '*')
printf("電腦獲勝!\n");
else
printf("平局,游戲繼續(xù)");
Displayboard(board, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
meun();
printf("請選擇:>");
scanf("%d",&input);
switch(input)
{
case 1:
printf("三子棋游戲\n");
game();
break;
case 0:
printf("游戲結(jié)束\n");
break;
default:
printf("輸入非法字符,請重新輸入:>\n");
}
} while (input);
return 0;
}
13.?總結(jié):三字棋總體來說不是很復(fù)雜,只要能夠理清楚邏輯,再一步步去解決邏輯框架中的問題,那么就可以順利實(shí)現(xiàn)三字棋了!
在其中,我在test中的game函數(shù)中提前創(chuàng)建了board數(shù)組,然后利用數(shù)組名(首元素地址),來實(shí)現(xiàn)其他函數(shù)對于數(shù)組的內(nèi)容修改。(具體知識點(diǎn)請參考指針)
最后,祝各位工作學(xué)習(xí)順利
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧