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

用C語言實現(xiàn)三子棋游戲

 更新時間:2021年07月30日 12:02:23   作者:倉笙  
這篇文章主要為大家詳細介紹了用C語言實現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

初始工作,通過#define 定義一個標識符來表示一個常量(棋盤的橫縱坐標)
(因為在代碼的編寫中,會有多處需要用到坐標。那么,在閱讀代碼時就可能會導致讀者疲于理解當前的值到底是代表什么,即會對代碼的解讀造成困擾。所以,在該代碼中通過使用宏定義解決了這個問題,同時也方便后續(xù)更改棋盤的大小。)

#define MAX_ROW 3
#define MAX_COL 3

游戲創(chuàng)建流程

1. 創(chuàng)建棋盤

創(chuàng)建棋盤(二維數組),并將其初始化(空白,無子狀態(tài))。

//1. 棋盤初始化
void init(char chessBoard[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   //將這個棋盤(二維數組)每個位置都初始化為空
   chessBoard[row][col] = '   ';
  }
 }
}

2. 打印棋盤

打印棋盤,令玩家能夠看到此時棋盤的狀態(tài)。

//2. 打印棋盤
void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]) {
 printf("+---+---+---+\n");
 for(int row = 0; row < MAX_ROW; row++) {
  printf("|");
  for (int col = 0; col < MAX_COL; col++) {
   printf(" %c |", chessBoard[row][col]);
  }
  printf("\n+---+---+---+\n");
 }
}

3. 玩家落子

玩家將通過輸入坐標(row, col)落子。
注意:在玩家選擇坐標后需要做合法性檢驗,即判斷玩家落子的位置是否已經有子,如果有,則玩家需要重新輸入坐標落子。

//3. 玩家落子
void playMove(char chessBoard[MAX_ROW][MAX_COL]) {
 while (1) {
  int row = 0, col = 0;
  printf("請玩家通過輸入坐標落子:");
  scanf("%d %d", &row, &col);
      //檢驗玩家是否輸入錯誤
   if (row < 0 || col < 0 || row >= MAX_ROW || col >= MAX_COL) {
    printf("輸入錯誤!請重新輸入");
    continue;
   }
         // 檢驗玩家輸入的位置 是否已經有子(判斷位置是否為空,不為空即有子)
   else if (chessBoard[row][col] != ' ') {
    printf("該位置已經有子,請重新輸入");
    continue;
   }
   else {
    //沒問題,落子,標記為'x',并退出當前循環(huán)
    chessBoard[row][col] = 'x';
    break;
   }
 }
}

4. 判定此時勝負情況

4.1 判斷當前勝負情況,有四種獲勝的方式:

1)橫著3個都是一樣的字符;
2)豎著3個都是一樣的字符;
3)1,3象限對角線的3個位置都是一樣的字符;
4)2,4象限對角線的3個位置都是一樣的字符。

//4. 判定勝負情況,檢查棋盤的所有位置,是否符合勝利的4種情況
//玩家獲勝,返回x; 電腦獲勝,返回o; 和棋返回p; 
char chessWin(char chessBoard[MAX_ROW][MAX_COL]) {
 //判斷橫著的3個位置
 for (int row = 0; row < MAX_ROW; row++) {
  if (chessBoard[row][0] != ' ' && chessBoard[row][0] == chessBoard[row][1] && chessBoard[row][0] == chessBoard[row][2]) {
   return chessBoard[row][0];
  }
 }
 //判斷豎著的3個位置
 for (int col = 0; col < MAX_COL; col++) {
  if(chessBoard[0][col] != ' ' && chessBoard[0][col] == chessBoard[1][col] && chessBoard[0][col] == chessBoard[2][col] ){
   return chessBoard[0][col];
  }
 }
 //判斷2,4象限對角線的3個位置
 if (chessBoard[0][0] != ' ' && chessBoard[0][0] == chessBoard[1][1] && chessBoard[0][0] == chessBoard[2][2]) {
  return chessBoard[0][0];
 }
 //判斷1,3象限對角線的3個位置
 if (chessBoard[2][0] != ' ' && chessBoard[2][0] == chessBoard[1][1] && chessBoard[2][0] == chessBoard[0][2]) {
  return chessBoard[2][0];
 }
 if (isFull(chessBoard)) {
  return 'p';
 }
 return ' ';
}

4.2 勝負情況判斷后有4種情況,分別是:

1)玩家獲勝,返回 ‘x' ;
2)電腦獲勝,返回 ‘o' ;
3)和棋,棋盤下滿了,但是沒有分出勝負,返回 ‘p' ;
4)棋盤還有位置是空著的,下棋繼續(xù),返回 ‘ ' ;

我們在主函數中定義一個字符變量,用來判斷程序結束返回的是什么,繼而判斷是玩家獲勝、電腦獲勝、和棋還是游戲未結束。
根據字符型變量的值得知游戲的結果(具體過程如后主函數內容所示)。

4.3 判斷是否和棋的函數為:

//4.3 判斷是否和棋(棋盤滿了,但未分勝負),返回1表示棋盤滿了,返回0表示棋盤未滿
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (chessBoard[row][col] == ' ') {
    return 0;
   }
  }
 }
 return 1;
}

5. 電腦落子(電腦隨機落子)

通過 rand() 函數實現(xiàn)電腦的隨機落子。
(取余運算是很好的截短方法,在這里,我們通過取余運算將橫縱坐標的值控制在了[0,2]之間。)

//5. 電腦落子(隨機)
void computerPlayMove(char chessBoard[MAX_ROW][MAX_COL]) {
 while (1) {
  //控制落子的坐標 x,y 在[0,2]之間
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  //判斷電腦想落子的位置是否為空(即是否已經有子),如若已經有子,繼續(xù)循環(huán)
  if (chessBoard[row][col] != ' ') {
   continue;
  }
  //如果電腦想落子的位置為空,則將 ‘o' 賦給該位置,并結束循環(huán)
  chessBoard[row][col] = 'o';
  break;
 }
}

6. 判定此時勝負情況

同過程4。

7. 主函數

注意,我們將 字符型二維數組棋盤 寫在了主函數中,而非整個程序的開頭。
原因是:如果寫在開頭,那么這個變量就是全局變量了。
全局變量的生命周期是整個程序,會占用更多的內存,而且如果在程序中間已經使用完畢這個變量,也是不能釋放內存的。
此外,全局變量的作用域是整個工程。如果在哪里將它改動后,整體都會受到影響,在查問題出在哪里的時候會很麻煩。
所以,本著盡量不使用全局變量的原則,將這個變量寫在了主函數中。當其他函數需要這個參數的時候,再進行傳參使用即可。

int main() {
 char chessBoard[MAX_ROW][MAX_COL];
 char winner = ' ';
 //1. 棋盤初始化
 init(chessBoard);

 while (1) {
  //2. 打印棋盤,令玩家觀察此時棋盤的狀態(tài)
  printChessBoard(chessBoard);
  //3. 玩家落子
  playMove(chessBoard);
  //4. 判斷勝負情況
  winner = chessWin(chessBoard);
  if (winner != ' ') {
   //已經有非空返回值,游戲結束
   break;
  }
  //5. 電腦落子
  computerPlayMove(chessBoard);
  //4. 判斷勝負情況
  winner = chessWin(chessBoard);
  if (winner != ' ') {
   //已經有非空返回值,游戲結束
   break;
  }
 }
 if (winner == 'x') {
  printChessBoard(chessBoard);
  printf("恭喜玩家獲勝!");
 }
 else if (winner == 'o') {
  printChessBoard(chessBoard);
  printf("惜敗,電腦獲勝了哦~");
 }
 else {
  printChessBoard(chessBoard);
  printf("哎呀,你和電腦打成平手了呢~");
 }

 system("pause");
 return 0;
}

以上就是我在寫三子棋游戲的思路、代碼以及一些需要注意的點。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 基于一致性hash算法 C++語言的實現(xiàn)詳解

    基于一致性hash算法 C++語言的實現(xiàn)詳解

    在《基于一致性hash算法(consistent hashing)的使用詳解》一文中已經介紹了一致性hash的基本原理,本文將會對其具體實現(xiàn)細節(jié)進行描述,并用c++語言對一致性hash進行了簡單的實現(xiàn)
    2013-05-05
  • C++實現(xiàn)LeetCode(152.求最大子數組乘積)

    C++實現(xiàn)LeetCode(152.求最大子數組乘積)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(152.求最大子數組乘積),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 關于CLion配置visual?studio(msvc)和JOM多核編譯的問題

    關于CLion配置visual?studio(msvc)和JOM多核編譯的問題

    這篇文章主要介紹了CLion配置visual?studio(msvc)和JOM多核編譯,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 帶你從編碼角度分析C++重載原理

    帶你從編碼角度分析C++重載原理

    這篇文章主要為大家介紹了從編碼角度分析C++重載原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言實現(xiàn)十六進制與二進制的相互轉換

    C語言實現(xiàn)十六進制與二進制的相互轉換

    這篇文章主要為大家詳細介紹了如何利用c語言實現(xiàn)將文件中十六進制數據與二進制數據相互轉換,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的可以學習一下
    2022-11-11
  • C語言的隨機數rand()函數詳解

    C語言的隨機數rand()函數詳解

    這篇文章主要為大家詳細介紹了C語言的隨機數rand()函數,使用數據庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++自帶的sort函數如何對vector容器元素進行排序

    C++自帶的sort函數如何對vector容器元素進行排序

    這篇文章主要介紹了C++自帶的sort函數如何對vector容器元素進行排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • C++控制結構詳情

    C++控制結構詳情

    這篇文章主要介紹了C++控制結構詳情,C++的控制結構和其它編程語言類似包括順序結構、選擇結構、循環(huán)結構,更多相關資料需要的小伙伴可以參考下面文章內容
    2022-03-03
  • C++語言設計實現(xiàn)五子棋

    C++語言設計實現(xiàn)五子棋

    這篇文章主要為大家詳細介紹了C++語言設計實現(xiàn)五子棋,包括數據結構和對象設計及主函數調用實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C++枚舉類型enum與enum class的使用

    C++枚舉類型enum與enum class的使用

    這篇文章主要介紹了C++枚舉類型enum與enum class的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論

乌兰县| 乐山市| 连山| 靖安县| 霞浦县| 县级市| 和田县| 大新县| 尉氏县| 永清县| 启东市| 方城县| 盐津县| 东阿县| 安宁市| 合作市| 高淳县| 盐山县| 砀山县| 广昌县| 河东区| 读书| 忻州市| 古交市| 贺州市| 清涧县| 如皋市| 大洼县| 巴里| 陕西省| 香河县| 青川县| 亳州市| 平远县| 岳西县| 卢湾区| 南漳县| 大姚县| 新营市| 丰城市| 稷山县|