C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋游戲
利用數(shù)組來(lái)創(chuàng)建一個(gè)三子棋小游戲的步驟如下:
1、建立一個(gè)可以容納九個(gè)元素的3*3棋盤(pán)。并初始化,使所有位置都為三。
2、打印棋盤(pán),使其盡可能美觀。
3、玩家通過(guò)輸入坐標(biāo)(row,col)來(lái)落子。
4、判斷輸贏(是否有三個(gè)棋子相連)。
5、電腦隨機(jī)落子(利用時(shí)間戳,實(shí)現(xiàn)真隨機(jī))。
6、判斷輸贏。
實(shí)現(xiàn)代碼如下:
#define MAX_ROW 3
#define MAX_COL 3
void init(char chess[MAX_ROW][MAX_COL]){
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
chess[row][col] = ' ';
}
}
}
//打印棋盤(pán)
void print(char chess[MAX_ROW][MAX_COL]){
printf("+--+--+--+\n");
for (int row = 0; row < MAX_ROW; row++){
printf("|");
for (int col = 0; col < MAX_COL; col++){
printf("%c |", chess[row][col]);
}
printf("\n+--+--+--+\n");
}
}
//玩家落子
void playerMove(char chessBoard[MAX_ROW][MAX_COL]){
while (1){
printf("請(qǐng)落子(row col)\n");
int row = 0;
int col = 0;
scanf("%d %d", &row &col);//錄入玩家落子信息
if (row >= MAX_ROW || row < 0 || col < 0 || col >= MAX_COL){
printf("落子錯(cuò)誤,請(qǐng)重新落子:\n");
continue;
}//判斷玩家落子的合法性。
else if (chessBoard[row][col] != ' '){
printf("您輸入的位置已經(jīng)有棋子,請(qǐng)重新輸入:\n");
continue;
}//判斷該位置是否已有棋子。
else{
chessBoard[row][col] = 'x';
break;
}//最終落子位置。
}
}
//電腦落子
void computerMove(char chessBoard[MAX_ROW][MAX_COL]){
while (1){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (chessBoard[row][col] != ' '){
continue;
}//已落子,更換位置。
chessBoard[row][col] = '0';
break;
}
}
//判斷棋盤(pán)是否已滿,如果滿輸出0,沒(méi)滿輸出1.
int isFull(char chessBoard[MAX_ROW][MAX_COL]){
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
if (chessBoard[row][col] == ' '){
return 1;
}
}
}
return 0;
}
//判斷誰(shuí)獲勝,可以約定如果返回‘x'玩家獲勝
//如果返回‘0'電腦獲勝
//返回‘ '則表示還未結(jié)束
//返回 's'表示和棋
char isGameover(char chessBoard[MAX_ROW][MAX_COL]){
for (int row = 0; row < MAX_ROW; row++){
if (chessBoard[row][0] != ' '&& chessBoard[row][0] == chessBoard[row][1] && chessBoard[row][0] == chessBoard[row][2]){
return chessBoard[row][0];
}
}//掃描所有行
for (int col = 0; col < MAX_COL; col++){
if (chessBoard[0][col] != ' '&& chessBoard[0][col] == chessBoard[1][col] && chessBoard[0][col] == chessBoard[2][col]){
return chessBoard[0][col];
}
}//掃描所有列
if (chessBoard[0][0] != ' '&& chessBoard[0][0] == chessBoard[1][1] && chessBoard[0][0] == chessBoard[2][2]){
return chessBoard[0][0];
}
if (chessBoard[0][2] != ' '&& chessBoard[0][2] == chessBoard[1][1] && chessBoard[0][2] == chessBoard[2][0]){
return chessBoard[0][2];
}//掃描斜行
if (isFull(chessBoard)){
return 's';
}//判斷是否和棋
return ' ';
}
//前面函數(shù)的調(diào)用
int main(){
char chessBoard[MAX_ROW][MAX_COL];
init(chessBoard);
char winner = ' ';
while (1){
print(chessBoard);//打印棋盤(pán)
playerMove(chessBoard);//玩家落子
winner = isGameover(chessBoard);
if (winner != ' '){
//游戲結(jié)束"
break;
}
computerMove(chessBoard);//電腦落子
winner = isGameover(chessBoard);
if (winner != ' '){
//游戲結(jié)束
break;
}
}
//輸出最終結(jié)果。
if (winner = 'x'){
printf("恭喜你,你贏了!\n");
}
else if(winner = '0'){
printf("蠢,你輸了!\n");
}
else{
printf("和棋!\n");
}
return 0;
}
實(shí)現(xiàn)結(jié)果如下圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用VS2019編譯CEF2623項(xiàng)目的libcef_dll_wrapper.lib的方法
這篇文章主要介紹了使用VS2019編譯CEF2623項(xiàng)目的libcef_dll_wrapper.lib的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
opencv實(shí)現(xiàn)圖片與視頻中人臉檢測(cè)功能
這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖片與視頻中人臉檢測(cè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C++中的std::funture和std::promise實(shí)例詳解
在線程池中獲取線程執(zhí)行函數(shù)的返回值時(shí),通常使用 std::future 而不是 std::promise 來(lái)傳遞返回值,這篇文章主要介紹了C++中的std::funture和std::promise實(shí)例詳解,需要的朋友可以參考下2024-05-05
C++類(lèi)與對(duì)象深入之運(yùn)算符重載與const及初始化列表詳解
運(yùn)算符是程序中最最常見(jiàn)的操作,例如對(duì)于內(nèi)置類(lèi)型的賦值我們直接使用=賦值即可,因?yàn)檫@些編譯器已經(jīng)幫我們做好了,但是對(duì)象的賦值呢?能直接賦值嗎2022-06-06
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序詳解
堆是計(jì)算機(jī)科學(xué)中一類(lèi)特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個(gè)可以被看做一棵完全二叉樹(shù)的數(shù)組對(duì)象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將通過(guò)圖片詳細(xì)介紹堆排序,需要的可以參考一下2022-03-03
C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟
在實(shí)際開(kāi)發(fā)中我們經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),針對(duì)不同類(lèi)型的數(shù)據(jù)庫(kù)(如MySQL、sqLite、Access、Excel等),如果采用不同的方法進(jìn)行連接,會(huì)把我們搞崩潰,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫(kù)并讀取數(shù)據(jù)的具體步驟,需要的朋友可以參考下2023-04-04

