溫馨提示×

溫馨提示×

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

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

使用C語言怎么制作一個掃雷游戲

發布時間:2021-04-20 15:41:19 來源:億速云 閱讀:185 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關使用C語言怎么制作一個掃雷游戲,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

C語言是什么

C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用于底層開發,使用C語言可以以簡易的方式編譯、處理低級存儲器。

需要的功能

1.保證第一次下子時,不被炸死
2.輸入的坐標周圍沒雷,可以直接展開周圍的坐標
3.輸入的坐標周圍有雷時,應該顯示周圍有多少個雷

注意事項

1.應該定義兩個數組,一個用來向玩家展示排雷的情況,一個來存放雷
2.定義的數組的大小,應該大于掃雷游戲的棋盤的真實大小,防止數組越界
(如:在掃雷的棋盤為99時,我們應該定義1111的數組,防止數組越界)
3.可以將代碼分文件實現

代碼的實現

分文件

將代碼分別寫入game.c,game.h,test.c文件里,可以讓代碼更加有條理
test.c主要寫游戲主要框架
game.c實現需要的函數
game.h定義需要的函數

使用C語言怎么制作一個掃雷游戲

對兩個數組初始化

//board-需要初始化的數組
//set-初始化的元素(這里我將'1'設置為雷,'0'代表沒有雷;將玩家看到的棋盤初始化為'*')
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
 int i;
 int j;
 for (i = 0; i < rows; i++)
 {
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}

打印功能

//打印
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
 int i;
 int j=1;
 printf("-----------------------------\n");//分割每次打印的棋盤,防止混淆
 for (i = 0; i <= row; i++)
 {//打印列號
  printf("%d ", i);
 }
 printf("\n");
 for (i = 1; i <= row; i++)
 {
  printf("%d ", i);//打印行號
  for (j = 1; j <= col; j++)
  {
   printf("%c ", board[i][j]);
  }
  printf("\n");
 }
 printf("-----------------------------\n");

}

布置雷

//布置雷
//count-布置的雷的數量
void SetMineBoard(char board[ROWS][COLS], int row, int col, int count)
{
 while (count)
 {
  int x = rand() % row + 1;
  int y = rand() % col + 1;
  if (board[x][y] == '0')
  {
   board[x][y] = '1';
   count--;
  }
 }
}

排查雷

//排查雷
//num-雷的數量
void FineMine(int row, int col, int num)
{
 int flag = 1;
 int a = 1;
 while (flag)
 {
  printf("請輸入一個坐標:");
  int x;
  int y;
  scanf("%d%d", &x, &y);
  if (a == 1)//第一次輸入坐標需要進行判斷,防止第一次就踩到了雷
  {
   a--;
      safe(x, y,ROW,COL);//安全函數,保證第一次不會踩到雷
  }

  if (x >= 1 && x <= row&&y >= 1 && y <= col)//坐標合法
  {
   if (mine[x][y] != '1')//如果該位置不是雷,應該搜索周圍有多少雷
   {
    int count = GetMineCount(x, y);//查找周圍雷的數量
    show[x][y] = count + '0';
    if (show[x][y] == '0')
    {//該位置沒有雷時,應該繼續展開搜索周圍的坐標
     open_mine(x, y);//展開周圍坐標功能
     int z = count_show_mine(row, col);
     if (z == num)
     {
      printf("你已經找出全部的雷,游戲勝利\n");
      DisplayBoard(show, ROW, COL);//打印
      break;
     }
    }
    DisplayBoard(show, ROW, COL);//打印
   }
   else
   {
    printf("你踩到雷,游戲結束\n");
    DisplayBoard(mine, ROW, COL);//打印
    flag = 0;
   }
  }
  else
  {
   printf("坐標有誤,請重新輸入");
  }
 }
}

保證第一次下子時,不被炸死

//保證不會在第一次時踩到雷
void safe(int x, int y, int row, int col)
{
 int q = 1;
 if (mine[x][y] == '1')
 {//如果此處是雷,將雷換到其他地方
  mine[x][y] = '0';
  while (q)
  {
   int a = rand() % row + 1;
   int b = rand() % col + 1;
   if (mine[a][b] == '0'&&a!=x&&b!=y)
   {
    q--;
    mine[a][b] = '1';
   }
  }
 }
}

統計周圍有幾個雷;

//統計坐標(x,y)周圍有幾個雷;
int GetMineCount(int x, int y)
{
 return (mine[x - 1][y - 1])
  + (mine[x - 1][y])
  + (mine[x - 1][y + 1])
  + (mine[x][y - 1])
  + (mine[x][y + 1])
  + (mine[x + 1][y - 1])
  + (mine[x + 1][y])
  + (mine[x + 1][y + 1])
  - 8 * '0'; 
}

展開周圍坐標

//展開排查周圍坐標的情況
void open_mine(int x, int y)//坐標周圍展開函數
{
 if (mine[x - 1][y - 1] == '0')
 {
  show[x - 1][y - 1] = GetMineCount(x - 1, y - 1) + '0';//顯示該坐標周圍雷數
 }
 if (mine[x - 1][y] == '0')
 {
  show[x - 1][y] = GetMineCount(x - 1, y) + '0';//顯示該坐標周圍雷數
 }
 if (mine[x - 1][y + 1] == '0')
 {
  show[x - 1][y + 1] = GetMineCount(x - 1, y + 1) + '0';//顯示該坐標周圍雷數
 }
 if (mine[x][y - 1] == '0')
 {
  show[x][y - 1] = GetMineCount(x, y - 1) + '0';//顯示該坐標周圍雷數
 }
 if (mine[x][y + 1] == '0')
 {
  show[x][y + 1] = GetMineCount(x, y + 1) + '0';//顯示該坐標周圍雷數
 }
 if (mine[x + 1][y - 1] == '0')
 {
  show[x + 1][y - 1] = GetMineCount(x + 1, y - 1) + '0';//顯示該坐標周圍雷數
 }
 if (mine[x + 1][y] == '0')
 {
  show[x + 1][y] = GetMineCount(x + 1, y) + '0';//顯示該坐標周圍雷數
 }
 if (mine[x + 1][y + 1] == '0')
 {
  show[x + 1][y + 1] = GetMineCount(x + 1, y + 1) + '0';//顯示該坐標周圍雷數
 }
}

判斷勝利

//判斷剩余未知區域的個數,個數為雷數時玩家贏
int count_show_mine(int row,int col)
{
 int count = 0;
 int i = 0;
 int j = 0;
 for (i = 1; i <= row - 2; i++)
 {
  for (j = 1; j <= col - 2; j++)
  {
   if (show[i][j] == '*')
   {
    count++;
   }
  }
 }
 return count;
}

效果展示

1.打印和布置

第一個數組是玩家在游戲看到的數組,第二個數組是存放雷的數組,在游戲中第二個數組不會被打印

使用C語言怎么制作一個掃雷游戲

2.safe函數的檢查

第一個數組為本來存放雷的數組,可以看到此時(1,7)位置是有雷的,但是,我們在輸入(1,7)坐標時,因為safe函數的功能,使得(1,7)位置的雷轉移到其他地方

使用C語言怎么制作一個掃雷游戲

3.由上圖可知(2,8)存放的有雷,這時我們輸入(2,8)(不是第一次輸入),游戲結束

使用C語言怎么制作一個掃雷游戲

4.展開功能

第一個數組仍然為布置雷后打印出的數組,我們可以看到(3,3)位置及周圍都沒有雷,所以我們輸入(3,3)看到其周圍8個位置也被搜索

使用C語言怎么制作一個掃雷游戲

以上就是使用C語言怎么制作一個掃雷游戲,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女