詳解用C語(yǔ)言實(shí)現(xiàn)三子棋游戲流程
三子棋游戲簡(jiǎn)介
這是一個(gè)簡(jiǎn)單的三子棋小游戲,估計(jì)大家小時(shí)候都玩兒過(guò),只要能連成三個(gè),無(wú)論是行,列還是對(duì)角線,就可以勝利了。是不是很簡(jiǎn)單呢,那我們來(lái)嘗試一下用C語(yǔ)言來(lái)寫(xiě)一個(gè)簡(jiǎn)單的三子棋游戲。
一、分析及實(shí)現(xiàn)
1.棋盤(pán)
想要玩游戲,那首先應(yīng)該有一個(gè)棋盤(pán)吧。因?yàn)槲覀兺鎯旱氖侨悠澹詠?lái)說(shuō)一個(gè)3X3的棋盤(pán)應(yīng)該可以滿足要求。這里使用了一個(gè)三行三列的二維數(shù)組來(lái)模擬三子棋的棋盤(pán)。
有了棋盤(pán)之后在開(kāi)始游戲之前先把棋盤(pán)初始化一下,這樣看起來(lái)更方便。
//初始化棋盤(pán) void InitBoard(char board[][COL], int row, int col) { int i = 0; for (i = 0; i < ROW; i++) { int j = 0; for (j = 0; j < COL; j++) { board[i][j] = ' '; } } }
之后呢,再來(lái)打印看看,要優(yōu)化一下再打印出來(lái)
//打印棋盤(pán) void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { printf("+---+---+---+\n"); int j = 0; for (j = 0; j < col; j++) { printf("| %c ", board[i][j]); } printf("|\n"); } printf("+---+---+---+\n"); }
這是我設(shè)計(jì)的一個(gè)簡(jiǎn)單的小棋盤(pán)
棋盤(pán)的風(fēng)格和樣式可以根據(jù)自己的喜好更改。
好了,現(xiàn)在我們有了棋盤(pán),有了打印出來(lái)的樣子,那接下來(lái)就應(yīng)該向棋盤(pán)上落子了!
2.落子
下棋呢可以是兩個(gè)人下,當(dāng)然也可以自己和電腦下棋,這里我選擇和電腦對(duì)弈,這樣就需要兩個(gè)功能了,一個(gè)是玩家下棋,一個(gè)就是電腦下棋了。
//玩家下棋 void Player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("玩家下棋:->"); scanf("%d %d", &x, &y); if (x > 0 && x <= row && y > 0 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'O'; break; } else { printf("坐標(biāo)已被占用!\n"); } } else { printf("坐標(biāo)非法,請(qǐng)重新輸入!\n"); } } }
為了將玩家和電腦區(qū)分開(kāi),需要使用兩個(gè)不一樣的符號(hào)來(lái)代表玩家的落子和電腦的落子 玩家----O,電腦----X
//電腦下棋 void Computer_move(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] = 'X'; break; } } }
玩家的落子可以通過(guò)輸入坐標(biāo),而電腦呢,我們讓他隨機(jī)選擇合理的坐標(biāo)范圍進(jìn)行落子。
那隨著玩家和電腦相繼落子,我們就需要判斷誰(shuí)獲勝了,或者平局的情況。
3.判斷輸贏
//判斷輸贏 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]) { return board[i][0]; } if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) { return board[0][i]; } } //判斷對(duì)角線 if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0])) { return board[1][1]; } if (Is_full(board, row, col)) { return 'D'; //平局 } return 'C'; //Continue表示繼續(xù) }
如果棋盤(pán)滿了,還沒(méi)有分出勝負(fù)的話就是平局的情況。
為了判斷棋盤(pán)是否滿了,我們也需要相應(yīng)的功能來(lái)簡(jiǎn)化我們的代碼。
//判斷棋盤(pán)是否滿了 int Is_full(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++) { if (board[i][j] == ' ') return 0; } } return 1; }
二、程序演示
三、完整代碼
以下是完整代碼,有需要的可以查看,我用了三個(gè)文件來(lái)存儲(chǔ),兩個(gè).c文件用來(lái)書(shū)寫(xiě)主要代碼,一個(gè).h文件用來(lái)存儲(chǔ)預(yù)處理指令和宏定義
1.main.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" int main() { test(); return 0; }
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() { 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; while (1) { Player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret == 'O') { printf("玩家贏!\n"); break; } if (ret == 'D') { printf("平局\n"); break; } Computer_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = Is_win(board, ROW, COL); if (ret == 'X') { printf("電腦贏!\n"); break; } } } void test() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請(qǐng)選擇:->"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲!\n"); break; default: printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n"); break; } } while (input); } //初始化棋盤(pán) void InitBoard(char board[][COL], int row, int col) { int i = 0; for (i = 0; i < ROW; i++) { int j = 0; for (j = 0; j < COL; j++) { board[i][j] = ' '; } } } //打印棋盤(pán) void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { printf("+---+---+---+\n"); int j = 0; for (j = 0; j < col; j++) { printf("| %c ", board[i][j]); } printf("|\n"); } printf("+---+---+---+\n"); } //玩家下棋 void Player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("玩家下棋:->"); scanf("%d %d", &x, &y); if (x > 0 && x <= row && y > 0 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'O'; break; } else { printf("坐標(biāo)已被占用!\n"); } } else { printf("坐標(biāo)非法,請(qǐng)重新輸入!\n"); } } } //電腦下棋 void Computer_move(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] = 'X'; break; } } } //判斷棋盤(pán)是否滿了 int Is_full(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++) { 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]) { return board[i][0]; } if (board[0][i] == board[1][i] && board[1][i] == board[2][i]) { return board[0][i]; } } //判斷對(duì)角線 if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0])) { return board[1][1]; } if (Is_full(board, row, col)) { return 'D'; //平局 } return 'C'; //Continue表示繼續(xù) }
3.game.h
#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 3 #define COL 3 #include<stdio.h> #include<math.h> #include<time.h> void test(); void menu(); void InitBoard(char board[ROW][COL], int, int); void DisplayBoard(char board[ROW][COL], int, int); void Player_move(char board[ROW][COL], int, int); void Computer_move(char board[ROW][COL], int, int); char Is_win(char board[ROW][COL], int, int);
總結(jié)
以上就是一個(gè)完整的三子棋小游戲的C語(yǔ)言實(shí)現(xiàn)版本,謝謝觀看!
以上就是詳解用C語(yǔ)言實(shí)現(xiàn)三子棋游戲流程的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言 三子棋的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C語(yǔ)言三子棋小游戲?qū)崿F(xiàn)全程
- 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲源碼
- C語(yǔ)言實(shí)現(xiàn)三子棋游戲含完整代碼
- C語(yǔ)言小游戲之簡(jiǎn)易版三子棋(棋盤(pán)可自由擴(kuò)展)
- C語(yǔ)言實(shí)現(xiàn)三子棋游戲(棋盤(pán)可變)
- 基于C語(yǔ)言實(shí)現(xiàn)三子棋小游戲
- C語(yǔ)言實(shí)現(xiàn)的一個(gè)三子棋游戲詳解流程
- C語(yǔ)言實(shí)現(xiàn)三子棋小游戲全程詳解
相關(guān)文章
C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù)
這篇文章主要介紹了C語(yǔ)言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù),分別為getpid()函數(shù)和getppid()函數(shù)的使用,需要的朋友可以參考下2015-08-08vscode調(diào)試使用make編譯的項(xiàng)目
VSCode本身是一個(gè)代碼編輯器,自帶的編譯功能比較弱,本文主要介紹了vscode調(diào)試使用make編譯的項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10C語(yǔ)言利用sprintf固定字符串輸出位數(shù)
sprintf?函數(shù)是一個(gè)?C?語(yǔ)言中的函數(shù),也被許多其他編程語(yǔ)言所支持。這篇文章主要介紹了C語(yǔ)言如何利用sprintf固定字符串輸出位數(shù),需要的可以參考一下2023-03-03使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn)
這篇文章主要介紹了使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05詳解Matlab繪制3D玫瑰花的方法(內(nèi)附旋轉(zhuǎn)版本)
這篇文章主要為大家介紹了如何利用Matlab繪制3D版的玫瑰花以及旋轉(zhuǎn)版的3D玫瑰花,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試2022-03-03