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