井字棋版本1.0(对抗人工智障)
生活随笔
收集整理的這篇文章主要介紹了
井字棋版本1.0(对抗人工智障)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 前言
- 游戲設計思路
- 生成菜單界面(do while)
- 初始化棋盤
- 生成棋盤(二維數(shù)組的應用)
- 玩家下棋
- 電腦下棋(隨機數(shù)生成)
- 判斷輸贏
- 判斷是否棋格滿了
- 游戲全部代碼
- game.h
- test.c
- game. c
- 游戲效果圖
- 勝利
- 失敗
前言
?? :熱愛編程學習,期待一起交流!
🙏:博主水平有限,如有發(fā)現(xiàn)錯誤,求告知,多謝!
- 我們先認識一下本章涉及的英文單詞。
row:一行; 一排; ;
col:一列;
Init:初始化
InitBoard:初始化棋盤
DisplayBoard:展覽棋盤;展出棋盤; - 井字棋又稱三子棋。此游戲是對前面C語言知識學習的綜合應用,主要包括 函數(shù)、數(shù)組、的應用。可以算是對前面所學知識的復習鞏固,以及形成知識的輸出。
- 相信大家也玩過井字棋,甚至熟練掌握井字棋的棋法并且百戰(zhàn)百勝。是的,這就是我的1.0版本,對抗人工智障,你將百戰(zhàn)百勝。由于博主知識暫時有限,不能寫出一個具有戰(zhàn)略頭腦的電腦玩家與你斗智斗勇。只能設計出一個胡亂下棋的電腦玩家。沒錯,就是胡亂下的。但是經(jīng)過我后期的學習一定會對這個游戲進行優(yōu)化。
游戲設計思路
這里我們把這個游戲項目整體上分為三個模塊
- 頭文件(game.h)c語言中頭文件中一般定義了函數(shù)的聲明、結構體的定義、宏定義。(常量和全局變量最好放到源文件中)
- 源文件(game.c)在這個源文件中我們放置一些函數(shù)。來將游戲的具體實現(xiàn)。 源文件(test.c)里面放主函數(shù)和游戲的整體功能。
- 這樣寫的好處可以不至于一個游戲直接在一個源文件寫幾百行,不能及時檢查錯誤,而導致bug頻出。
- 把游戲分為一個個的模塊就可以提高代碼的可讀性,減少錯誤率。
我們規(guī)定人下的棋子為 “x”,電腦下的棋子為 “o”。
- 為了照顧沒有設計過的朋友,在這里我會講的詳細一些。
- 先按照我們正常的思維來設計。
- 一、工欲善其事,必先利其器。我們首先需要先設計一個3 * 3的一個棋盤,如上圖所示。
- 二、然后玩家先手下棋。
- 三、電腦下棋。
- 四、我們需要在第三個回合判斷輸贏(就是判斷三個棋子是否在一條線上)
- 五、如果沒有分出勝負,我們需要繼續(xù)進行循環(huán) – 步驟三、四、五。直到判斷出輸贏,或者平局。
- 現(xiàn)在我們用程序員的話翻譯以上句子是什么意思。
- 一、生成一個3*3的二維數(shù)組,并將二維數(shù)組初始化后用符號打印出來。
- 二、運用二維數(shù)組輸入兩個數(shù)字定位棋子落下的位置。
- 三、運用rand函數(shù)生成隨機數(shù)。對二維數(shù)組(即3*3的棋盤)進行遍歷。if有空位,就下棋 *
- 四、判斷二維數(shù)組上的行,列,十字相交,的位置是否構成一條線。
- 五、運用循環(huán)語句對此進行判斷輸贏,或平局。
生成菜單界面(do while)
- 玩過超級瑪麗,或者魂斗羅的都知道。我們進入游戲的時候都有一個菜單界面,來選擇玩游戲,或者退出游戲。因此在我們進行玩游戲之前,需要用do語句先生成一個菜單來進行選擇。
初始化棋盤
宏定義:
- 將3用ROW,COL代替。
- 提高擴展性,如果將來要修改棋盤尺寸,代碼修改會很方便。
- 運用循環(huán)嵌套,對3 *3的二維數(shù)組進行遍歷,實現(xiàn)9個格子都是空格。
生成棋盤(二維數(shù)組的應用)
- 重點:數(shù)組是通過下標來訪問元素的
- 如圖所示
玩家下棋
- 運用if的嵌套
電腦下棋(隨機數(shù)生成)
- 隨機數(shù)的生成.要在主函數(shù)中使用 srand((unsigned int)time(0))
- 將time作為種子,保證時間的隨機性。從而使棋子隨機生成。
判斷輸贏
- 規(guī)定:
- 返回‘Q’是平局
- 返回‘c’是繼續(xù)
- 下面是判斷三行,三列,還有十字相交是否相同,然后還要繼續(xù)判斷棋盤是否滿了,最后才能判斷是否輸贏。
- 判斷棋盤滿不滿需要調(diào)用is_full函數(shù)。
判斷是否棋格滿了
- 對棋盤進行遍歷,如果沒有空格,就返回1,為真,則是棋盤滿了,然后就返回Q來跳出循環(huán)。
游戲全部代碼
game.h
#include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void Player_move(char board[ROW][COL], int row, int col); void Computer_move(char board[ROW][COL], int row, int col); char is_win(char board[ROW][COL], int row, int col);test.c
#include "game.h" void game() {char board[ROW][COL] = { 0 };InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);char ret = 0;while (1){system("cls");DisplayBoard(board, ROW, COL);Player_move(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'c'){break;}Computer_move(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'c'){break;}}printf("對抗結果如下:\n");DisplayBoard(board, ROW, COL);if (ret == 'x'){printf("恭喜你對抗人工智障1.0成功!!!\n");printf("再來一盤吧?\n");printf("\n");}else if (ret == 'o'){printf("不會吧?不會還有人玩不過電腦吧?\n");printf("再來一盤吧?\n");printf("\n");}else{printf("你竟然和電腦旗鼓相當!!!\n");printf("再來一盤吧?\n");printf("\n");} } void menu() {printf("————1.play————\n");printf("————2.exit————\n"); } void test() { srand((unsigned int)time(NULL));int n = 0;do {printf("開始游戲請選擇輸入1\n");menu();scanf("%d", &n);switch (n){case 1:game();break;case 0:printf("退出游戲\n");break;default:printf("選擇錯誤請重新選擇:\n");break;}}while (n); } int main() {test();return 0; }game. c
#define _CRT_SECURE_NO_WARNINGS #include "game.h" void InitBoard(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 DisplayBoard(char board[ROW][COL], int row, int col) {int i = 0;//i 控制行數(shù)int j = 0;//j 控制列數(shù)for (i = 0; i < row; i++){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_move(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;printf("請玩家輸入(x y)坐標下棋:");while (1){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] = 'x';break;}else{printf("坐標已被占用,請重新輸入\n");}}else{printf("坐標非法,請重新輸入\n");}} } void Computer_move(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;while (1){x = rand() % ROW;y = rand() % COL;if (board[x][y] == ' '){board[x][y] = 'o';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][0] == board[i][2] && board[i][0] != ' '){return board[i][0];}}for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}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 (1 == is_full(board, row, col)){return 'Q';}return 'c'; }游戲效果圖
勝利
失敗
- 失敗的截圖可以自己下去試試哦。
最后,如果你覺得我的文章對你有幫助🎉歡迎關注🔎點贊👍收藏??留言📝。
總結
以上是生活随笔為你收集整理的井字棋版本1.0(对抗人工智障)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机试考点整理(3)——练习题
- 下一篇: 【转载】如何创建代码模板(Code Te