《掃雷》是一款大衆類的益智小遊戲,于1992年發行。遊戲目标是在最短的時間内根據點擊格子出現的數字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸
二:C語言實現掃雷(1)新建文件
整個遊戲需要三個文件,第一個是頭文件“Saolei.h”用于聲明函數,宏定義等,第二個是“Saolei_game.c”用于實現頭文件中所聲明函數的功能,第三個是"Saolei_test.c"用于控制整個遊戲邏輯。
(2)邏輯流程
第一:打印主體邏輯框架
第二:設置雷場
所以我們在宏定義時,要這樣定義
所以部分代碼需要修改,這裡需要注意打印時是要從(1,1)到(9,9)
4. 最後,用戶排雷時是需要坐标的,但是由于格子太大,不容易一眼看出坐标,所以我們可以加入行号和列号來進行輔助
第三:布雷我們定義字符1表示此處有雷,字符0表示此處無雷。一般的掃雷遊戲均有初級,中級和高級等遊戲難度分級,其難度取決于雷的數目,數目越多難度越大。所以在布置雷時首先要決定需要布置多少個雷,然後進入一個循環,利用系統生成随機坐标,判斷生成坐标對應的位置是否有雷,如果沒有雷,則放置一顆雷同時将類的數目減小1,如果有雷則繼續生成下一個随機坐标重複上述過程。直到最後的類全部放置完畢。
第四:排雷
2. 排查雷時,該函數就要同時傳入mine數組和show數組,進入函數後,讓用戶輸入坐标,根據用戶輸入的坐标對應到雷場中進行判斷,如果輸入的位置有雷當場炸死,如果沒有雷則調用函數探查周圍雷的信息并返回,将此信息傳遞給同位置的show數組,并顯示給用戶,如下
3. 最後一點,上述還沒有實現的一點就是什麼時候判斷為赢了,9×9的方格有10個雷,則剩餘的71個位置沒有雷。所以定義個變量win,每次沒有碰到雷時win ,循環結束條件是當win>9×9-10。
三:全部代碼
頭文件
#pragma once
#include <stdio.h>;
#include <stdlib.h>;
#include <time.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 displayBoard(char board[Rows][Cols],int row,int col);//顯示
void setMine(char board[Rows][Cols], int row,int col);//設置雷
void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col);//找雷
int get_mine_count(char board[Rows][Cols], int x, int y);
123456789101112131415
函數實現文件
#include "Saolei.h"
void initBoard(char board[Rows][Cols], int rows, int cols,char set)
{
int i = 0;
int j = 0;
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 = 0;
int j = 0;
for (i = 0; i <= col; i )//列号
{
printf("%d ", i);
}
printf("\n");
for (i = 0; i <= col; i )//列号下的橫線
{
printf("—");
}
printf("\n");
for (int i = 1; i <=row; i )
{
printf("%d", i);
printf("|");
for (int j = 1; j <=col; j )
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void setMine(char board[Rows][Cols], int row, int col)
{
int count = EASY_COUNT;//count個雷
while (count)
{
int x = rand() % row 1;
int y = rand() % col 1;//範圍為1-9;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
int get_mine_count(char board[Rows][Cols], int x, int y)
{
return
board[x - 1][y - 1]
board[x - 1][y]
board[x - 1][y 1]
board[x][y - 1]
board[x][y 1]
board[x 1][y - 1]
board[x 1][y]
board[x 1][y 1]
- 8 * '0';
}
void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col)
{
int x, y = 0;
int win = 0;
while (win<row*col-EASY_COUNT)
{
printf("請輸入你的坐标\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//坐标合法
if (mine[x][y] == '1')//遇到雷了
{
printf("You Lose!\n");
displayBoard(mine, row, col);
break;
}
else//不是雷,統計信息
{
int count = get_mine_count(mine, x, y);//得到該位置周圍的雷的個數
show[x][y] = count '0';
displayBoard(show, row, col);
win ;
}
}
else
{
printf("輸入有誤,重新輸入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("you win\n");
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
邏輯控制文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "Saolei.h";
void menu()
{
printf("*************************\n");
printf("**********1.play*********\n");
printf("**********0.exit*********\n");
printf("*************************\n");
}
void game()
{
printf("遊戲開始\n");
char mine[Rows][Cols] = {0};//放雷
char show[Rows][Cols] = { 0 };//排雷
initBoard(mine, Rows, Cols,'0');//初始化放雷數組
initBoard(show, Rows, Cols,'*');//初始化排雷數組
printf("\n");
printf("雷場如下\n");
displayBoard(show, Row, Col);//顯示
setMine(mine, Row, Col);//報雷
FindMine(mine, show, Row, Col);//排雷
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出遊戲\n");
break;
default:
printf("輸入錯誤\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
如果需要獲取工程文件,請關注公衆号【0與1】,并正在後台回複【C語言】
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!