大家加油!!
- 整體思路
- 1.主函式體的游戲體簡單設定
- 2.void game()的實作
- 3.完整代碼
- 1.game.h
- 2.game.c
- 3.test.c
整體思路

這個就是掃雷的99的界面,我們知道掃雷的規律就是點一個點就會有出現雷或者安全的點,當周圍有幾個雷時還會告訴你有幾個雷,
這么一想,我們可能就必須要遍歷周圍的8個點,但是我們遍歷邊界等等時候就會越界,所以不妨我們可以多設定兩行加兩列,里面什么也不放,方便我們找周圍有幾個雷,
一般99 的棋盤只有十個雷,所以我們先將棋盤的基本屬性定義一下,
#define ROW 9//實際使用的行
#define COL 9//實際使用的列
#define ROWS ROW+2//方便使用而定義的行
#define COLS COL+2//方便使用而定義的列
#define EASY_COUNT 10//9*9簡單版本雷的個數
1.主函式體的游戲體簡單設定
#include"game.h"//工程檔案我們參考我們自己定義的頭檔案(詳細見下)
void menu()//簡易選單的列印
{
printf("**************************************\n");
printf("********** 1.play *********\n");
printf("********** 2.exit *********\n");
printf("**************************************\n");
}
void game()
{
;//最主要的就是怎么去實作這個游戲,在這里我們將實作我們的游戲
}
int main()
{
srand((unsigned int)time(NULL));//電腦隨機放雷的亂數產生(詳細見后)
int input = 0;
do
{
menu();
printf("Please select!\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("exit successful!\n");
break;
case 1:
game();
break;
default :
printf("Select error,please input again\n");
}
} while (input);
return 0;
}
2.void game()的實作
怎么去實作這個游戲呢,首先我們的想法就是在棋盤中操作,沒有出現的設定為*號以視為神秘感,雷又用重新一種,那是不是棋盤顯得太亂了呢?
所以我們的想法就是設定兩個棋盤,一個用來存放雷的資訊,一個就是用來列印,讓玩家看到,
第一步:定義兩個棋盤
//存放雷的資訊
char mine[ROWS][COLS] = { 0 };
//存放排差出雷的資訊
char show[ROWS][COLS] = { 0 };
第二步:初始化棋盤
//存放雷資訊的用0表示,之后隨機生成雷就把0換掉
Initboard(mine, ROWS, COLS, '0');
//列印給玩家的棋盤用 * 給玩家,
//當玩家輸入坐標時就會提示玩家周圍有幾個雷用數字列印出來
Initboard(show, ROWS, COLS, '*');
那我們應該怎么去初始化棋盤呢?這個就很簡單了只需要把棋盤全部設為 0 或者 * 就可以了,
//宣告,在頭檔案中宣告,
void Initboard(char board[ROWS][COLS], int rows, int cols, char set);
//定義,在game.c檔案中定義,
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 Displayboard(char board[ROWS][COLS], int row, int col);
//定義,在game.c檔案中定義,
void Displayboard(char board[ROWS][COLS], int row, int col)
{
printf("-------------------\n");
int i, j;
for (i = 0; i < row + 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < row + 1; i++)
{
printf("%d ", i);
for (j = 1; j < col + 1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------------------\n");
}
第四步:布置雷(很重要)
直接看代碼里面的注釋,其實不難,但是需要理解,
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;//我們需要布置10個雷
while (count)
{
//1.生成隨機下標防雷
int x = rand() % row + 1;//隨機生成 1-9 的橫坐標
int y = rand() % col + 1;//隨機生成 1-9 的縱坐標
//橫縱坐標在1-9正好的就是生成的點在11*11中間的9*9的期盼中,很細節
if (board[x][y] == '0')//只有當要布置的雷點沒有被布置才會布置下去,
{
board[x][y] = 'X';
count--;
}
}
}
第五步:搜索周圍有幾個雷

如圖,我們要知道黑色的點周圍有幾個雷就需要遍歷周圍的點有幾個雷,
我們前面將隨機生成的雷設定成了’X’,所以我們就需要回圈遍歷,然后再回傳遍歷到了有幾個雷,
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int i, j, count = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (mine[i][j] == 'X')
count++;
}
}
return count;
}
第六步:排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x, y;//定義x,y坐標
int win = 0;
while (win < row*col - EASY_COUNT)
{
printf("Please enter the coordinates->");
scanf("%d %d", &x, &y);//玩家輸入坐標
if (x >= 1 && x <= row&&y >= 1 && y <= col)
{
if (mine[x][y] == 'X')//踩到雷,游戲結束
{
printf("I am so sorry you got blown up!\n");
Displayboard(mine, row, col);
break;
}
else
{
int* p = &win;
int count = GetMineCount(mine, x, y);
if (count == 0)
show[x][y] = count + '0';
win++;
Displayboard(show, row, col);
}
}
else //輸入不對時,將提醒錯誤
{
printf("Beyond the border,please input again\n");
}
}
if (win == row*col - EASY_COUNT)
//當我們掃雷的個數等于9*9 - 雷的個數時,獲得勝利
{
printf("You may be a pig , but you win!\n");
Displayboard(mine, row, col);
}
}
3.完整代碼
1.game.h
#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);
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#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 Displayboard(char board[ROWS][COLS], int row, int col)
{
printf("-------------------\n");
int i, j;
for (i = 0; i < row + 1; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < row + 1; i++)
{
printf("%d ", i);
for (j = 1; j < col + 1; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------------------\n");
}
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
//1.生成隨機下標防雷
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = 'X';
count--;
}
}
}
//搜索輸入點周圍有幾個雷
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int i, j, count = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (mine[i][j] == 'X')
count++;
}
}
return count;
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x, y;
int win = 0;
while (win < row*col - EASY_COUNT)
{
printf("Please enter the coordinates->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row&&y >= 1 && y <= col)
{
if (mine[x][y] == 'X')
{
printf("I am so sorry you got blown up!\n");
Displayboard(mine, row, col);
break;
}
else
{
int* p = &win;
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
win++;
Displayboard(show, row, col);
}
}
else
{
printf("Beyond the border,please input again\n");
}
}
if (win == row*col - EASY_COUNT)
{
printf("You may be a pig , but you win!\n");
Displayboard(mine, row, col);
}
}
3.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("**************************************\n");
printf("********** 1.play *********\n");
printf("********** 2.exit *********\n");
printf("**************************************\n");
}
void game()
{
//存放雷的資訊
char mine[ROWS][COLS] = { 0 };
//存放排差出雷的資訊
char show[ROWS][COLS] = { 0 };
//初始化一下棋盤
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
//列印棋盤
//Displayboard(mine, ROW, COL);
//Displayboard(show, ROW, COL);
//布置雷
SetMine(mine, ROW, COL);
Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);
//排查雷
FindMine(mine, show, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("Please select!\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("exit successful!\n");
break;
case 1:
game();
break;
default :
printf("Select error,please input again\n");
}
} while (input);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292138.html
標籤:其他
