1.游戲基本流程
2.列印選單
3.游戲的實作
4.創建陣列
5.初始化陣列
6.列印棋盤
7.布置雷
8.排雷
因為掃雷和三子棋(上一篇文章)實作是差不多的,流程也差不多的,所以就不會想上一節那樣詳細,如果覺得本文章有問題的話就可以先去理解上一篇文章哈!
分析游戲
對于掃雷,我們要寫的是一個9*9的雷盤,還要實作點擊非雷時顯示周圍一圈雷的個數,直至找出全部非雷區域即取得游戲勝利,當然這里游戲有一個可以優化的地方,就是一下只能展開一個格子,想要一下多個展開就要用到遞回了哈大家可以思考一下,但我們還是基于基礎c語言下不講這個目前,
當然我們說到是9*9的格子,但是要是如果點到周邊時顯示周圍雷數時就會越界,所以我們創建一個11*11的格子就可以防止越界了哈!
再然后就是我們這里非雷用字符0,雷用字符1,不是數字哈!這樣的好處是我們計算時直接把周圍的一圈加起來就可以了!然后計算數字時,直接減去8個字符0,就可以得到周圍有多少個數字雷,
1.游戲基本流程
這次直接放test.c哈,因為比較簡單
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*******************************************\n");
printf("*********** 1.play ***********\n");
printf("*********** 0.exit ***********\n");
printf("*******************************************\n");
}
void test()
{
srand((unsigned int)time(NULL));
int input=0;
do
{
menu();
printf("請選擇:\n");
scanf("%d", &input);
switch(input)
{
case 1:
printf("開始游戲:\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
2.游戲的實作
然后給大家看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);
//列印棋盤宣告
DisplayBoard(char Board[ROWS][COLS], int row, int col);
//布置雷宣告
void Set_mine(char Board[ROWS][COLS],int row,int col);
//排查雷的宣告
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
然后還是老規矩,我們先搞清楚流程,經過分析我們可知:
//創建陣列
//初始化陣列
//列印棋盤
//布置雷
//排雷
2.1創建陣列
//創建陣列
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
2.2初始化陣列
//初始化陣列 mine
InitBoard(mine,ROWS,COLS,'0');
//初始化陣列 show
InitBoard(show, ROWS, COLS, '*');
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;
}
}
}
值得注意的是我們這里用了set這個變數去接收'0'或者'*',我們創建函式的時候要盡可能去要他能夠多的去使用,別太單一,
2.3列印棋盤
DisplayBoard(char Board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= row; i++)
{
printf("%d ",Board[i][j] = 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");
}
}
2.4布置雷
//布置雷
Set_mine(mine, ROW, COL);
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
int count = 10;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
2.5排雷
//排雷
FindMine(mine, show, ROW, COL);
DisplayBoard(show, ROW, COL);
int set_min_count(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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 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')
{
printf("很遺憾,你被炸死了\n");
DisplayBoard(mine, row, col);
break;
}
else
{
int n = set_min_count(mine, x, y);
show[x][y] = n + '0';
DisplayBoard(show, row, col);
win++;
}
}
else
{
printf("輸入坐標非法,無法排雷,請重新輸入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功!\n");
DisplayBoard(mine, row, col);
}
}
3游戲整體代碼
test.:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*******************************************\n");
printf("*********** 1.play ***********\n");
printf("*********** 0.exit ***********\n");
printf("*******************************************\n");
}
void test()
{
srand((unsigned int)time(NULL));
int input=0;
do
{
menu();
printf("請選擇:\n");
scanf("%d", &input);
switch(input)
{
case 1:
printf("開始游戲:\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
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);
//列印棋盤宣告
DisplayBoard(char Board[ROWS][COLS], int row, int col);
//布置雷宣告
void Set_mine(char Board[ROWS][COLS],int row,int col);
//排查雷的宣告
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
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;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
Board[i][j] = set;
}
}
}
DisplayBoard(char Board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= row; i++)
{
printf("%d ",Board[i][j] = 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");
}
}
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
int count = 10;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int set_min_count(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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 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')
{
printf("很遺憾,你被炸死了\n");
DisplayBoard(mine, row, col);
break;
}
else
{
int n = set_min_count(mine, x, y);
show[x][y] = n + '0';
DisplayBoard(show, row, col);
win++;
}
}
else
{
printf("輸入坐標非法,無法排雷,請重新輸入\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功!\n");
DisplayBoard(mine, row, col);
}
}
void game()
{
//創建陣列
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化陣列 mine
InitBoard(mine,ROWS,COLS,'0');
//初始化陣列 show
InitBoard(show, ROWS, COLS, '*');
//列印棋盤
//DisplayBoard(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
//布置雷
Set_mine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
//DisplayBoard(show, ROW, COL);
//排雷
FindMine(mine, show, ROW, COL);
DisplayBoard(show, ROW, COL);
}
今天的內容就到這里了哈!!!
要是認為作者有一點幫助你的話!
就來一個點贊加關注吧!!!當然訂閱是更是求之不得!
最后的最后謝謝大家的觀看!!!
你們的支持是作者寫作的最大動力!!!
下期見哈!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356151.html
標籤:其他
