中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言怎么實現三子棋小游戲

發布時間:2022-04-01 17:11:48 來源:億速云 閱讀:132 作者:iii 欄目:編程語言

這篇文章主要介紹“C語言怎么實現三子棋小游戲”,在日常操作中,相信很多人在C語言怎么實現三子棋小游戲問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言怎么實現三子棋小游戲”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

①游戲效果

  • 有一個3*3的棋盤

  • 每次下棋后(電腦和玩家),棋盤會更新數據

  • 會有菜單提示相關命令進行相關操作

  • 下棋方法是輸入坐標

  • 每一局游戲結束后,會詢問是否繼續.

②主函數邏輯搭建

任何一個項目的實現,最重要的就是邏輯結構搭建,而各個功能的實現就是采取函數(模塊化)進行細分.

所以我們需要搭建邏輯,那么邏輯結構是啥呢?

  • 首先會跳出提示菜單,內容為 0退出游戲,1開始/繼續游戲,其他鍵提示錯誤,并重新輸入

  • 按0后提示 “成功退出游戲”

  • 按1開始游戲

#include <stdio.h>
int main()
{
 int input = 0;
 do
 {
        remind(); // 提示菜單
        scanf("%d",&input); //開始輸入命令
  switch (input)
  {
  case 0:
   printf("成功退出游戲
");
   break;
  case 1:
   playgame(); // 開始游戲
            printf("是否繼續游戲
");
   break;
  default :
   printf("命令錯誤,請重新選擇
");
   break;
  }
 } while (input);
 return 0;
}

③游戲模塊(playgame)邏輯搭建

前面的邏輯結構已經搭建,而我們需要實現的就是 playgame()模塊.

那么他的功能邏輯是啥呢??

  • 棋盤內容用二維數組存儲

  • 初始化棋盤(即棋盤上還沒有下子).所以初始化是一個單獨模塊

  • 對弈分為兩個模塊(電腦下子與玩家下子)

  • 每一局對弈后,都要判斷電腦或玩家是否贏.(所以又是一個單獨的判斷輸贏模塊)

#define row 3
#define col 3

void playgame()
{
 char board[row][col]; // 存儲下子內容
 int result = 0; //用來接收Iswin函數判斷的返回值

 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子

 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態

 while (1) //開始進行對弈,直到一方贏或者平局結束循環
 {
  player(board, row, col);  //玩家下子函數

  if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數的設定是如果玩家勝利,返回1

  computer(board, row, col);  //電腦下子函數

  if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數的設定是 如果電腦勝利,返回-1

  if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續對弈
 }

 if (result == 1) printf("恭喜您取得勝利!!!!!!!!!
");
 else if (result == -1) printf("你也太辣雞了吧,電腦都下不贏
");
 else printf("哎~~,你的技術不行啊,居然和電腦達成平手
");
}

解釋:

可以清晰的明白playgame()函數的邏輯結構.

其中有一步驟是這樣的if (Iswin(board, row, col) >= 0),它的執行是先調用函數(滿足我們需要判斷誰贏的要求),再利用返回結果判斷是否結束循環,一條程序就達到兩個效果,比較妙.

④分支模塊具體實現

0.remind函數實現

就是起到一個提示作用,直接打印就行.

void remind()
{
 printf("+------------------------------------------+
"
        "+--------------  0 結束游戲  --------------+
"
        "+-----------  1 開始/繼續游戲  ------------+
"
        "+------------------------------------------+
");

}

1.Initboard函數實現

既然是初始化函數,說明我們的要求就是把二維數組board初始化為全空格.

void Initboard(char(*board)[3],int Row,int Col )
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  for (j = 0; j < Col; j++)
  {
   board[i][j] = " "; // 賦予空格
  }
 }
}

2.Displayboard函數實現

顯示棋盤內容顯示的不止是二維數組board的內容,還要加上邊界(如圖),所以Displayboard的要求是什么?

C語言怎么實現三子棋小游戲

既要顯示邊界,也要顯示board的存儲內容.

而顯示邊界我們可以分成小塊循環顯示,比如看成3個條形加上最后下邊界

C語言怎么實現三子棋小游戲

每一個條形又可以看成三個小方塊加上小右邊界

C語言怎么實現三子棋小游戲

void Displayboard(char(*board)[3], int Row, int Col)
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  printf("+---+---+---+
");   //打印小條形的上邊界
  for (j = 0; j < Col; j++)
  {
   printf("| %c ",board[i][j]); //打印小條形中的方塊內容
  }
  printf("|
"); //補上 小右邊界
 }
 printf("+---+---+---+
"); //補上 下邊界
}

3.player函數實現

玩家下棋采用的是坐標輸入方式

玩家輸入一個坐標,那么棋盤上的相應位置就應該更新.(相應位置用 * 表示)

輸入坐標時候還要檢驗該位置是否已經落子了.

void player(char(*board)[3], int Row, int Col)
{
 printf("請分別輸入橫縱坐標(輸入數據請用空格隔開):
");
 scanf("%d%d", &Row, &Col);
 while (1)
 {
  if (((1 <= Row) && (Row <= 3))  //邊界必須合格,且該地方無子
   && ((1 <= Col) && (Col <= 3))
   && (board[Row-1][Col-1] == " "))
  {
   board[Row - 1][Col - 1] = "*"; //之所以Row - 1  Col - 1是考慮到玩家不一定是程序員,他不知道編程從0開始數
   break;
  }
  else
  {
   printf("請仔細堅持你的坐標位置,是否已經落子或坐標超界,然后重新輸入坐標.
");
   printf("請輸入坐標:
");
   scanf("%d%d", &Row, &Col);
  }
 }
 printf("下子成功!
");
 Displayboard(board, row, col); // 無論是玩家還是電腦下子,都需要顯示出下子內容
}

4.Iswin函數實現

玩家或者電腦下子后,需要判斷雙方有一方是否贏.

Iswin的作用就是判斷是否有一方贏.

其中返回值1代表玩家勝利,返回值0代表平局,返回值-1代表電腦贏

判斷勝利方法就是檢查每行每列以及斜線是否有一樣的,以及是否不輸不贏

int Iswin(char(*board)[3], 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] != " "))
  {
   if (board[i][0] == "*") return 1;  //如果一行都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 for (int j = 0; j < Col; j++) //每一列
 {
  if ((board[0][j] == board[1][j])
   && (board[1][j] == board[2][j])
   && (board[0][j] != " "))
  {
   if (board[0][j] == "*") return 1; //如果一列都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != " ")) //斜線
  ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != " ")))
 {
  if (board[1][1] == "*") return 1;
  return -1;
 }

 for (int i = 0; i < Row; i++)
 {
  for (int j = 0; j < Col; j++)
  {
   if (board[i][j] == " ")
    return -2; //如果前三者情況都沒有,只要目前棋盤上還剩下空余位置
                  //就說明不輸不贏,需要繼續對弈.返回[-1,1]之外的值就行
  }
 }

 return 0; //除去上面4種情況就是平局
}

5.computer函數實現

由于是電腦下載,我們無法操作,于是只有讓電腦隨機下載了.缺陷是電腦就有點智障了,哈哈.

#include <stdlib.h>
#include <time.h>
void computer(char(*board)[3], int Row, int Col)
{
 srand(time(NULL));
 while (1)
 {
  int i = rand() % 3;
  int j = rand() % 3;
  if (board[i][j] == " ")
  {
   board[i][j] = "#";//#代表電腦下子
   break;
  }
 }
 printf("電腦已下子:
");
 Displayboard(board, row, col); //電腦下子后,顯示棋盤
}

⑤完整代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define row 3
#define col 3

void remind()
{
 printf("+------------------------------------------+
"
        "+--------------  0 結束游戲  --------------+
"
        "+-----------  1 開始/繼續游戲  ------------+
"
        "+------------------------------------------+
");

}

void Initboard(char(*board)[3],int Row,int Col )
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  for (j = 0; j < Col; j++)
  {
   board[i][j] = " "; // 賦予空格
  }
 }
}

 

void Displayboard(char(*board)[3], int Row, int Col)
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  printf("+---+---+---+
");
  for (j = 0; j < Col; j++)
  {
   printf("| %c ",board[i][j]);
  }
  printf("|
");
 }
 printf("+---+---+---+
");
}

void player(char(*board)[3], int Row, int Col)
{
 printf("請分別輸入橫縱坐標(輸入數據請用空格隔開):
");
 scanf("%d%d", &Row, &Col);
 while (1)
 {
  if (((1 <= Row) && (Row <= 3))  //邊界必須合格,且該地方無子
   && ((1 <= Col) && (Col <= 3))
   && (board[Row-1][Col-1] == " "))
  {
   board[Row - 1][Col - 1] = "*"; //之所以Row - 1  Col - 1是考慮到玩家不一定是程序員,他不知道編程從0開始數
   break;
  }
  else
  {
   printf("請仔細堅持你的坐標位置,是否已經落子或坐標超界,然后重新輸入坐標.
");
   printf("請輸入坐標:
");
   scanf("%d%d", &Row, &Col);
  }
 }
 printf("下子成功!
");
 Displayboard(board, row, col); // 無論是玩家還是電腦下子,都需要顯示出下子內容
}


void computer(char(*board)[3], int Row, int Col)
{
 srand(time(NULL));
 while (1)
 {
  int i = rand() % 3;
  int j = rand() % 3;
  if (board[i][j] == " ")
  {
   board[i][j] = "#";//#代表電腦下子
   break;
  }
 }
 printf("電腦已下子:
");
 Displayboard(board, row, col); //電腦下子后,顯示棋盤
}

int Iswin(char(*board)[3], 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] != " "))
  {
   if (board[i][0] == "*") return 1;  //如果一行都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 for (int j = 0; j < Col; j++) //每一列
 {
  if ((board[0][j] == board[1][j])
   && (board[1][j] == board[2][j])
   && (board[0][j] != " "))
  {
   if (board[0][j] == "*") return 1; //如果一列都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != " ")) //斜線
  ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != " ")))
 {
  if (board[1][1] == "*") return 1;
  return -1;
 }

 for (int i = 0; i < Row; i++)
 {
  for (int j = 0; j < Col; j++)
  {
   if (board[i][j] == " ")
    return -2; //如果前三者情況都沒有,只要目前棋盤上還剩下空余位置
                  //就說明不輸不贏,需要繼續對弈.返回[-1,1]之外的值就行
  }
 }

 return 0; //除去上面4種情況就是平局
}


void playgame()
{
 char board[row][col]; // 存儲下子內容
 int result = 0; //用來接收Iswin函數判斷的返回值

 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子

 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態

 while (1) //開始進行對弈,直到一方贏或者平局結束循環
 {
  player(board, row, col);  //玩家下子函數

  if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數的設定是如果玩家勝利,返回1

  computer(board, row, col);  //電腦下子函數

  if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數的設定是 如果電腦勝利,返回-1

  if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續對弈
 }

 if (result == 1) printf("恭喜您取得勝利!!!!!!!!!
");
 else if (result == -1) printf("你也太辣雞了吧,電腦都下不贏
");
 else printf("哎~~,你的技術不行啊,居然和電腦達成平手
");
}


#include <stdio.h>
int main()
{
 int input = 0;
 do
 {
  remind(); // 提示菜單
  scanf("%d", &input); //開始輸入命令
  switch (input)
  {
  case 0:
   printf("成功退出游戲
");
   break;
  case 1:
   playgame(); // 開始游戲
   printf("是否繼續游戲
");
   break;
  default:
   printf("命令錯誤,請重新選擇
");
   break;
  }
 } while (input);
 return 0;
}

到此,關于“C語言怎么實現三子棋小游戲”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

女性| 公安县| 丰都县| 朔州市| 苏尼特左旗| 错那县| 甘泉县| 松阳县| 怀柔区| 舒城县| 福贡县| 闻喜县| 平邑县| 修文县| 弥渡县| 和政县| 镇宁| 昌吉市| 宁海县| 中牟县| 雷波县| 高尔夫| 巴楚县| 曲周县| 兴城市| 基隆市| 阿城市| 桐柏县| 卢氏县| 高邑县| 习水县| 闵行区| 藁城市| 凌云县| 阿勒泰市| 鸡泽县| 永兴县| 盱眙县| 三江| 杨浦区| 武宣县|