文章目錄
- 1掃雷游戲說明:
- 2、編程邏輯
- 3整體的代碼實作
1掃雷游戲說明:
9*9方格中有10個地雷,用戶翻看一個方格,如果是地雷,游戲結束,翻看不是地雷,則顯示周圍地雷的個數,知道10個地雷全部被找到,

2、編程邏輯
1、創建地圖并且初始化、
我們需要創建兩個地圖,一個地圖展示用戶輸入,另一個地圖電腦內置有地雷的地圖,
void init(char showmap[MAX_ROW][MAX_COL], char minemap[MAX_ROW][MAX_COL]){
//對showmap進行初始化 界面用*表示地圖
for (int row = 0; row < MAX_ROW; row++){
for (int col= 0; col < MAX_COL; col++){
showmap[row][col] = '*';
}
}
//對mine進行初始化 界面用‘0’表示地圖 用‘1’表示地雷
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
minemap[row][col] = '0';
}
}
//電腦隨機生成地雷 生成是個地雷
int n = DEFAULT_MINE_COUNT;
while (n>0){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (minemap[row][col] == '1'){
continue;
}
minemap[row][col] = '1';
n--;
}
}
2、列印地圖
void printmap(char themap[MAX_ROW][MAX_COL]){
//列印showmaop
printf(" |");
for (int col = 0; col < MAX_COL; col++){
printf(" %d", col);
}
printf("\n");
printf("-+------------------\n");
for (int row = 0; row < MAX_ROW; row++){
printf("%d| ", row);
for (int col = 0; col < MAX_COL; col++){
printf("%c ", themap[row][col]);
}
printf("\n");
}
printf("\n");
}
3、用戶輸入坐標
用戶輸入坐標我們還得進行校驗,用戶輸入的位置坐標必須在地圖坐標內,也不能在用戶輸入過的位置再次輸入,
int row;
int col;
printf("請輸入翻開的*(row,col)\n");
scanf("%d %d", &row, &col);
printmap(showmap);
if (showmap[row][col] != '*'){
printf("您已經翻開此位置了,請重新輸入\n");
continue;
}
if (row >= MAX_ROW || row < 0 || col >= MAX_COL || col < 0){
printf("您輸入的位置有誤,請重新輸入\n");
continue;
}
4、判斷用戶輸入的位置是否是地雷
判斷用戶輸入的位置是否是地雷 ,是地雷直接‘gameover’shoumap[row][col] == ‘1’ 踩雷了
if (minemap[row][col] == '1'){
printf("gameover!!!!!\n");
printmap(minemap);
break;
}
5、不是地雷的話,顯示用戶周圍所點開地雷的個數
不是地雷的情況下我們需要對用戶所點開的位置周圍判斷雷的個數,
可以形象的理解周圍就是一個3*3的方格,用戶輸入的坐標是(row,col)左上角的格子坐標是(row -1,col -1),右下角格子坐標為(row+1,col+1)來表示,
void updateshowmap(char showmap[MAX_ROW][MAX_COL], char minemap[MAX_ROW][MAX_COL], int row, int col){
int count = 0;
for (int i = row - 1; i <= row + 1; i++){
for (int m = col - 1; m <= col + 1; m++){
if (i < 0 || i >= MAX_ROW || m < 0 || m >= MAX_COL) {
continue;
}
if (minemap[i][m] == '1'){
count++;
}
}
}
showmap[row][col] = count + '0';
}
6、判斷游戲是否勝利
(用戶翻開的* = 方格子總數-地雷數)兩者相等,則游戲勝利,否則游戲失敗
if (playmove == MAX_ROW*MAX_COL - DEFAULT_MINE_COUNT){
printf("恭喜你游戲勝利了\n");
printmap(minemap);
break;
}
3整體的代碼實作
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<time.h>
#define MAX_ROW 9
#define MAX_COL 9
#define DEFAULT_MINE_COUNT 10
int menu(){
printf("==========================\n");
printf("======== 0;開始游戲=======\n");
printf("======== 1;退出游戲=======\n");
printf("==========================\n");
int choice;
printf("請輸入您的選擇:\n");
scanf("%d", &choice);
return choice;
}
//1、創建地圖并且初始化、
void init(char showmap[MAX_ROW][MAX_COL], char minemap[MAX_ROW][MAX_COL]){
//對showmap進行初始化 界面用*表示地圖
for (int row = 0; row < MAX_ROW; row++){
for (int col= 0; col < MAX_COL; col++){
showmap[row][col] = '*';
}
}
//對mine進行初始化 界面用‘0’表示地圖 用‘1’表示地雷
for (int row = 0; row < MAX_ROW; row++){
for (int col = 0; col < MAX_COL; col++){
minemap[row][col] = '0';
}
}
//電腦隨機生成地雷 生成是個地雷
int n = DEFAULT_MINE_COUNT;
while (n>0){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (minemap[row][col] == '1'){
continue;
}
minemap[row][col] = '1';
n--;
}
}
//2、列印地圖
void printmap(char themap[MAX_ROW][MAX_COL]){
//列印showmaop
printf(" |");
for (int col = 0; col < MAX_COL; col++){
printf(" %d", col);
}
printf("\n");
printf("-+------------------\n");
for (int row = 0; row < MAX_ROW; row++){
printf("%d| ", row);
for (int col = 0; col < MAX_COL; col++){
printf("%c ", themap[row][col]);
}
printf("\n");
}
printf("\n");
}
//不是地雷增加,顯示周圍地雷的個數
void updateshowmap(char showmap[MAX_ROW][MAX_COL], char minemap[MAX_ROW][MAX_COL], int row, int col){
int count = 0;
for (int i = row - 1; i <= row + 1; i++){
for (int m = col - 1; m <= col + 1; m++){
if (i < 0 || i >= MAX_ROW || m < 0 || m >= MAX_COL) {
continue;
}
if (minemap[i][m] == '1'){
count++;
}
}
}
showmap[row][col] = count + '0';
}
void game(){
//1、創建地圖并且初始化、
char showmap[MAX_ROW][MAX_COL] = { 0 };
char minemap[MAX_ROW][MAX_COL] = { 0 };
init(showmap, minemap);
int playmove = 0;
while (1){
//2、列印地圖、
printmap(showmap);
printmap(minemap);
//3、用戶輸入坐標,對應點開某個位置,進行校驗,
//要不要寫個函式呢呀?還是直接在這用戶輸入*.*
int row;
int col;
printf("請輸入翻開的*(row,col)\n");
scanf("%d %d", &row, &col);
printmap(showmap);
if (showmap[row][col] != '*'){
printf("您已經翻開此位置了,請重新輸入\n");
continue;
}
if (row >= MAX_ROW || row < 0 || col >= MAX_COL || col < 0){
printf("您輸入的位置有誤,請重新輸入\n");
continue;
}
//4、判斷用戶輸入的位置是否是地雷 ,是地雷直接‘gameover’shoumap[row][col] == '1' 踩雷了
if (minemap[row][col] == '1'){
printf("gameover!!!!!\n");
printmap(minemap);
break;
}
//5、不是地雷的話,顯示用戶周圍所點開地雷的個數,
updateshowmap(showmap, minemap, row, col);
//6、判斷游戲是否勝利(用戶翻開的* = 方格子總數-地雷數)兩者相等,則游戲勝利,否則游戲失敗
playmove ++;
if (playmove == MAX_ROW*MAX_COL - DEFAULT_MINE_COUNT){
printf("恭喜你游戲勝利了\n");
printmap(minemap);
break;
}
}
}
int main()
{
srand((unsigned)time(0));
while (1){
int choice = menu();
if (choice == 0){
game();
}
else if (choice == 1){
printf("bye~~bye~~\n");
break;
}
else{
printf("您輸入有誤,請您重新輸入;\n");
}
}
system("pause");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/202142.html
標籤:其他
上一篇:逢七必過小游戲
