日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

井字棋版本1.0(对抗人工智障)

發(fā)布時間:2024/5/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 井字棋版本1.0(对抗人工智障) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 前言
  • 游戲設(shè)計思路
  • 生成菜單界面(do while)
  • 初始化棋盤
  • 生成棋盤(二維數(shù)組的應(yīng)用)
  • 玩家下棋
  • 電腦下棋(隨機數(shù)生成)
  • 判斷輸贏
  • 判斷是否棋格滿了
  • 游戲全部代碼
    • game.h
    • test.c
    • game. c
  • 游戲效果圖
    • 勝利
    • 失敗

前言

?? :熱愛編程學(xué)習(xí),期待一起交流!
🙏:博主水平有限,如有發(fā)現(xiàn)錯誤,求告知,多謝!

  • 我們先認識一下本章涉及的英文單詞。
    row:一行; 一排; ;
    col:一列;
    Init:初始化
    InitBoard:初始化棋盤
    DisplayBoard:展覽棋盤;展出棋盤;
  • 井字棋又稱三子棋。此游戲是對前面C語言知識學(xué)習(xí)的綜合應(yīng)用,主要包括 函數(shù)、數(shù)組、的應(yīng)用??梢运闶菍η懊嫠鶎W(xué)知識的復(fù)習(xí)鞏固,以及形成知識的輸出。
  • 相信大家也玩過井字棋,甚至熟練掌握井字棋的棋法并且百戰(zhàn)百勝。是的,這就是我的1.0版本,對抗人工智障,你將百戰(zhàn)百勝。由于博主知識暫時有限,不能寫出一個具有戰(zhàn)略頭腦的電腦玩家與你斗智斗勇。只能設(shè)計出一個胡亂下棋的電腦玩家。沒錯,就是胡亂下的。但是經(jīng)過我后期的學(xué)習(xí)一定會對這個游戲進行優(yōu)化。

游戲設(shè)計思路

這里我們把這個游戲項目整體上分為三個模塊

  • 頭文件(game.h)c語言中頭文件中一般定義了函數(shù)的聲明、結(jié)構(gòu)體的定義、宏定義。(常量和全局變量最好放到源文件中)
  • 源文件(game.c)在這個源文件中我們放置一些函數(shù)。來將游戲的具體實現(xiàn)。 源文件(test.c)里面放主函數(shù)和游戲的整體功能。
  • 這樣寫的好處可以不至于一個游戲直接在一個源文件寫幾百行,不能及時檢查錯誤,而導(dǎo)致bug頻出。
  • 把游戲分為一個個的模塊就可以提高代碼的可讀性,減少錯誤率。
    我們規(guī)定人下的棋子為 “x”,電腦下的棋子為 “o”。
  • 為了照顧沒有設(shè)計過的朋友,在這里我會講的詳細一些。
  • 先按照我們正常的思維來設(shè)計。
    • 一、工欲善其事,必先利其器。我們首先需要先設(shè)計一個3 * 3的一個棋盤,如上圖所示。
    • 二、然后玩家先手下棋。
    • 三、電腦下棋。
    • 四、我們需要在第三個回合判斷輸贏(就是判斷三個棋子是否在一條線上)
    • 五、如果沒有分出勝負,我們需要繼續(xù)進行循環(huán) – 步驟三、四、五。直到判斷出輸贏,或者平局。
  • 現(xiàn)在我們用程序員的話翻譯以上句子是什么意思。
    • 一、生成一個3*3的二維數(shù)組,并將二維數(shù)組初始化后用符號打印出來。
    • 二、運用二維數(shù)組輸入兩個數(shù)字定位棋子落下的位置。
    • 三、運用rand函數(shù)生成隨機數(shù)。對二維數(shù)組(即3*3的棋盤)進行遍歷。if有空位,就下棋 *
    • 四、判斷二維數(shù)組上的行,列,十字相交,的位置是否構(gòu)成一條線。
    • 五、運用循環(huán)語句對此進行判斷輸贏,或平局。

生成菜單界面(do while)

  • 玩過超級瑪麗,或者魂斗羅的都知道。我們進入游戲的時候都有一個菜單界面,來選擇玩游戲,或者退出游戲。因此在我們進行玩游戲之前,需要用do語句先生成一個菜單來進行選擇。
void menu() {printf("————1.play————\n");printf("————2.exit————\n"); }

初始化棋盤

宏定義:

  • 將3用ROW,COL代替。
  • 提高擴展性,如果將來要修改棋盤尺寸,代碼修改會很方便。
#define ROW 3 #define COL 3
  • 運用循環(huán)嵌套,對3 *3的二維數(shù)組進行遍歷,實現(xiàn)9個格子都是空格。
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] = ' ';}} }

生成棋盤(二維數(shù)組的應(yīng)用)

  • 重點:數(shù)組是通過下標來訪問元素的
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++)//控制打印的行數(shù){for (j = 0; j < col; j++)//控制每行的列數(shù){printf(" %c ", board[i][j]);if (j < col - 1)//col為3,if(j<2),意思就是只打印棋盤的第一列和第二列。printf("|");}printf("\n");//每打印一行就需要換行if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("+");}}printf("\n");} }
  • 如圖所示

玩家下棋

  • 運用if的嵌套
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)//對下棋位置進行約定,只能下到3*3的棋盤內(nèi)。{if (board[x - 1][y - 1] == ' ')//x-1和y-1的寫法就是因為對我們程序員來說數(shù)組的元素下標識從0開始的。{//數(shù)組通過下標來訪問元素。但是玩家卻不懂這個。所以要這么寫。board[x - 1][y - 1] = 'x';break;}else{printf("坐標已被占用,請重新輸入\n");}}else{printf("坐標非法,請重新輸入\n");}} }

電腦下棋(隨機數(shù)生成)

  • 隨機數(shù)的生成.要在主函數(shù)中使用 srand((unsigned int)time(0))
  • 將time作為種子,保證時間的隨機性。從而使棋子隨機生成。
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;}}}

判斷輸贏

  • 規(guī)定:
    • 返回‘Q’是平局
    • 返回‘c’是繼續(xù)
  • 下面是判斷三行,三列,還有十字相交是否相同,然后還要繼續(xù)判斷棋盤是否滿了,最后才能判斷是否輸贏。
  • 判斷棋盤滿不滿需要調(diào)用is_full函數(shù)。
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,為真,則是棋盤滿了,然后就返回Q來跳出循環(huán)。
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; }

游戲全部代碼

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("對抗結(jié)果如下:\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'; }

游戲效果圖


勝利

失敗

  • 失敗的截圖可以自己下去試試哦。

最后,如果你覺得我的文章對你有幫助🎉歡迎關(guān)注🔎點贊👍收藏??留言📝。

總結(jié)

以上是生活随笔為你收集整理的井字棋版本1.0(对抗人工智障)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。