C語言實(shí)現(xiàn)三子棋小游戲的示例代碼
一、三子棋
三子棋小游戲的實(shí)現(xiàn)主要依賴于循環(huán)語句、函數(shù)和數(shù)組。
主要思路:設(shè)計(jì)棋盤、初始化棋盤、玩家下棋、電腦下棋及判斷輸贏。
判斷輸贏條件:當(dāng)任一方連續(xù)三個(gè)棋子成一條直線,即為獲勝。
1.演示效果
2.完整代碼
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3//行 #define COL 3//列 void Init_board(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 Print_board(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) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\n"); } } } void Player_board(char board[ROW][COL], int row, int col)//玩家下棋 { int x = 0; int y = 0; while (1) { printf("玩家下棋>:"); 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("坐標(biāo)已被占用,請(qǐng)重新輸入!\n"); } } else { printf("坐標(biāo)非法,請(qǐng)重新輸入!\n"); } } } void Computer_board(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 Is_full(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 Is_win(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][0] != ' ')//判斷一行中是否相等 { return board[i][0]; } } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判斷一列中是否相等 { return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判斷對(duì)角線是否相等 { return board[0][0]; } if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')//判斷對(duì)角線是否相等 { return board[1][1]; } if (1 == Is_full(board, row, col))//Is_full的返回值等于1,說明棋盤已經(jīng)滿了,沒有空格了 return 'P'; return 'C'; } void menu() { printf("*******************\n"); printf("*** 1.開始游戲 **\n"); printf("*** 0.結(jié)束游戲 **\n"); printf("*******************\n"); } void game() { printf("**** 游戲開始 ***\n"); char ret = 0; char board[ROW][COL] = { 0 }; Init_board(board, ROW, COL); Print_board(board, ROW, COL); while(1) { Player_board(board, ROW, COL); Print_board(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret != 'C') break; Computer_board(board, ROW, COL); Print_board(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') printf("玩家贏!\n"); if (ret == '#') printf("電腦贏!\n"); if (ret == 'P') printf("平局!\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請(qǐng)選擇>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戲結(jié)束!\n"); break; default: printf("選擇項(xiàng)不存在,請(qǐng)重新選擇!\n"); break; } } while (input); }
二、代碼解析
1.初始化棋盤
void Init_board(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] = ' '; } } }
剛開始定義的數(shù)組中初始值為0,但是打印的時(shí)候會(huì)發(fā)生錯(cuò)誤,所以要先將數(shù)組中的值改為空格,以確保在打印棋盤的時(shí)候能夠得到想要的結(jié)果。
2.打印棋盤
void Print_board(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) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\n"); } } }
打印出來為:
3.玩家下棋
void Player_board(char board[ROW][COL], int row, int col)//玩家下棋 { int x = 0; int y = 0; while (1) { printf("玩家下棋>:"); 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("坐標(biāo)已被占用,請(qǐng)重新輸入!\n"); } } else { printf("坐標(biāo)非法,請(qǐng)重新輸入!\n"); } } }
玩家下棋要判斷輸入的下標(biāo)是否符合要求,是否為空格,當(dāng)輸入的坐標(biāo)不在范圍內(nèi)時(shí),輸入坐標(biāo)非法,重新輸入。當(dāng)輸入的坐標(biāo)不是空格,已被占用時(shí)也需要重新輸入,這里注意玩家輸入的坐標(biāo)是從1開始的,并非從0。
4.電腦下棋
void Computer_board(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; } } }
電腦下棋時(shí),需要用rand函數(shù)讓其產(chǎn)生在0 ~ row-1和0 ~ col-1之間,并且每次程序開始時(shí)產(chǎn)生的數(shù)都不相同,所以rand函數(shù)要和srand函數(shù)配合使用。具體使用方法可參考猜數(shù)字小游戲中游戲主題函數(shù)的介紹。
5.判斷輸贏
int Is_full(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 Is_win(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][0] != ' ') { return board[i][0]; } } for (i = 0; i < row; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ') { return board[1][1]; } if (1 == Is_full(board, row, col))//Is_full的返回值等于1,說明棋盤已經(jīng)滿了,沒有空格了 return 'P'; return 'C'; }
假設(shè)用P表示平局,用C表示游戲繼續(xù),用*表示玩家獲勝,用#表示電腦獲勝,我們需要判斷行、列和對(duì)角線上是否有三個(gè)連續(xù)符號(hào)組成的直線,并且可以根據(jù)符號(hào)判斷出是誰贏誰輸。當(dāng)沒有三個(gè)連續(xù)的符號(hào)組成的直線,且沒有空格時(shí)為平局。其中Is_full函數(shù)是用來判斷數(shù)組中是否還有空格。
6.游戲主體函數(shù)
通過調(diào)用具體的實(shí)現(xiàn)函數(shù),完成界面的布局。
void game() { printf("**** 游戲開始 ***\n"); char ret = 0; char board[ROW][COL] = { 0 }; Init_board(board, ROW, COL); Print_board(board, ROW, COL); while(1) { Player_board(board, ROW, COL); Print_board(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret != 'C') break; Computer_board(board, ROW, COL); Print_board(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') printf("玩家贏!\n"); if (ret == '#') printf("電腦贏!\n"); if (ret == 'P') printf("平局!\n"); }
7.菜單函數(shù)
void menu() { printf("*******************\n"); printf("*** 1.開始游戲 **\n"); printf("*** 0.結(jié)束游戲 **\n"); printf("*******************\n"); }
8.頭文件及主函數(shù)
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3//行 #define COL 3//列 int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請(qǐng)選擇>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戲結(jié)束!\n"); break; default: printf("選擇項(xiàng)不存在,請(qǐng)重新選擇!\n"); break; } } while (input); }
到此這篇關(guān)于C語言實(shí)現(xiàn)三子棋小游戲的示例代碼的文章就介紹到這了,更多相關(guān)C語言三子棋游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)
這篇文章主要介紹了C++中main函數(shù)怎樣調(diào)用類內(nèi)函數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C++中使用哈希表(unordered_map)的一些常用操作方法
C++標(biāo)準(zhǔn)庫中使用的unordered_map底層實(shí)現(xiàn)是哈希表,下面這篇文章主要給大家介紹了關(guān)于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以參考下2022-03-03OpenCV實(shí)現(xiàn)鼠標(biāo)框選并顯示框選區(qū)域
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)鼠標(biāo)框選并顯示框選區(qū)域,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08關(guān)于C++中的友元函數(shù)的一些總結(jié)
以下是對(duì)C++中的友元函數(shù)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下2013-09-09Qt5實(shí)現(xiàn)qDebug日志信息寫入日志文件過程
這篇文章主要為大家介紹了Qt5實(shí)現(xiàn)qDebug日志信息寫入日志文件的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05