最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)井字棋游戲

 更新時間:2021年04月28日 09:39:50   作者:晴空孤縷光  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言實(shí)現(xiàn)井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下

首先,我們需要一個大體的思路,先進(jìn)行宏觀規(guī)劃,再對細(xì)節(jié)進(jìn)行實(shí)現(xiàn)。

比如:

1、首先需要一個菜單面板作以修飾,在這個面板上,玩家可以選擇進(jìn)入游戲或者退出游戲。
2、需要一個游戲程序,這個是核心。

差不多就是這兩個了,我們可以先把這個寫下來,這樣也可以方便后面使用,像這樣:

void Game();
int Menu();//這里Menu之所以用int,是為了用返回值來確定是否退出游戲,并非唯一,也非最佳,讀者自己嘗試

為了豐富游戲內(nèi)容,我們可以加入一個選項(xiàng)在函數(shù)Game()里,比如PVE模式、PVP模式。

void PVP();
void PVE();

接下來,我們就可以用主函數(shù)把這些東西連起來啦!如下:

int main() {
 int i=Menu();
 if (i == 1) {
  Game();
 }
  printf("再見");
 return 0;
}

這樣就大功告成啦~~(最后哪個再見可以不要,這個代碼中,筆者為了優(yōu)化玩家游戲體驗(yàn),加入了很多不必要的東西,讀者均可以不寫,主要視讀者興趣而定)

接下來我們來實(shí)現(xiàn)細(xì)節(jié),先來寫菜單:(如下)

int Menu() {
//以下是修飾用的菜單面板
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1:開始游戲   #####\n");
 printf("###### 2:退出游戲   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("請選擇:");
//下面這個循環(huán)的目的是為了確認(rèn)玩家是否輸入的是“1”或者“2”,為了使系統(tǒng)可以穩(wěn)定運(yùn)行,這個很重要
 int i = 0;
 while (1) {
  scanf("%d", &i);
  if (i == 1 || i == 2) {
   break;
  }
  printf("\n輸入無效,請重新輸入:");
 }
 if (i == 1)
 return 1;
 return 2;
}

這里我們可以看到,返回了 i ,因?yàn)槲以谥骱瘮?shù)里需要借助這個返回值確定是否進(jìn)入游戲~~

完成面板后,我們就要進(jìn)行我們的核心部分。

函數(shù)Game()的實(shí)現(xiàn)

同樣的,先宏觀操作,根據(jù)需求來寫代碼。

void Game() {
//首先需要一個看起來像棋盤的東西,數(shù)組是個不錯的選擇,
//因?yàn)橐话阄覀冇谩畑'和‘o'來表示兩個玩家的棋子,我們這里把數(shù)組定義成char類型
 char arr[3][3] = {{ ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '}};
//以下是花里胡哨的面板~~
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1:人機(jī)對戰(zhàn)   #####\n");
 printf("###### 2:雙人對戰(zhàn)   #####\n");
 printf("###### 3:退出游戲   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("請選擇:");//提示玩家輸入的窗口 
 int choose = 0;
//這個循環(huán)同樣是為了優(yōu)化系統(tǒng)的穩(wěn)定,不至于被有些調(diào)皮的玩家搞崩~~
 while (1) {
    scanf("%d", &choose);
 if (choose == 1 || choose == 2||choose==3)
  break;
 printf("\n輸入無效,請重新輸入:");
 }
//根據(jù)玩家的選擇進(jìn)入相應(yīng)的模式,這里if(choose==3)的時候顯然Game會運(yùn)行結(jié)束,到達(dá)主函數(shù)的結(jié)束階段,所以筆者偷了個懶,并沒寫這個情況~~,不過這并不影響什么。
 if (choose == 1)
  PVE();
 if (choose == 2)
  PVP();
}

以上都是游戲的基本流程,玩過游戲的老鐵應(yīng)該是爛熟與心的,沒玩過也沒關(guān)系~~,去玩一下就知道了,總之要搞出來一個游戲,我們總得知道玩的過程吧?

接下來實(shí)現(xiàn)兩個模式:

先寫人機(jī)吧?(這個限于筆者能力有限,寫的比較啰嗦,如果讀者有更好的創(chuàng)意,可以去自己實(shí)現(xiàn)~~)

void PVE() {
 int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
 //勝負(fù)判別
 char win = ' ';
 //落子的坐標(biāo)定義
 int i = 0;
 int j = 0;
 //打印棋盤
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
 printf("\n+---+---+---+\n");
 while (1) {
  //玩家落子
  printf("請落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'x';
    break;
   }
   printf("\n請重新輸入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定勝負(fù)
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
            win = '0';
   break;
  }
  //電腦落子 
  while (1) {
   i = (time(0) % 3);
   j = ((time(0)*time(0)) % 3);
   if (arr[i][j] == ' ') {
    arr[i][j] = 'o';
    break;
   }
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定勝負(fù)
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
 }
 if (win == 'o') {
  printf("\n不會吧?不會吧!不會真的有人輸給人工智障吧?\n");//筆者還是個孩子,也比較調(diào)皮哈~~,不建議這么寫,大家成熟些啊~
 }
 else if (win == 'x') {
  printf("\n恭喜獲勝?。?!\n");
 }
 else {
  printf("\n恭喜您與人工智障打成平手?。?!\n");//捂臉~由于電腦走的棋是筆者用時間戳來隨機(jī)確定的,可能真的有些人工智障.
  //這里如果筆者有興趣,可以設(shè)計(jì)一個難度選擇界面,通過感應(yīng)周圍的棋子的位置來確定,或者直接輸入經(jīng)驗(yàn)也可以,憑讀者喜好決定~~

 } 
 //這里筆者考慮到再來一局的設(shè)計(jì),覺得可以提供一些便利,于是就有了下面的遞歸
 int re = 0;
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1;返回菜單    #####\n");
 printf("###### 2:再來一次    #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("請選擇:");
 while (1) {
     scanf("%d", &re);
  if (re == 1 || re == 2)
   break;
  printf("\n輸入違法,請重新輸入:");
 }
 if (re == 1) {
  re=Menu();
  if (re == 1) {
   Game();
  }
 }
 else if (re == 2) {
  PVE();
 }
}

好嘞!以同樣的方式寫下PVP模式,思路差不多,就不詳細(xì)解釋了,具體如下

void PVP() {
 int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
 //勝負(fù)判別
 char win = ' ';
 //落子的坐標(biāo)定義
 int i = 0;
 int j = 0;
 //打印棋盤
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
 printf("\n+---+---+---+\n");
 while (1) {
  //玩家p1落子
  printf("P1玩家請落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'x';
    break;
   }
   printf("\nP1玩家請重新輸入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定勝負(fù)
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
  //玩家p2落子 
  printf("P2玩家請落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'o';
    break;
   }
   printf("\nP2玩家請重新輸入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定勝負(fù)
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == '0') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
 }
 if (win == 'o') {
  printf("\nP2獲得勝利?。?!\n");
 }
 else if (win == 'x') {
  printf("\nP1獲得勝利!?。n");
 }
 else {
  printf("\n平手?。?!\n");
 }
 int re = 0;
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1;返回菜單   #####\n");
 printf("###### 2:再來一次   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("請選擇:");
 while (1) {
  scanf("%d", &re);
  if (re == 1 || re == 2)
   break;
  printf("\n輸入違法,請重新輸入:");
 }
 if (re == 1) {
  re = Menu();
  if (re == 1) {
   Game();
  }
 }
 else if (re == 2) {
  PVP();
 }
}

這樣,所有我們設(shè)計(jì)好的細(xì)節(jié)就都被實(shí)現(xiàn)啦,一個完整的簡單游戲就大功告成了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++數(shù)據(jù)結(jié)構(gòu)與算法的基礎(chǔ)知識和經(jīng)典算法匯總

    C++數(shù)據(jù)結(jié)構(gòu)與算法的基礎(chǔ)知識和經(jīng)典算法匯總

    終是到了標(biāo)志著大二結(jié)束的期末考試了,對于《算法設(shè)計(jì)與分析》這門課,我需要總結(jié)一下學(xué)過的所有算法的思想以及老師補(bǔ)充的關(guān)于兩個復(fù)雜度和遞歸的概念思想,以及更深層次的理解,比如用畫圖的方式表達(dá)出來,我覺得可以用博客記錄總結(jié)一下,分享給大家,希望能有所幫助
    2022-05-05
  • vscode分享代碼插件Polacode介紹

    vscode分享代碼插件Polacode介紹

    這篇文章主要介紹了vscode分享代碼插件Polacode的相關(guān)知識,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C++操作.json文件的超詳細(xì)新手教程

    C++操作.json文件的超詳細(xì)新手教程

    最近因?yàn)轫?xiàng)目原因需要解析JSON格式數(shù)據(jù),所以這篇文章主要給大家介紹了關(guān)于C++操作.json文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼

    在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼

    最近的項(xiàng)目在用c處理后臺的數(shù)據(jù)時,因?yàn)楹枚嗤獠拷涌诙荚谑褂肑son格式作為返回的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)描述,如何在c中高效使用和處理Json格式的數(shù)據(jù)就成為了必須要解決的問題,需要的朋友可以參考下
    2023-11-11
  • C語言實(shí)現(xiàn)樹的動態(tài)查找實(shí)例代碼

    C語言實(shí)現(xiàn)樹的動態(tài)查找實(shí)例代碼

    這篇文章主要介紹了C語言實(shí)現(xiàn)樹的動態(tài)查找實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++靜態(tài)持續(xù)變量介紹

    C++靜態(tài)持續(xù)變量介紹

    這篇文章主要介紹了 C++靜態(tài)持續(xù)變量,靜態(tài)持續(xù)變量的定義C++和C語言是一樣的,它擁有三種鏈接性,即外部鏈接性、內(nèi)部連接性和無鏈接性。其中外部鏈接性指的是可以在其他文件中訪問,內(nèi)部鏈接性指的是只能在當(dāng)前文件訪問,需要的朋友可以參考一下
    2021-11-11
  • C++實(shí)現(xiàn)LeetCode(111.二叉樹的最小深度)

    C++實(shí)現(xiàn)LeetCode(111.二叉樹的最小深度)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C語言的mem系列函數(shù)

    詳解C語言的mem系列函數(shù)

    這篇文章主要為大家詳細(xì)介紹了C語言的mem系列函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++精要分析右值引用與完美轉(zhuǎn)發(fā)的應(yīng)用

    C++精要分析右值引用與完美轉(zhuǎn)發(fā)的應(yīng)用

    C++11標(biāo)準(zhǔn)為C++引入右值引用語法的同時,還解決了一個短板,即使用簡單的方式即可在函數(shù)模板中實(shí)現(xiàn)參數(shù)的完美轉(zhuǎn)發(fā)。那么,什么是完美轉(zhuǎn)發(fā)?它為什么是C++98/03 標(biāo)準(zhǔn)存在的一個短板?C++11標(biāo)準(zhǔn)又是如何為C++彌補(bǔ)這一短板的?別急,本節(jié)將就這些問題給讀者做一一講解
    2022-05-05
  • C++ move semantic移動語義介紹

    C++ move semantic移動語義介紹

    首先,移動語義和完美轉(zhuǎn)發(fā)這兩個概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會從C++的值類型,到移動拷貝與移動賦值來理解移動語義與完美轉(zhuǎn)發(fā)
    2022-08-08

最新評論

西盟| 友谊县| 西充县| 万山特区| 巴中市| 永寿县| 南昌县| 西平县| 岢岚县| 渝北区| 台州市| 霞浦县| 鄂托克前旗| 司法| 洛阳市| 泸西县| 江西省| 东乌珠穆沁旗| 涪陵区| 金寨县| 兴和县| 淮安市| 崇礼县| 汝城县| 陇西县| 华宁县| 青川县| 双鸭山市| 扎兰屯市| 永宁县| 来宾市| 安化县| 安多县| 泰来县| 遂宁市| 西贡区| 庆阳市| 新和县| 洪湖市| 汉沽区| 瓦房店市|