阅读背景:

扩展版扫雷小游戏

来源:互联网 
game.h #ifndef _GAME_H_ #define _GAME_H_ #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 #define HARD_COUNT 40 void Init_showboard(char showboard[ROW][COL], int row, int col);//初始化要展示的棋盘 void put_showboard(char showboard[ROW][COL], int x, int y, int count); void Init_mineboard(char mineboard[ROWS][COLS], int row, int col);//初始化布雷的棋盘 int GetMineCount(char board[ROWS][COLS], int x, int y);//统计周边雷的个数 void Move_mine(char mineboard[ROWS][COLS]);//将雷移走 void put_mine(char mineboard[ROWS][COLS]); void send_mine(char mineboard[ROWS][COLS], char showboard[ROW][COL], int x, int y);//扩展扫雷 int Add(char showboard[ROW][COL]);//统计成功扫雷个数 #endif game.c #include "game.h"; //设置展示的扫雷棋盘 void Init_showboard(char showboard[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < col + 1; i++)//打印横轴坐标 { printf("%d ", i); if (i == col) printf("\n"); } for (i = 1; i <= row; i++) { printf("%d ", i);//打印竖轴坐标 for (j = 0; j < col; j++) printf("%c ", showboard[i-1][j]); printf("\n"); } } //打印输出坐标后该点周围雷的个数 void put_showboard(char showboard[ROW][COL],int x,int y,int count) { showboard[x-1][y-1] = count+48; Init_showboard(showboard, ROW, COL); } //设置雷 void put_mine(char mineboard[ROWS][COLS]) { int count = EASY_COUNT;//总共有雷的个数 int x = 0; int y = 0; while (count) { x = rand() % 9 + 1; y = rand() % 9 + 1; if (mineboard[x][y] == '0') { mineboard[x][y] = '1'; count--; } } } //打印布雷的棋盘 void Init_mineboard(char mineboard[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for (i = 0; i < col+1; i++) { printf("%d ", i); if (i == col) printf("\n"); } for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <=col; j++) printf("%c ", mineboard[i][j]); printf("\n"); } } //统计一点周围雷的个数 int GetMineCount(char board[ROWS][COLS], int x, int y) { int count = 0; int i = 0; int j = 0; for (j = x - 1; j <= x + 1; j++) { for (i = y - 1; i <= y + 1; i++) { if (board[j][i] == '1') count++; } } return count; } //当第一个扫到雷时,不能被炸死,将雷移走 void Move_mine(char mineboard[ROWS][COLS]) { int x = 0; int y = 0; x = rand() % 9 + 1; y = rand() % 9 + 1; if (mineboard[x][y]=='0') { mineboard[x][y] ='1'; } } //扩展,以一点为中心,向外扩展统计其周围每一点周围的雷的个数 void send_mine(char mineboard[ROWS][COLS], char showboard[ROW][COL],int x,int y) { if (((x > 0) && (x < ROWS - 1) && (y>0) && (y < COLS - 1))) { if (mineboard[x - 1][y] == '0') { showboard[x - 1][y] = GetMineCount(mineboard, (x-1),y) + '0'; } if (mineboard[x - 1][y - 1] == '0') { showboard[x - 1][y - 1] = GetMineCount(mineboard,( x-1),( y-1)) + '0'; } if (mineboard[x][y - 1] == '0') { showboard[x][y - 1] = GetMineCount(mineboard, x, (y-1)) + '0'; } if (mineboard[x + 1][y - 1] == '0') { showboard[x + 1][y - 1] = GetMineCount(mineboard, (x + 1), (y - 1) )+'0'; } if (mineboard[x + 1][y] == '0') { showboard[x + 1][y] = GetMineCount(mineboard, (x + 1), y) + '0'; } else { /*show[x + 1][y] = '0'*/; } if (mineboard[x + 1][y + 1] == '0') { showboard[x + 1][y + 1] = GetMineCount(mineboard, (x + 1), (y + 1)) + '0'; } if (mineboard[x][y + 1] == '0') { showboard[x][y + 1] = GetMineCount(mineboard, x, (y + 1)) + '0'; } if (mineboard[x - 1][y + 1] == '0') { showboard[x - 1][y + 1] = GetMineCount(mineboard, (x - 1), (y + 1)) + '0'; } } } //统计排除雷的个数 int Add(char showboard[ROW][COL]) { int i = 0; int j = 0; int k = 0; for (i = 0; i < ROW;i++) for (j = 0; j < COL; j++) { if (showboard[i][j] == '*') k++; } return k; } 游戏.c #define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //打印菜单 void menu() { printf("*****************************************\n"); printf("******* 1.play 0.exit ********\n"); printf("*****************************************\n"); } //游戏的基本实现 void game(char mineboard[ROWS][COLS],char showboard[ROW][COL]) { int x = 0; int y = 0; int count = 0; int flag = 0; int win = 0; do { ++flag; getchar(); if (((x > 0) && (x < rows - 1) && (y>0) && (y < cols - 1)) != 1) { printf("输入地址不存在,请重新输入:>"); } printf("玩家请输出坐标:"); scanf("%d%d", &x, &y); if (mineboard[x][y] == '1'&&flag == 1)//第一次不能被炸死 { mineboard[x][y] = '0'; Move_mine(mineboard); printf("移走雷后的棋盘:\n"); Init_mineboard(mineboard, ROW, COL); printf("\n"); } if (mineboard[x][y] == '1') { printf("炸死了!\n"); break; } else { count = GetMineCount(mineboard, x, y);//统计扫雷点周围雷的个数 send_mine(mineboard, showboard, x, y);//延展扫雷 put_showboard(showboard, x, y, count);//输出延展后的棋盘 } } while (Add(showboard) < EASY_COUNT); if (Add(showboard) == EASY_COUNT)//判断是否扫雷成功 { printf("恭喜扫雷成功!\n"); return ; } } int main() { char mineboard[ROWS][COLS]; char showboard[ROW][COL]; int n = 0; srand((unsigned)time(NULL)); do { menu(); scanf("%d", &n); if (n == 1) { printf("展示棋盘:\n"); memset(showboard, '*', (ROW)*(COL)); Init_showboard(showboard, ROW, COL); memset(mineboard, '0', (ROWS)*(COLS)); printf("设置雷:\n"); put_mine(mineboard); Init_mineboard(mineboard, ROW, COL); game(mineboard,showboard); } else if (n == 0) { printf("退出游戏!"); break; } else { printf("输入错误,请重新输入:"); } } while (1); system("pause"); return 0; } game.h #ifndef _GAME_H_ #define _GAME_H_ #inc



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: