本文小編為大家詳細(xì)介紹“如何用C語言代碼實(shí)現(xiàn)三子棋小游戲”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“如何用C語言代碼實(shí)現(xiàn)三子棋小游戲”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),長白企業(yè)網(wǎng)站建設(shè),長白品牌網(wǎng)站建設(shè),網(wǎng)站定制,長白網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,長白網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
有一個(gè)3*3的棋盤
每次下棋后(電腦和玩家),棋盤會更新數(shù)據(jù)
會有菜單提示相關(guān)命令進(jìn)行相關(guān)操作
下棋方法是輸入坐標(biāo)
每一局游戲結(jié)束后,會詢問是否繼續(xù).
任何一個(gè)項(xiàng)目的實(shí)現(xiàn),最重要的就是邏輯結(jié)構(gòu)搭建,而各個(gè)功能的實(shí)現(xiàn)就是采取函數(shù)(模塊化)進(jìn)行細(xì)分.
所以我們需要搭建邏輯,那么邏輯結(jié)構(gòu)是啥呢?
首先會跳出提示菜單,內(nèi)容為 0退出游戲,1開始/繼續(xù)游戲,其他鍵提示錯(cuò)誤,并重新輸入
按0后提示 “成功退出游戲”
按1開始游戲
#include <stdio.h> int main() { int input = 0; do { remind(); // 提示菜單 scanf("%d",&input); //開始輸入命令 switch (input) { case 0: printf("成功退出游戲 "); break; case 1: playgame(); // 開始游戲 printf("是否繼續(xù)游戲 "); break; default : printf("命令錯(cuò)誤,請重新選擇 "); break; } } while (input); return 0; }
前面的邏輯結(jié)構(gòu)已經(jīng)搭建,而我們需要實(shí)現(xiàn)的就是 playgame()模塊.
那么他的功能邏輯是啥呢??
棋盤內(nèi)容用二維數(shù)組存儲
初始化棋盤(即棋盤上還沒有下子).所以初始化是一個(gè)單獨(dú)模塊
對弈分為兩個(gè)模塊(電腦下子與玩家下子)
每一局對弈后,都要判斷電腦或玩家是否贏.(所以又是一個(gè)單獨(dú)的判斷輸贏模塊)
#define row 3 #define col 3 void playgame() { char board[row][col]; // 存儲下子內(nèi)容 int result = 0; //用來接收Iswin函數(shù)判斷的返回值 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態(tài) while (1) //開始進(jìn)行對弈,直到一方贏或者平局結(jié)束循環(huán) { player(board, row, col); //玩家下子函數(shù) if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數(shù)的設(shè)定是如果玩家勝利,返回1 computer(board, row, col); //電腦下子函數(shù) if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數(shù)的設(shè)定是 如果電腦勝利,返回-1 if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續(xù)對弈 } if (result == 1) printf("恭喜您取得勝利!!!!!!!!! "); else if (result == -1) printf("你也太辣雞了吧,電腦都下不贏 "); else printf("哎~~,你的技術(shù)不行啊,居然和電腦達(dá)成平手 "); }
解釋:
可以清晰的明白playgame()函數(shù)的邏輯結(jié)構(gòu).
其中有一步驟是這樣的if (Iswin(board, row, col) >= 0),它的執(zhí)行是先調(diào)用函數(shù)(滿足我們需要判斷誰贏的要求),再利用返回結(jié)果判斷是否結(jié)束循環(huán),一條程序就達(dá)到兩個(gè)效果,比較妙.
0.remind函數(shù)實(shí)現(xiàn)
就是起到一個(gè)提示作用,直接打印就行.
void remind() { printf("+------------------------------------------+ " "+-------------- 0 結(jié)束游戲 --------------+ " "+----------- 1 開始/繼續(xù)游戲 ------------+ " "+------------------------------------------+ "); }
1.Initboard函數(shù)實(shí)現(xiàn)
既然是初始化函數(shù),說明我們的要求就是把二維數(shù)組board初始化為全空格.
void Initboard(char(*board)[3],int Row,int Col ) { int i = 0, j = 0; for (i = 0; i < Row; i++) { for (j = 0; j < Col; j++) { board[i][j] = " "; // 賦予空格 } } }
2.Displayboard函數(shù)實(shí)現(xiàn)
顯示棋盤內(nèi)容顯示的不止是二維數(shù)組board的內(nèi)容,還要加上邊界(如圖),所以Displayboard的要求是什么?
既要顯示邊界,也要顯示board的存儲內(nèi)容.
而顯示邊界我們可以分成小塊循環(huán)顯示,比如看成3個(gè)條形加上最后下邊界
每一個(gè)條形又可以看成三個(gè)小方塊加上小右邊界
void Displayboard(char(*board)[3], int Row, int Col) { int i = 0, j = 0; for (i = 0; i < Row; i++) { printf("+---+---+---+ "); //打印小條形的上邊界 for (j = 0; j < Col; j++) { printf("| %c ",board[i][j]); //打印小條形中的方塊內(nèi)容 } printf("| "); //補(bǔ)上 小右邊界 } printf("+---+---+---+ "); //補(bǔ)上 下邊界 }
3.player函數(shù)實(shí)現(xiàn)
玩家下棋采用的是坐標(biāo)輸入方式
玩家輸入一個(gè)坐標(biāo),那么棋盤上的相應(yīng)位置就應(yīng)該更新.(相應(yīng)位置用 * 表示)
輸入坐標(biāo)時(shí)候還要檢驗(yàn)該位置是否已經(jīng)落子了.
void player(char(*board)[3], int Row, int Col) { printf("請分別輸入橫縱坐標(biāo)(輸入數(shù)據(jù)請用空格隔開): "); scanf("%d%d", &Row, &Col); while (1) { if (((1 <= Row) && (Row <= 3)) //邊界必須合格,且該地方無子 && ((1 <= Col) && (Col <= 3)) && (board[Row-1][Col-1] == " ")) { board[Row - 1][Col - 1] = "*"; //之所以Row - 1 Col - 1是考慮到玩家不一定是程序員,他不知道編程從0開始數(shù) break; } else { printf("請仔細(xì)堅(jiān)持你的坐標(biāo)位置,是否已經(jīng)落子或坐標(biāo)超界,然后重新輸入坐標(biāo). "); printf("請輸入坐標(biāo): "); scanf("%d%d", &Row, &Col); } } printf("下子成功! "); Displayboard(board, row, col); // 無論是玩家還是電腦下子,都需要顯示出下子內(nèi)容 }
4.Iswin函數(shù)實(shí)現(xiàn)
玩家或者電腦下子后,需要判斷雙方有一方是否贏.
Iswin的作用就是判斷是否有一方贏.
其中返回值1代表玩家勝利,返回值0代表平局,返回值-1代表電腦贏
判斷勝利方法就是檢查每行每列以及斜線是否有一樣的,以及是否不輸不贏
int Iswin(char(*board)[3], int Row, int Col) { //怎么判斷一方贏?? 橫,豎,斜線只要都一樣,則可以知道一方贏(全是空格除外) for (int i = 0; i < Row; i++) //每一行 { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != " ")) { if (board[i][0] == "*") return 1; //如果一行都是*,說明玩家勝利,否則電腦勝利 return -1; } } for (int j = 0; j < Col; j++) //每一列 { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[0][j] != " ")) { if (board[0][j] == "*") return 1; //如果一列都是*,說明玩家勝利,否則電腦勝利 return -1; } } if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != " ")) //斜線 ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != " "))) { if (board[1][1] == "*") return 1; return -1; } for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { if (board[i][j] == " ") return -2; //如果前三者情況都沒有,只要目前棋盤上還剩下空余位置 //就說明不輸不贏,需要繼續(xù)對弈.返回[-1,1]之外的值就行 } } return 0; //除去上面4種情況就是平局 }
5.computer函數(shù)實(shí)現(xiàn)
由于是電腦下載,我們無法操作,于是只有讓電腦隨機(jī)下載了.缺陷是電腦就有點(diǎn)智障了,哈哈.
#include <stdlib.h> #include <time.h> void computer(char(*board)[3], int Row, int Col) { srand(time(NULL)); while (1) { int i = rand() % 3; int j = rand() % 3; if (board[i][j] == " ") { board[i][j] = "#";//#代表電腦下子 break; } } printf("電腦已下子: "); Displayboard(board, row, col); //電腦下子后,顯示棋盤 }
#include <stdio.h> #include <stdlib.h> #include <time.h> #define row 3 #define col 3 void remind() { printf("+------------------------------------------+ " "+-------------- 0 結(jié)束游戲 --------------+ " "+----------- 1 開始/繼續(xù)游戲 ------------+ " "+------------------------------------------+ "); } void Initboard(char(*board)[3],int Row,int Col ) { int i = 0, j = 0; for (i = 0; i < Row; i++) { for (j = 0; j < Col; j++) { board[i][j] = " "; // 賦予空格 } } } void Displayboard(char(*board)[3], int Row, int Col) { int i = 0, j = 0; for (i = 0; i < Row; i++) { printf("+---+---+---+ "); for (j = 0; j < Col; j++) { printf("| %c ",board[i][j]); } printf("| "); } printf("+---+---+---+ "); } void player(char(*board)[3], int Row, int Col) { printf("請分別輸入橫縱坐標(biāo)(輸入數(shù)據(jù)請用空格隔開): "); scanf("%d%d", &Row, &Col); while (1) { if (((1 <= Row) && (Row <= 3)) //邊界必須合格,且該地方無子 && ((1 <= Col) && (Col <= 3)) && (board[Row-1][Col-1] == " ")) { board[Row - 1][Col - 1] = "*"; //之所以Row - 1 Col - 1是考慮到玩家不一定是程序員,他不知道編程從0開始數(shù) break; } else { printf("請仔細(xì)堅(jiān)持你的坐標(biāo)位置,是否已經(jīng)落子或坐標(biāo)超界,然后重新輸入坐標(biāo). "); printf("請輸入坐標(biāo): "); scanf("%d%d", &Row, &Col); } } printf("下子成功! "); Displayboard(board, row, col); // 無論是玩家還是電腦下子,都需要顯示出下子內(nèi)容 } void computer(char(*board)[3], int Row, int Col) { srand(time(NULL)); while (1) { int i = rand() % 3; int j = rand() % 3; if (board[i][j] == " ") { board[i][j] = "#";//#代表電腦下子 break; } } printf("電腦已下子: "); Displayboard(board, row, col); //電腦下子后,顯示棋盤 } int Iswin(char(*board)[3], int Row, int Col) { //怎么判斷一方贏?? 橫,豎,斜線只要都一樣,則可以知道一方贏(全是空格除外) for (int i = 0; i < Row; i++) //每一行 { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != " ")) { if (board[i][0] == "*") return 1; //如果一行都是*,說明玩家勝利,否則電腦勝利 return -1; } } for (int j = 0; j < Col; j++) //每一列 { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[0][j] != " ")) { if (board[0][j] == "*") return 1; //如果一列都是*,說明玩家勝利,否則電腦勝利 return -1; } } if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != " ")) //斜線 ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != " "))) { if (board[1][1] == "*") return 1; return -1; } for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { if (board[i][j] == " ") return -2; //如果前三者情況都沒有,只要目前棋盤上還剩下空余位置 //就說明不輸不贏,需要繼續(xù)對弈.返回[-1,1]之外的值就行 } } return 0; //除去上面4種情況就是平局 } void playgame() { char board[row][col]; // 存儲下子內(nèi)容 int result = 0; //用來接收Iswin函數(shù)判斷的返回值 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態(tài) while (1) //開始進(jìn)行對弈,直到一方贏或者平局結(jié)束循環(huán) { player(board, row, col); //玩家下子函數(shù) if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數(shù)的設(shè)定是如果玩家勝利,返回1 computer(board, row, col); //電腦下子函數(shù) if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數(shù)的設(shè)定是 如果電腦勝利,返回-1 if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續(xù)對弈 } if (result == 1) printf("恭喜您取得勝利!!!!!!!!! "); else if (result == -1) printf("你也太辣雞了吧,電腦都下不贏 "); else printf("哎~~,你的技術(shù)不行啊,居然和電腦達(dá)成平手 "); } #include <stdio.h> int main() { int input = 0; do { remind(); // 提示菜單 scanf("%d", &input); //開始輸入命令 switch (input) { case 0: printf("成功退出游戲 "); break; case 1: playgame(); // 開始游戲 printf("是否繼續(xù)游戲 "); break; default: printf("命令錯(cuò)誤,請重新選擇 "); break; } } while (input); return 0; }
讀到這里,這篇“如何用C語言代碼實(shí)現(xiàn)三子棋小游戲”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章題目:如何用C語言代碼實(shí)現(xiàn)三子棋小游戲
網(wǎng)頁鏈接:http://chinadenli.net/article6/jogoig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、營銷型網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、ChatGPT、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)