设计思路:
1、定义两个二维数组;一个随机生成20个雷,另一个向玩家显示。
2、玩家输入坐标,判定该坐标在布雷的数组对应的位置是否有雷,若有,则游戏结束;若无,则显示该坐标周围雷的个数,若周围没有雷,则展开周围的区域。
void game()// 首先建立一个游戏的框架
void game() { clock_t start, end; int duration; int x, y; int win ; char mine[row + 2][line + 2]; char show[row + 2][line + 2]; memset(mine, '0', (row + 2)*(line + 2)); //每次游戏开始,将雷谱初始化为‘0’ memset(show, '*', (row + 2)*(line + 2)); //将显示的数组初始化为‘*’ setmine(mine); display(show); start = clock(); do { system("cls"); display(show); printf("请输入坐标:"); scanf("%d %d", &x, &y); if (mine[x][y] == '0') { win=unfold(mine, show, x, y); if (win == row*line) printf("you win!"); } else if (mine[x][y] == '1') { printf("game over!\n"); display(mine); break; } } while (1); end = clock(); duration = (int)(end - start) / CLOCKS_PER_SEC; printf("time: %d seconds\n", duration); }
然后实现对应功能的函数
void setmine()// 埋雷,生成合法的随机数作为坐标,在对应位置设置为雷(‘0’代表没有雷,‘1’代表有)。
void setmine(char mine[row+2][line+2]) { int x = 0; int y = 0; srand((unsigned long)time(NULL)); for (int i = 0; i < num; i++) { x = getRandomNum(1, row); y = getRandomNum(1, line); if ('0' == mine[x][y]) { mine[x][y] = '1'; } else { i -= 1; } } }int getRandomNum()//生成合法的随机数
int getRandomNum(int start, int end) { return (rand() % (end - start + 1) + start); }
void display//打印棋盘
void display(char show[row + 2][line + 2]) { int i = 0; int j = 0; printf(" "); for (i = 0; i < line; i++) { printf("%2d ", i + 1); } printf("\n"); printf(" "); for (i = 0; i < line; i++) { printf("---"); } printf("\n"); for (i = 1; i <= row; i++) { printf("%2d|", i); for (j = 1; j <= line; j++) { printf("%2c|", show[i][j]); } printf("\n"); } }
int getmine()//计算坐标周围雷的个数
int getmine(char mine[row + 2][line + 2], 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'); }
int unfold()// 若对应坐标没雷,且周围也没有雷,则展开坐标周围区域
扫描二维码关注公众号,回复:
1306148 查看本文章
int unfold(char mine[row+2][line+2], char show[row+2][line+2], int x, int y) { int ret; static int count=0; ret = getmine(mine, x, y); if (ret == 0) { show[x][y] = ret + '0'; count++; if ((x - 1)>0 && (y - 1)&&(show[x - 1][y - 1] == '*')) unfold(mine, show, x - 1, y - 1); if ((x - 1)>0 && (y - 1)&&(show[x - 1][y] == '*')) unfold(mine, show, x - 1, y); if ((x - 1)>0 && (y - 1) && (show[x - 1][y + 1] == '*')) unfold(mine, show, x - 1, y + 1); if ((x - 1)>0 && (y - 1) && (show[x][y - 1] == '*')) unfold(mine, show, x, y - 1); if ((x - 1)>0 && (y - 1) && (show[x][y + 1] == '*')) unfold(mine, show, x, y + 1); if ((x - 1)>0 && (y - 1) && (show[x + 1][y - 1] == '*')) unfold(mine, show, x + 1, y - 1); if ((x - 1)>0 && (y - 1) && (show[x + 1][y] == '*')) unfold(mine, show, x + 1, y); if ((x - 1)>0 && (y - 1) && (show[x + 1][y + 1] == '*')) unfold(mine, show, x + 1, y + 1); display(show); } else { show[x][y] = ret + '0'; count++; } return count; }
main.c//测试
#include "game.h" void menu() { printf("*******************************\n"); printf("*** 1.play 2.exit ***\n"); printf("*******************************\n"); printf("请选择:"); } int main() { do { menu(); int i=0; scanf("%d", &i); switch (i) { case 1: game(); break; case 2:exit(0); default: printf("Error,please try again\n"); break; } } while (1); system("pause"); return 0; }
game.h//头文件
#ifndef _GAME_H_ #define _GAME_H_ #include <stdio.h> #include <windows.h> #include <time.h> #include<stdlib.h> #include<string.h> #pragma warning (disable:4996) #define row 10 #define line 10 #define num 20 void game(); void setmine(char mine[row + 2][line + 2]); int getRandomNum(int start, int end); void display(char show[row + 2][line + 2]); int getmine(char board[row + 2][line + 2], int x, int y); int unfold(char mine[row + 2][line + 2], char show[row + 2][line + 2], int x, int y); #endif