適合初學(xué)者練習(xí)的C語(yǔ)言實(shí)現(xiàn)三子棋小游戲
用簡(jiǎn)單的C語(yǔ)言來實(shí)現(xiàn)小時(shí)候玩的三子棋游戲,下面是人機(jī)對(duì)戰(zhàn),當(dāng)然這個(gè)代碼的電腦對(duì)手是人工智障而不是人工智能
一、寫代碼前明確下棋時(shí)的步驟與順序
- 1.創(chuàng)建一個(gè)3*3的棋盤.
- 2.將上面創(chuàng)建的棋盤中每個(gè)格初始化成' '狀態(tài).
- 3.打印出初始化完成的棋盤
- 4.玩家落子
- 5.電腦落子
- 6.判斷勝負(fù)
寫代碼之前梳理好大概的思路,先寫出初步的主函數(shù)
int main() { char winner = ' '; //1.創(chuàng)建一個(gè)棋盤,并初始化. char board[MAX_ROW][MAX_COL] = { 0 }; //2.init函數(shù)將棋盤每個(gè)格子初始化成' '. init(board); while (1) { //3.打印棋盤 printBoard(board); //4.玩家落子 playerMove(board); //5.判斷勝負(fù) winner = checkWinner(board); if (winner != ' ') { //勝負(fù)已分 break; } //6.電腦落子 computerMove(board); //7.判斷勝負(fù) winner = checkWinner(board); if (winner != ' ') { //勝負(fù)已分 break; } }
在創(chuàng)建棋盤是char board[][]
的[]中不要寫3,寫3在后面看代碼時(shí)不能明確分清3代表什么
因此建議定義宏
#define MAX_ROW 3 #define MAX_COL 3
這樣可以清楚的看出[]中的內(nèi)容代表什么,提高可讀性.
二 根據(jù)初步的主函數(shù)完成想要的代碼
1.寫一個(gè)函數(shù)來初始化棋盤
//將棋盤初始化成' ' void init(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for(int col = 0; col < MAX_COL; col++) { board[row][col] = ' '; } } //設(shè)計(jì)隨機(jī)種子 srand((unsigned int) time(0)); }
2.打印棋盤
void printBoard(char board[MAX_ROW][MAX_COL]) { system("cls"); for (int row = 0; row < MAX_ROW; row++) { printf("+---+---+---+\n"); for (int col = 0; col < MAX_COL; col++) { printf("| %c ", board[row][col]); } printf("|"); printf("\n"); } printf("+---+---+---+\n"); }
system("cls")
是讓每次打印棋盤前清除之前的棋盤這樣能讓界面清晰一些
(使用的是簡(jiǎn)單的C來完成程序所以打印的棋盤也比較簡(jiǎn)陋)
3.玩家落子
void playerMove(char board[MAX_ROW][MAX_COL]) { printf("請(qǐng)玩家落子!"); while (1) { printf("請(qǐng)輸入落子的位置(row col):"); int row = 0; int col = 0; scanf("%d %d", &row, &col); //輸入后驗(yàn)證輸入內(nèi)容是否合法. if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) { printf("輸入有誤.請(qǐng)重新輸入!\n"); continue; } if (board[row][col] != ' ') { printf("當(dāng)前位置已有棋子,請(qǐng)重新輸入!\n"); continue; } board[row][col] = 'x'; break; } }
以輸入坐標(biāo)的方式來實(shí)現(xiàn)落子,并且要檢測(cè)玩家落子是否合理,以免輸入無效的坐標(biāo).
4.電腦落子
void computerMove(char board[MAX_ROW][MAX_COL]) { printf("輪到電腦落子"); while (1) { int row = rand() % MAX_ROW; int col = rand() % MAX_COL; if (board[row][col] != ' ') { continue; } board[row][col] = 'o'; break; } }
電腦落子采用隨機(jī)數(shù)的方式來進(jìn)行落子,因此需要設(shè)置隨機(jī)種子,將它寫在初始化棋盤函數(shù)內(nèi),每次初始化一次進(jìn)行一次隨機(jī)種子的設(shè)置
由于是隨機(jī)落子因此實(shí)現(xiàn)的不是人工智能而是人工智障.
5.判斷勝負(fù)
int checkWinner(char board[MAX_ROW][MAX_COL]) { //檢查所有行 for (int row = 0; row < MAX_ROW; row++) { if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) { return board[row][0]; } } //檢查所有列 for (int col = 0; col < MAX_COL; col++) { if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) { return board[0][col]; } } //檢查對(duì)角線 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') { return board[0][2]; } if (isFull(board)) { return 'q'; } return ' '; }
檢查每行 每列 對(duì)角線是否有三個(gè)相同的棋子從而判斷勝負(fù).
int isFull(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { if (board[row][col] == ' ') { //棋盤沒滿 return 0; } } } return 1; }
檢查棋盤有沒有下滿(可能出現(xiàn)和棋)
這就實(shí)現(xiàn)一個(gè)簡(jiǎn)單的三子棋游戲
在主函數(shù)中玩家落子后應(yīng)也判斷一次勝負(fù),以免出現(xiàn)玩家勝利電腦再落子的情況.
三、三子棋實(shí)現(xiàn)代碼
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> #define MAX_ROW 3 #define MAX_COL 3 //將棋盤初始化成' ' void init(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for(int col = 0; col < MAX_COL; col++) { board[row][col] = ' '; } } //設(shè)計(jì)隨機(jī)種子 srand((unsigned int) time(0)); } void printBoard(char board[MAX_ROW][MAX_COL]) { system("cls"); for (int row = 0; row < MAX_ROW; row++) { printf("+---+---+---+\n"); for (int col = 0; col < MAX_COL; col++) { printf("| %c ", board[row][col]); } printf("|"); printf("\n"); } printf("+---+---+---+\n"); } void playerMove(char board[MAX_ROW][MAX_COL]) { printf("請(qǐng)玩家落子!"); while (1) { printf("請(qǐng)輸入落子的位置(row col):"); int row = 0; int col = 0; scanf("%d %d", &row, &col); //輸入后驗(yàn)證輸入內(nèi)容是否合法. if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) { printf("輸入有誤.請(qǐng)重新輸入!\n"); continue; } if (board[row][col] != ' ') { printf("當(dāng)前位置已有棋子,請(qǐng)重新輸入!\n"); continue; } board[row][col] = 'x'; break; } } void computerMove(char board[MAX_ROW][MAX_COL]) { printf("輪到電腦落子"); while (1) { int row = rand() % MAX_ROW; int col = rand() % MAX_COL; if (board[row][col] != ' ') { continue; } board[row][col] = 'o'; break; } } int isFull(char board[MAX_ROW][MAX_COL]) { for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { if (board[row][col] == ' ') { //棋盤沒滿 return 0; } } } return 1; } int checkWinner(char board[MAX_ROW][MAX_COL]) { //檢查所有行 for (int row = 0; row < MAX_ROW; row++) { if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) { return board[row][0]; } } //檢查所有列 for (int col = 0; col < MAX_COL; col++) { if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) { return board[0][col]; } } //檢查對(duì)角線 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') { return board[0][2]; } if (isFull(board)) { return 'q'; } return ' '; } int main() { char winner = ' '; //1.創(chuàng)建一個(gè)棋盤,并初始化. char board[MAX_ROW][MAX_COL] = { 0 }; //2.init函數(shù)將棋盤每個(gè)格子初始化成' '. init(board); while (1) { //3.打印棋盤 printBoard(board); //4.玩家落子 playerMove(board); //5.判斷勝負(fù) winner = checkWinner(board); if (winner != ' ') { //勝負(fù)已分 break; } //6.電腦落子 computerMove(board); //7.判斷勝負(fù) winner = checkWinner(board); if (winner != ' ') { //勝負(fù)已分 break; } } if (winner == 'x') { printf("恭喜你,你贏了!\n"); }else if(winner=='o') { printf("你真菜連人工智障都玩不過\n"); }else { printf("你和人工智障五五開\n"); } return 0; }
運(yùn)行界面如下:
到此這篇關(guān)于初學(xué)者練習(xí)--C語(yǔ)言寫三子棋小游戲的文章就介紹到這了,更多相關(guān)C語(yǔ)言寫三子棋小游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲源碼
- C語(yǔ)言實(shí)現(xiàn)三子棋游戲含完整代碼
- C語(yǔ)言小游戲之簡(jiǎn)易版三子棋(棋盤可自由擴(kuò)展)
- C語(yǔ)言實(shí)現(xiàn)三子棋游戲(棋盤可變)
- 詳解用C語(yǔ)言實(shí)現(xiàn)三子棋游戲流程
- C語(yǔ)言實(shí)現(xiàn)的一個(gè)三子棋游戲詳解流程
- C語(yǔ)言三子棋游戲的簡(jiǎn)單設(shè)計(jì)
- C語(yǔ)言實(shí)現(xiàn)三子棋簡(jiǎn)單小游戲
- 一盤王者的時(shí)間用C語(yǔ)言實(shí)現(xiàn)三子棋
相關(guān)文章
C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行
這篇文章主要為大家詳細(xì)介紹了C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++利用inotify+epoll實(shí)現(xiàn)異步文件監(jiān)控的方法
這篇文章講給大家詳細(xì)介紹一下C++利用inotify+epoll實(shí)現(xiàn)異步文件監(jiān)控的方法,inotify是一種異步文件監(jiān)控機(jī)制,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08C語(yǔ)言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12VS2019調(diào)試C語(yǔ)言程序(監(jiān)視操作)的詳細(xì)步驟
在很多時(shí)候我們?cè)趯懗绦虻倪^程中會(huì)發(fā)現(xiàn)一些非編程錯(cuò)誤的問題,這樣的問題很難直接分辨出來,但是我們可以用調(diào)試了一步一步的模擬程序運(yùn)行的過程,來找出程序的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于VS2019調(diào)試C語(yǔ)言程序(監(jiān)視操作)的詳細(xì)步驟,需要的朋友可以參考下2022-11-11c++使用Easyx圖形庫(kù)實(shí)現(xiàn)飛機(jī)大戰(zhàn)
本文詳細(xì)講解了c++使用Easyx圖形庫(kù)實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12Qt5.9實(shí)現(xiàn)簡(jiǎn)單的多線程實(shí)例(類QThread)
Qt開啟多線程,主要用到類QThread。用一個(gè)類繼承QThread,然后重新改寫虛函數(shù)run()。具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09C語(yǔ)言中的strlen()和sizeof()對(duì)比分析
這篇文章主要介紹了C語(yǔ)言中的strlen()和sizeof()區(qū)別對(duì)比,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03