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

溫馨提示×

溫馨提示×

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

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

用C語言實現掃雷小游戲實例代碼

發布時間:2021-08-02 09:13:55 來源:億速云 閱讀:116 作者:chen 欄目:開發技術

本篇內容主要講解“用C語言實現掃雷小游戲實例代碼”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“用C語言實現掃雷小游戲實例代碼”吧!

本文實例為大家分享了C語言版掃雷小游戲的具體代碼,供大家參考,具體內容如下

一、游戲功能

1、顯示該點周圍雷的個數
2、第一次下子,不炸死
3、坐標周圍沒雷,可以實現展開

二、效果展示

用C語言實現掃雷小游戲實例代碼

三、設計思路

這里由于博主目前能力有限,所以這里就用輸入坐標的形式來進行排雷。
要想實現上方游戲功能其實也不難,總體思路就是:我們用幾個算法模塊來模擬游戲規則,實現上方的功能,然后用函數來調用各個模塊使游戲跑起來。
接下來我們就來看看如何用C語言代碼來實現游戲吧!

四、游戲實現步驟

1、游戲菜單

首先我們需要打印一份游戲菜單界面,讓玩家進行選擇是否開始游戲,這里我們使用do…while循環語句,使的玩家不至于玩玩一次之后直接退出。

主函數部分:

int main()
{
 int input = 0;
 do
 {
  menu();//打印菜單的函數
  printf("請選擇:>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   printf("開始游戲\n");
   game();//游戲主體
   break;
  case 2:
   system("cls");//清屏選項
   break;
  case 0:
   printf("退出游戲\n");
   break;
  default:
   printf("輸入錯誤,請重新選擇\n");
   Sleep(1000);//1000毫秒--一秒
   system("cls");
   break;
  }
 
 } while (input);
 return 0;
}

這里我們用了Windows庫函數清屏,如果屏幕上顯示的東西太多了,我們可以選擇2來清屏,還有一個睡眠函數,如果輸出錯誤會短暫的提示你一秒,告訴你選擇錯誤了,然后清屏。

菜單函數:

void menu()
{
 printf("**************************************************\n");
 printf("*******       Welcome to Minesweeper       *******\n");
 printf("**********          1. 開始游戲         **********\n");
 printf("**********          2. 清空屏幕         **********\n");
 printf("**********          0. 退出游戲         **********\n");
 printf("**************************************************\n");
}

效果如圖:

用C語言實現掃雷小游戲實例代碼

2、創建初始化棋盤

我們在游戲菜單顯示出來后,就可以進行選擇開始游戲啦!
想玩掃雷就必須得有一個棋盤,這樣我們就可以在上面進行排雷。
在這里我們需要用二維數組來創建兩個棋盤,一個用于展示給玩家,并儲存排雷信息;一個用于在后臺隨機生成雷并儲存。假如我們要打印9X9的棋盤,那我們的二維數組大小也是9X9的嗎?,不能,因為我們在設計算法時需要統計該坐標周圍8個方位雷的個數,假如要統計邊界坐標周圍雷的個數,那么就會有數組越界的問題,那我們就要在9X9的邊界多上一圈元素,也就要定義11X11的數組元素,這些多出來的一圈元素我們在打印棋盤的時候進行限制不要打印出來就行,如下圖:

用C語言實現掃雷小游戲實例代碼

創建棋盤:

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

char mine[ROWS][COLS] = { 0 };//存放雷的信息
char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息

在創建完棋盤后,我們就要對兩個棋盤進行初始化:

1、對于存放布置雷的棋盤我們用 字符 ' 1 ' 表示雷,用字符 ‘ 0 ' 表示非雷,這里我們首先全部初始化為非雷,雷的排布我們在布雷的地方講。
2、對于展示給玩家,并儲存排雷信息的棋盤我們用 ‘ * ' 來初始化。

初始化棋盤函數:

InitBoard(mine, ROWS,COLS,'0');
InitBoard(show, ROWS,COLS,'*');

函數的定義:

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
 int i = 0;
 for (i = 0; i < rows; i++)
 {
  int j = 0;
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}

3、布雷

我們將棋盤初始化完后,我們就要進行布雷的操作了。

雷的分布位置:我們在玩掃雷時知道,每次雷的分布的位置是不一樣的,是隨機分布的,所以我們在布雷操作的時候要調用隨機函數rand(),在使用隨機函數之前,我們要先在主函數中使用srand()函數生成隨機起點,這樣就可以保證每次雷的位置不一樣了。關于這兩個函數的使用,可以去MSDN或者cplusplus中去查詢其作用。

然后就是雷的個數:每次分布一個就減少一個。

接著就是布雷的范圍:因為我們玩家進行排雷是在9X9的棋盤內進行的,所以我們需限定布雷的范圍也在9X9的范圍內。

接下來我們來看看到底如何實現的吧!

主函數:

int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do
 {
  menu();//打印菜單
  printf("請選擇:>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();//游戲主體
   break;
  case 2:
   system("cls");//清屏選項
   break;
  case 0:
   printf("退出游戲\n");
   break;
  default:
   printf("輸入錯誤,請重新選擇\n");
   Sleep(1000);
   system("cls");
   break;
  }
 
 } while (input);
 return 0;
}

布雷函數:

#define EASY_COUNT 10  //雷的個數

SetMine(mine, ROW, COL);

函數的定義:

void SetMine(char board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int count = EASY_COUNT;//雷的個數
 while (count)
 {
  //生成隨機下標(1~9)
  x = rand() % row + 1;
  y = rand() % col + 1;
 
  if (board[x][y] != '1')
  {
   board[x][y] = '1';
   count--;
  }

 }
}

4、打印棋盤

我們將上方操作完成之后,就需要在屏幕上打印出棋盤了,但這里一共有兩個棋盤,我們需要打印的棋盤是專門展示給玩家,并儲存排雷信息的棋盤即用 ‘ * ' 初始化的棋盤。
還有就是我們需打印的大小是9X9的范圍,而不是全部范圍11X11的。
還有我們需要打印棋盤的行數和列數,以便玩家看坐標。

打印棋盤函數:

DisplayBoard(show, ROW, COL);

函數定義:

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 printf("----------------\n");
 for (i = 0; i <= 9; i++)
 {
  printf("%d ", i);//打印列標
 }
 printf("\n");
 for (i = 1; i <= row; i++)
 {
  int j = 0;
  printf("%d ", i);//打印行標
  for (j = 1; j <= col; j++)
  {
   printf("%c ", board[i][j]);
   
  }
  printf("\n");
 }
 printf("----------------\n");
}

5、排雷

完成上方所有操作后,就到我們最精彩,也是最重要的部分了。
要求:
1、輸入排查坐標要在打印的棋盤范圍內;
2、統計排查坐標周邊八個位置的雷的個數;
3、保證第一次輸入坐標絕對安全,不炸死;
4、坐標周圍無雷則進行自動展開

排雷主邏輯函數:

FindMine(mine, show, ROW, COL);

統計排查坐標周邊八個位置的雷的個數的函數:

GetMineCount(char mine[ROWS][COLS], int x, int y)

第一次安全函數:

safe(char mine[ROWS][COLS], int row,int col,int x, int y)

展開函數

OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y)

函數定義(從上往下):

排雷主邏輯函數:

//主邏輯函數
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int win = 0;//統計排雷的個數
 int count = 0;// 統計雷的個數
 while (win<row*col-EASY_COUNT)
 {
  printf("請輸入要排查的坐標");
  scanf("%d %d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)  //輸入坐標是否合法
  {
   if (mine[x][y] == '1')
   {
    if (0 == win)//第一次踩到雷,重新布雷
    {
     safe(mine, ROW,COL,x, y);
     //DisplayBoard(mine, ROW, COL);
     count = GetMineCount(mine, x, y);

     if (count == 0)
     {
      show[x][y] = ' ';
      win++;
      OpenMine(mine, show, ROW, COL, x, y,&win);//如果周圍沒有雷,進行擴展
      DisplayBoard(show, row, col);
     }
     else
     {
      show[x][y] = count + '0';
      DisplayBoard(show, row, col);
     }
    }
    else
    {
     printf("很遺憾,你被炸死了\n");
     DisplayBoard(mine, ROW, COL);
     break;
    }
    
   }
   else
   {
    count = GetMineCount(mine, x, y);
    if (count == 0)
    {
     show[x][y] = ' ';
    }
    else
    {
     show[x][y] = count + '0';
    }
    win++;
    OpenMine(mine, show, ROW, COL, x, y,&win);
    DisplayBoard(show, ROW, COL); 
   }
  }
  else
  {
   printf("坐標不在范圍內,請重新輸入\n");
  }
 }
 if (win == row*col - EASY_COUNT)
 {
  printf("恭喜你,排雷成功\n");
 }
}

統計周圍雷的個數:

//統計排查坐標周邊八個位置的雷的個數
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
 return (mine[x - 1][y] +
  mine[x - 1][y - 1] +
  mine[x][y - 1] +
  mine[x + 1][y - 1] +
  mine[x + 1][y] +
  mine[x + 1][y + 1] +
  mine[x][y + 1] +
  mine[x - 1][y + 1] - 8 * '0');
}

第一次下子,不炸死,則重新布雷:

//第一次安全
void safe(char mine[ROWS][COLS], int row,int col,int x, int y)  
{
 mine[x][y] = '0';
 int count = 1;
 while (count)
 {
  //生成隨機下標(1~9)
  int i = rand() % row + 1;
  int j = rand() % col + 1;
  if ((mine[i][j] != '1') && i != x && j != y)
  {
   mine[i][j] = '1';
   count--;
  }
 }
}

坐標周圍沒雷,可以實現展開:

//展開函數
void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y,int* p)
{
 int i = -1;
 int j = -1;
 for (i = -1; i < 2; i++)//邊界
 {
  for (j = -1; j < 2; j++)
  {
   if (i != 0 || j != 0) // 避免排到自己注意此處的邏輯關系
   {
    if (x + i >= 1 && x + i <= row && y + j >= 1 && y + j <= col)
    {
     if (show[x + i][y + j] == '*' && mine[x + i][y + j] != '1')
     {
      int count = GetMineCount(mine, x + i, y + j);
      if (count != '0')
      {
       show[x + i][y + j] = count + '0';
       (*p)++;
      }
      else
      {
       show[x + i][y + j] = ' ';
       (*p)++;
       OpenMine(mine, show,ROW,COL, x + i, y + j, p);
      }
     }
    }
   }
  }
 }
}

五、總結

和三子棋一樣,將整個工程分為game.c,game.h和test.c三個文件。如下圖

用C語言實現掃雷小游戲實例代碼

1、在頭文件game.h主要包括各個函數的聲明還有調用庫函數所需的頭文件以及棋盤行數列數的宏定義,方便以后我們如果想修改行或者列數目,直接修改宏定義的內容即可。
2、源文件game.c中則包括各種函數的實現,該文件中要引用頭文件game.h
3、test.c中則包括游戲開始菜單的打印和調用game.c中的函數

game.h內容

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<Windows.h>

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2


//雷的個數
#define EASY_COUNT 10

//初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);

//打印棋盤
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

//第一次安全
void safe(char mine[ROWS][COLS], int row, int col, int x, int y);

//統計排查坐標周邊八個位置的雷的個數
int GetMineCount(char mine[ROWS][COLS], int x, int y);

//坐標周圍展開函數
void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y,int* p);

game.c內容

#include "game.h"
//初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
 int i = 0;
 for (i = 0; i < rows; i++)
 {
  int j = 0;
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int count = EASY_COUNT;
 while (count)
 {
  //生成隨機下標(1~9)
  x = rand() % row + 1;
  y = rand() % col + 1;

  if (board[x][y] != '1')
  {
   board[x][y] = '1';
   count--;
  }

 }
}

//打印棋盤
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 printf("----------------\n");
 for (i = 0; i <= 9; i++)
 {
  printf("%d ", i);
 }
 printf("\n");
 for (i = 1; i <= row; i++)
 {
  int j = 0;
  printf("%d ", i);
  for (j = 1; j <= col; j++)
  {
   printf("%c ", board[i][j]);
   
  }
  printf("\n");
 }
 printf("----------------\n");
}

//排雷主邏輯
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int win = 0;//統計排雷的個數
 int count = 0;// 統計雷的個數
 while (win<row*col-EASY_COUNT)
 {
  printf("請輸入要排查的坐標");
  scanf("%d %d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)  //輸入坐標是否合法
  {
   if (mine[x][y] == '1')
   {
    if (0 == win)//第一次踩到雷,重新布雷
    {
     safe(mine, ROW,COL,x, y);
     //DisplayBoard(mine, ROW, COL);
     count = GetMineCount(mine, x, y);

     if (count == 0)
     {
      show[x][y] = ' ';
      win++;
      OpenMine(mine, show, ROW, COL, x, y,&win);//如果周圍沒有雷,進行擴展
      DisplayBoard(show, row, col);
     }
     else
     {
      show[x][y] = count + '0';
      DisplayBoard(show, row, col);
     }
    }
    else
    {
     printf("很遺憾,你被炸死了\n");
     DisplayBoard(mine, ROW, COL);
     break;
    }
    
   }
   else
   {
    count = GetMineCount(mine, x, y);
    if (count == 0)
    {
     show[x][y] = ' ';
    }
    else
    {
     show[x][y] = count + '0';
    }
    win++;
    OpenMine(mine, show, ROW, COL, x, y,&win);
    DisplayBoard(show, ROW, COL); 
   }
  }
  else
  {
   printf("坐標不在范圍內,請重新輸入\n");
  }
 }
 if (win == row*col - EASY_COUNT)
 {
  printf("恭喜你,排雷成功\n");
 }
}

//統計排查坐標周邊八個位置的雷的個數
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
 return (mine[x - 1][y] +
  mine[x - 1][y - 1] +
  mine[x][y - 1] +
  mine[x + 1][y - 1] +
  mine[x + 1][y] +
  mine[x + 1][y + 1] +
  mine[x][y + 1] +
  mine[x - 1][y + 1] - 8 * '0');
}

//保證第一次下子安全
void safe(char mine[ROWS][COLS], int row,int col,int x, int y)  
{
 mine[x][y] = '0';
 int count = 1;
 while (count)
 {
  //生成隨機下標(1~9)
  int i = rand() % row + 1;
  int j = rand() % col + 1;
  if ((mine[i][j] != '1') && i != x && j != y)
  {
   mine[i][j] = '1';
   count--;
  }
 }
}

//展開函數
void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y,int* p)
{
 int i = -1;
 int j = -1;
 for (i = -1; i < 2; i++)//邊界
 {
  for (j = -1; j < 2; j++)
  {
   if (i != 0 || j != 0) // 避免排到自己注意此處的邏輯關系
   {
    if (x + i >= 1 && x + i <= row && y + j >= 1 && y + j <= col)
    {
     if (show[x + i][y + j] == '*' && mine[x + i][y + j] != '1')
     {
      int count = GetMineCount(mine, x + i, y + j);
      if (count != '0')
      {
       show[x + i][y + j] = count + '0';
       (*p)++;
      }
      else
      {
       show[x + i][y + j] = ' ';
       (*p)++;
       OpenMine(mine, show,ROW,COL, x + i, y + j, p);
      }
     }
    }
   }
  }
 }
}

test.c內容

#include "game.h"
void menu()
{
 printf("**************************************************\n");
 printf("*******       Welcome to Minesweeper       *******\n");
 printf("**********          1. 開始游戲         **********\n");
 printf("**********          2. 清空屏幕         **********\n");
 printf("**********          0. 退出游戲         **********\n");
 printf("**************************************************\n");
}

void game()
{
 char mine[ROWS][COLS] = { 0 };//存放雷的信息
 char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息
 //初始化一下棋盤
 InitBoard(mine, ROWS,COLS,'0');
 InitBoard(show, ROWS,COLS,'*');

 //布置雷
 SetMine(mine, ROW, COL);
 //打印棋盤
 //DisplayBoard(mine, ROW, COL);
 DisplayBoard(show, ROW, COL);
 //排查雷
 FindMine(mine, show, ROW, COL);

}

int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do
 {
  menu();//打印菜單
  printf("請選擇:>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();游戲主體
   break;
  case 2:
   system("cls");//清屏選項
   break;
  case 0:
   printf("退出游戲\n");
   break;
  default:
   printf("輸入錯誤,請重新選擇\n");
   Sleep(1000);
   system("cls");
   break;
  }
 
 } while (input);
 return 0;
}

到此,相信大家對“用C語言實現掃雷小游戲實例代碼”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

广元市| 梧州市| 元氏县| 佛坪县| 恭城| 时尚| 芦溪县| 偏关县| 博爱县| 海原县| 山阴县| 休宁县| 崇仁县| 枞阳县| 新密市| 南昌县| 平原县| 建阳市| 丰城市| 余姚市| 桐庐县| 喀喇沁旗| 临潭县| 蒙自县| 阜新市| 阆中市| 黄冈市| 太原市| 保靖县| 介休市| 永兴县| 治多县| 鸡西市| 蓬莱市| 灵武市| 偏关县| 大英县| 奇台县| 营口市| 诸暨市| 宁德市|