免費推廣做產(chǎn)品的網(wǎng)站廣州新聞24小時爆料熱線
文章目錄
- 一、游戲規(guī)則
- 二、 代碼邏輯
- 三、游戲?qū)崿F(xiàn)
- 1. 游戲菜單設(shè)計
- 2.設(shè)計雷區(qū)并隨機布置雷
- (1) 設(shè)置雷區(qū)
- (2) 布置雷
- 3.排查雷
- 四、源碼
一、游戲規(guī)則
1. 在9*9的小格子中,任意選取一個坐標(biāo)(格子),選擇后發(fā)現(xiàn),如果沒點中雷的坐標(biāo),會顯示數(shù)字(表示周圍有幾個雷),如果點中雷,游戲結(jié)束
排查雷:
- 如果這個位置不是雷,就計算這個位置的周圍8個坐標(biāo)有幾個雷,并顯示雷的個數(shù)
- 如果是 雷 ,就炸死了,游戲結(jié)束
- 如果把雷都找出來了,勝利,游戲結(jié)束
- 鏈 接:網(wǎng)頁版掃雷
2.選擇后如圖
3.點中雷的情況
二、 代碼邏輯
- 游戲菜單設(shè)計
- 設(shè)計雷區(qū)并隨機布置雷
- 排查雷
三、游戲?qū)崿F(xiàn)
1. 游戲菜單設(shè)計
//test.c
#include "game.h"
void game()
{printf("掃雷\n");
}
void menu()
{printf("************************\n");printf("****** 掃雷 *******\n");printf("****** 1. play *******\n");printf("****** 0. exit *******\n");printf("************************\n");
}
int main()
{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);return 0;
}
2.設(shè)計雷區(qū)并隨機布置雷
(1) 設(shè)置雷區(qū)
設(shè)置一個9*9的二維數(shù)組,0表示沒有雷,1表示雷
但是為了避免顯示給玩家看的數(shù)字 1(雷的個數(shù))與設(shè)置雷的 1 重合,所以選用 * 進行埋雷
因為掃雷 是掃周圍的8個區(qū)域,會遇到掃越界問題
故變成11*11的二維數(shù)組
設(shè)置棋盤
//test.c 中的 game()
void game()
{char mine[ROWS][COLS] = {0};//放置雷的數(shù)組char show[ROWS][COLS] = {0};//顯示的數(shù)組InitBoard(mine,ROWS,COLS,'0');DisplayBoard(mine, ROW, COL);InitBoard(show,ROWS,COLS,'*');DisplayBoard(show, ROW, COL);}
//game.c
#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;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("--------掃雷---------\n");for (i = 0; i <= col;i++) {printf("%d ",i);//打印列標(biāo)}printf("\n");for (i = 1; i <= row; i++) {printf("%d ",i);//打印行標(biāo)for (j = 1; j <= col;j++){printf("%c ",board[i][j]);}printf("\n");}printf("--------掃雷---------\n");}
//game.h
#include <stdio.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
(2) 布置雷
在這里隨機生成雷
字符0表示不是雷。字符1表示是雷
//game.c
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = Easy_count;while (count) {int x = rand() % row + 1;//生成坐標(biāo)1-9int y = rand() % col + 1;if (mine[x][y] =='0') //避免在同一個地方布置雷{mine[x][y] = '1';count--;} }
}
3.排查雷
輸入排查雷的坐標(biāo),如果是雷則GAME OVER !,則如果不是雷,則顯示該坐標(biāo)周圍有多少個雷
//game.c
//排查雷
int GetCountMine(char mine[ROWS][COLS],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 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))//要排不是雷的區(qū)域個數(shù){printf("請輸入要排查的坐標(biāo):>");scanf("%d %d", &x, &y);if ( x >= 1 && x <= row && y >= 1 && y <= col) {//選中雷if (mine[x][y] =='1') {printf("GAME OVER!!!,被炸死了\n");DisplayBoard(mine,ROW,COL);break;}else {//不是雷,統(tǒng)計周圍有多少雷int c = GetCountMine(mine,x,y);show[x][y] = c + '0';DisplayBoard(show,ROW,COL);win++;}}else {printf("坐標(biāo)輸入錯誤,重新輸入\n");}}if (win == ((row * col)- Easy_count)) //需要排的區(qū)域數(shù){printf("恭喜您,排雷成功!\n");}
}
排雷的周圍坐標(biāo)
x-1, y - 1 | x-1,y | x-1,y+1 |
x, y - 1 | x,y | x,y+1 |
x+1,y-1 | x+1,y | x+1,y+1 |
排完的情況(這里設(shè)置80個雷(用于測試排雷成功),所以只有一個安全)
排到雷,游戲結(jié)束
四、源碼
game.h
#include <stdio.h>
#include <time.h>
#include <stdlib.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 mine[ROWS][COLS],int row,int col);
//排查雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
test.c
#include "game.h"
void game()
{char mine[ROWS][COLS] = {0};//放置雷的數(shù)組char show[ROWS][COLS] = {0};//顯示的數(shù)組InitBoard(mine,ROWS,COLS,'0');InitBoard(show,ROWS,COLS,'*'); DisplayBoard(show, ROW, COL);//布置雷SetMine(mine,ROW,COL);//排查雷FindMine(mine,show,ROW,COL);}
void menu()
{printf("************************\n");printf("****** 掃雷 *******\n");printf("****** 1. play *******\n");printf("****** 0. exit *******\n");printf("************************\n");
}
int main()
{int input = 0;srand((unsigned int )time(NULL));//設(shè)置隨機數(shù)種子do {menu();printf("請選擇>:");scanf("%d",&input);switch (input){case 1:game();break;case 0:printf("退出游戲\n");break;default:printf("選擇錯誤,請重新選擇\n");break; }} while (input);return 0;
}
game.c
#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;}}
}
//打印棋盤
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("--------掃雷---------\n");for (i = 0; i <= col;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");}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = Easy_count;while (count) {int x = rand() % row + 1;//生成坐標(biāo)1-9int y = rand() % col + 1;if (mine[x][y] =='0') //避免在同一個地方布置雷{mine[x][y] = '1';count--;}}
}
//排查雷
int GetCountMine(char mine[ROWS][COLS],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 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))//要排不是雷的區(qū)域個數(shù){printf("請輸入要排查的坐標(biāo):>");scanf("%d %d", &x, &y);if ( x >= 1 && x <= row && y >= 1 && y <= col) {//選中雷if (mine[x][y] =='1') {printf("GAME OVER!!!,被炸死了\n");DisplayBoard(mine,ROW,COL);break;}else {//不是雷,統(tǒng)計周圍有多少雷int c = GetCountMine(mine,x,y);show[x][y] = c + '0';DisplayBoard(show,ROW,COL);win++;}}else {printf("坐標(biāo)輸入錯誤,重新輸入\n");}}if (win == ((row * col)- Easy_count)) //需要排的區(qū)域數(shù){printf("恭喜您,排雷成功!\n");}
}