生活随笔
收集整理的這篇文章主要介紹了
C语言版扫雷
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
用C語(yǔ)言實(shí)現(xiàn)掃雷,首先應(yīng)該有基本的思路,創(chuàng)建兩個(gè)相同大小的數(shù)組,一個(gè)用于布雷(初始化為全0,布雷時(shí)將雷置為1),另一個(gè)給用戶展示(初始化為星號(hào),用戶輸入坐標(biāo)后統(tǒng)計(jì)周?chē)椎姆植疾⒋蛴±椎膫€(gè)數(shù))。由于需要統(tǒng)計(jì)每個(gè)坐標(biāo)周?chē)?lèi)的個(gè)數(shù),所以將數(shù)組創(chuàng)建大一圈,以方便統(tǒng)計(jì)。若輸了,打印出雷陣告訴玩家雷的分布。
具體實(shí)現(xiàn):
game.h文件
#ifndef __GAME_H__
#define __GAME_H__#define ROWS 10
#define COLS 10#define MINE_COUNT 30void display(char arr[ROWS + 2][COLS + 2] , int rows, int cols); //打印雷陣數(shù)組
void set_mine(char mine[ROWS + 2][COLS + 2], int rows, int cols); //布雷
void get_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y); //統(tǒng)計(jì)每格雷的個(gè)數(shù)
void get_around_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y); //統(tǒng)計(jì)周?chē)椎膫€(gè)數(shù)
void first_remove(char mine[ROWS + 2][COLS + 2], int x, int y); //第一個(gè)是雷移走#endif //__GAME_H__game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include "game.h"void display(char arr[ROWS + 2][COLS + 2], int rows, int cols) //打印雷陣數(shù)組
{int i = 0;int j = 0;printf(" ");for (i = 1; i <= rows;i++) //打印數(shù)組行序號(hào){printf("%d ",i);}printf("\n");for (i = 1; i <= rows;i++){ printf("%-3d", i); //打印數(shù)組列序號(hào)for (j = 1; j <= cols; j++){printf("%c ",arr[i][j]);}printf("\n");}
}
void set_mine(char mine[ROWS + 2][COLS + 2], int rows, int cols) //布雷
{srand((unsigned int)time(NULL));int count = MINE_COUNT;while (count){int x = rand() % 10 + 1;int y = rand() % 10 + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--; }}
}void get_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y) //統(tǒng)計(jì)每格雷的個(gè)數(shù)
{int count = 0; //統(tǒng)計(jì)雷的個(gè)數(shù)count=((mine[x - 1][y - 1] - '0') +(mine[x - 1][y] - '0')+ (mine[x - 1][y + 1] - '0')+ (mine[x][y + 1] - '0') +(mine[x + 1][y + 1] - '0') +(mine[x + 1][y] - '0') +(mine[x + 1][y - 1] - '0') +(mine[x][y - 1] - '0'));show[x][y] = count + '0'; //數(shù)字+字符變成字符存起來(lái)
} void get_around_mine_count(char mine[ROWS + 2][COLS + 2], char show[ROWS + 2][COLS + 2], int x, int y) //統(tǒng)計(jì)周?chē)椎膫€(gè)數(shù)
{get_mine_count(mine, show, x, y);if (mine[x-1][y-1] == '0')get_mine_count(mine, show, x-1, y-1);if (mine[x-1][y] == '0')get_mine_count(mine, show, x-1, y);if (mine[x-1][y+1] == '0')get_mine_count(mine, show, x-1, y+1);if (mine[x][y+1] == '0')get_mine_count(mine, show, x, y+1);if (mine[x+1][y+1] == '0')get_mine_count(mine, show, x+1, y+1);if (mine[x+1][y] == '0')get_mine_count(mine, show, x+1, y);if (mine[x+1][y-1] == '0')get_mine_count(mine, show, x+1, y-1);if (mine[x][y-1] == '0')get_mine_count(mine, show, x, y-1);}void first_remove(char mine[ROWS + 2][COLS + 2], int x, int y) //第一個(gè)是雷移走
{if (mine[x][y] == '1'){for (int i = 1; i <= ROWS; i++){for (int j = 1; j <= COLS; j++){if (mine[i][j] == '0'){mine[i][j] = '1';mine[x][y] = '0';break;}}if (mine[x][y] == '0'){break;}}}
}
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include "game.h"void main_menu() //主界面
{printf("-------------------\n");printf("| 1.play |\n");printf("| 0.exit |\n");printf("-------------------\n");
}void game()
{int win = 0; //點(diǎn)擊的次數(shù)int count = 0; //統(tǒng)計(jì)雷的個(gè)數(shù)int first = 1;char mine[ROWS + 2][COLS + 2] = { 0 }; //埋雷的數(shù)組char show[ROWS + 2][COLS + 2] = { 0 }; //展示的數(shù)組memset(mine, '0', sizeof(char)* (ROWS+2) *(COLS + 2)); //數(shù)組初始化memset(show, '*', sizeof(char)* (ROWS + 2) *(COLS + 2));display(show, ROWS, COLS); //打印展示的雷陣set_mine(mine, ROWS, COLS); //布雷//display(mine, ROWS, COLS); //調(diào)試的時(shí)候可以取消注釋打印出雷的分布 while (win<ROWS*COLS - MINE_COUNT){int x = 0, y = 0;printf("請(qǐng)輸入坐標(biāo):\n");scanf("%d%d",&x,&y);if (first == 1){first_remove(mine, x, y);first++;}if (mine[x][y] == '1'){printf("雷炸了!YOU LOSE !\n");display(mine, ROWS, COLS);break;}else{win++;get_around_mine_count(mine,show, x, y); //統(tǒng)計(jì)周?chē)椎膫€(gè)數(shù)//get_mine_count(mine,show, x, y);// show[x][y] = count + '0'; //數(shù)字+字符變成字符存起來(lái)display(show, ROWS, COLS); }}if (win >= ROWS*COLS - MINE_COUNT){printf("YOU WIN !!!\n");}
}enum Option //枚舉
{EXIT,PLAY
};
int main()
{int x = 0;do{main_menu();printf("輸入1繼續(xù)、0退出:\n");scanf("%d", &x);switch (x){case EXIT:break;case PLAY:game();break;default:printf("選擇錯(cuò)誤,請(qǐng)重輸入:\n");break;}} while (x);return 0;
}
運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的C语言版扫雷的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。