用C語言實(shí)現(xiàn)三子棋小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1. 規(guī)則介紹
三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對方就算輸了。但是,有很多時(shí)候會(huì)出現(xiàn)和棋的情況。
2. 編寫思路
2.1 選擇界面的編寫
提供選擇界面(設(shè)計(jì)者可根據(jù)自己的喜好設(shè)定棋盤的大??;輸入何種數(shù)字或者符號開始或者退出游戲也可由設(shè)計(jì)者自己確定數(shù)字)
static void Menu() { printf("---------------------\n"); printf("| 1: Play 2: Exit |\n"); printf("---------------------\n"); printf("Please Select# "); }
2.2 棋盤的編寫
首先我們應(yīng)該實(shí)現(xiàn)三行三列的棋盤,為后續(xù)使用方便,所以我們在前面宏定義行(ROW 3)列(COL 3)都為3;設(shè)計(jì)者也可以根據(jù)自己的喜歡設(shè)置不同樣式的棋盤;
static void Showboard(char board[][COL], int row, int col) { printf(" | 1 | 2 | 3 |\n"); printf("---------------------\n"); for (int i = 0; i < row; i++){ printf("%d |", i + 1); for (int j = 0; j < col; j++){ printf(" %c |", board[i][j]); } printf("\n---------------------\n"); } }
2.3 玩家落子
設(shè)定讓玩家以(x,y)坐標(biāo)的方式?jīng)Q定落子方位,在玩家輸入后,我們要設(shè)定判斷程序,判斷玩家輸入的坐標(biāo)是否合法(在我們設(shè)定的坐標(biāo)范圍內(nèi))、輸入的位置是否已經(jīng)落子;如果合法,且位置沒被占用,則在輸入的位置用符號代替玩家的棋子,這里用 ‘ X ' 表示玩家的棋子,為后續(xù)容易修改,在前面宏定義。
static void PlayerMove(char board[][COL], int row, int col) { int x = 0; int y = 0; int quit = 0; while (!quit){ printf("請輸入你的位置# "); scanf("%d %d", &x, &y); if (x<1 || x>3 || y<1 || y>3){ printf("你輸入的坐標(biāo)有誤!\n"); continue; } else if (board[x - 1][y - 1] != ' '){ printf("該坐標(biāo)已被占用!\n"); continue; } else { board[x - 1][y - 1] = P_COLOR; break; } } }
2.4 三子連珠判定
設(shè)定三子連珠所有可能的情況,然后判定是否可以繼續(xù)進(jìn)行游戲(返回NEXT),或者和棋(返回DRAW);
static char Judge(char board[][COL], 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] != ' '){ return board[i][0]; } } for (int j = 0; j < col; j++){ if (board[0][j] == board[1][j] && \ board[1][j] == board[2][j] && \ board[0][j] != ' '){ return board[0][j]; } } if (board[0][0] == board[1][1] && \ board[1][1] == board[2][2] && \ board[0][0] != ' '){ return board[1][1]; } if (board[0][2] == board[1][1] && \ board[1][1] == board[2][0] && \ board[1][1] != ' '){ return board[1][1]; } for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ if (board[i][j] == ' '){ return NEXT; } } } return DRAW; }
2.5 電腦落子方式
電腦落子方式我們采用生成隨機(jī)數(shù)
static void ComputerMove(char board[][COL], int row, int col) { while (1){ int x = rand() % row; int y = rand() % col; if (board[x][y] == ' '){ board[x][y] = C_COLOR; break; } } }
2.6 游戲邏輯
生成隨機(jī)數(shù),以便電腦落子使用;
生成二維數(shù)組作為棋盤,傳入行和列,然后用memset初始化;
展示棋盤;
玩家落子;
判定落子是否合法;如果合法則輪到計(jì)算機(jī)落子;
判斷計(jì)算機(jī)落子是否合法;如果合法則繼續(xù)循環(huán);
設(shè)定判斷循環(huán)出口;
static void Game() { srand((unsigned long)time(NULL)); char board[ROW][COL]; memset(board, ' ', sizeof(board)); char result = 'x'; do{ Showboard(board, ROW, COL); PlayerMove(board, ROW, COL); result = Judge(board, ROW, COL); if (result != NEXT){ break; } ComputerMove(board, ROW, COL); result = Judge(board, ROW, COL); if (result != NEXT){ break; } } while (1); Showboard(board, ROW, COL); if (P_COLOR == result){ printf("you win!\n"); } else if (C_COLOR == result){ printf("you loss!\n"); } else{ printf("draw!\n"); } }
2.7 設(shè)定游戲開始o(jì)r退出
首先展示菜單;輸入1開始游戲;輸入2則退出;將上述代碼整合后如下。
3. 整體代碼
#include<stdivo.h> #include<time.h> #include<Windows.h> #pragma warning(disable:4996) #define ROW 3 #define COL 3 #define P_COLOR 'X' #define C_COLOR 'O' #define NEXT 'N' #define DRAW 'D' static void Menu() { printf("---------------------\n"); printf("| 1: Play 2: Exit |\n"); printf("---------------------\n"); printf("Please Select# "); } static void Showboard(char board[][COL], int row, int col) { printf(" | 1 | 2 | 3 |\n"); printf("---------------------\n"); for (int i = 0; i < row; i++){ printf("%d |", i + 1); for (int j = 0; j < col; j++){ printf(" %c |", board[i][j]); } printf("\n---------------------\n"); } } static void PlayerMove(char board[][COL], int row, int col) { int x = 0; int y = 0; int quit = 0; while (!quit){ printf("請輸入你的位置# "); scanf("%d %d", &x, &y); if (x<1 || x>3 || y<1 || y>3){ printf("你輸入的坐標(biāo)有誤!\n"); continue; } else if (board[x - 1][y - 1] != ' '){ printf("該坐標(biāo)已被占用!\n"); continue; } else { board[x - 1][y - 1] = P_COLOR; break; } } } static char Judge(char board[][COL], 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] != ' '){ return board[i][0]; } } for (int j = 0; j < col; j++){ if (board[0][j] == board[1][j] && \ board[1][j] == board[2][j] && \ board[0][j] != ' '){ return board[0][j]; } } if (board[0][0] == board[1][1] && \ board[1][1] == board[2][2] && \ board[0][0] != ' '){ return board[1][1]; } if (board[0][2] == board[1][1] && \ board[1][1] == board[2][0] && \ board[1][1] != ' '){ return board[1][1]; } for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ if (board[i][j] == ' '){ return NEXT; } } } return DRAW; } static void ComputerMove(char board[][COL], int row, int col) { while (1){ int x = rand() % row; int y = rand() % col; if (board[x][y] == ' '){ board[x][y] = C_COLOR; break; } } } static void Game() { srand((unsigned long)time(NULL)); char board[ROW][COL]; memset(board, ' ', sizeof(board)); char result = 'x'; do{ Showboard(board, ROW, COL); PlayerMove(board, ROW, COL); result = Judge(board, ROW, COL); if (result != NEXT){ break; } ComputerMove(board, ROW, COL); result = Judge(board, ROW, COL); if (result != NEXT){ break; } } while (1); Showboard(board, ROW, COL); if (P_COLOR == result){ printf("you win!\n"); } else if (C_COLOR == result){ printf("you loss!\n"); } else{ printf("draw!\n"); } } int main() { int quit = 0; int select = 0; while (!quit){ Menu(); scanf("%d", &select); switch (select){ case 1: Game(); printf("Play Again?\n"); break; case 2: quit = 1; break; default: printf("\n"); break; } } printf("ByeBye!\n"); system("pause"); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++項(xiàng)目實(shí)戰(zhàn)之makefile使用
這篇文章主要介紹了C++項(xiàng)目實(shí)戰(zhàn)之makefile使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05VS2022+libtorch+Cuda11.3安裝測試教程詳解(調(diào)用cuda)
這篇文章主要介紹了VS2022+libtorch+Cuda11.3安裝測試(調(diào)用cuda),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05使用?Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序的過程詳解
Visual?Studio?2022?引入了用于?Linux?C++?開發(fā)的本機(jī)?WSL2?工具集,可以構(gòu)建和調(diào)試?Linux?C++?代碼,并提供了非常好的?Linux?文件系統(tǒng)性能、GUI?支持和完整的系統(tǒng)調(diào)用兼容性,這篇文章主要介紹了使用Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序,需要的朋友可以參考下2021-11-11VC++ loadlibrary()加載三方dll失敗, 返回錯(cuò)誤碼:126的解決方法
今天在編寫VC++ loadlibrary()加載三方dll是總是失敗,并且返回錯(cuò)誤碼:126,這里就為大家分享一下具體的解決方法2021-03-03