1.扫雷游戏——————C初学者的简单版本
实现: ①难度选择,不同的雷数的计算方法产生不同的难度;
②第一次踩到雷不会跳出;
③如果坐标周围没有雷的时候,扩展坐标。
源代码:
game.h
//*Copyright(c) 2018,葵司 //*All rights reserved. //* //*文件名称:排雷游戏 //* //*当前版本:1.1 //*作者:葵司 //*完成日期:2018年4月23日 //* //*取代版本:1.0 //*作者:葵司 //* #ifndef _GAME_H_ #define _GAME_H_ #include <stdio.h> #include <stdlib.h> #include <time.h> enum OPTION { PLAY = 1, EXIT = 2 }; #define ROW 10 #define COL 10 #define ROWS ROW+2 #define COLS COL+2 extern int nume ;//置0和不置0有区别 extern int Spacenumber; void interface(); int Choose(int a); void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); void PrintBoard(char board[ROWS][COLS], int rows, int cols); void SetMine(char board[ROWS][COLS],int row,int col); void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); int GetMineCount(char mine[ROWS][COLS], int x, int y); void expand(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y); #endif//_GAME_H_
game.c
#include "game.h" int nume;//全局变量定义 int Spacenumber;//全局变量定义 //初始化数组 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 PrintBoard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for (j = 0; j <= row; j++) { printf("%-2d ", j); } printf("\n"); for (i = 0; i < row; i++) { printf("%-2d", i+1); for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); } printf("\n"); } printf("\n"); } //设置炸弹 void SetMine(char board[ROWS][COLS]) { int count =nume; int x = 0; int y = 0; while (count) { x = rand() % ROW + 1; y = rand() % COL + 1; if ('0' == board[x][y]) { board[x][y] = '1';//有雷的地方设置为字符1 count--; } } } //返回玩家输入坐标周围的雷数 static int GetMineCount(char mine[ROWS][COLS], int x, int y) { int minecount = 0; if (mine[x - 1][y] == '1') minecount++; if (mine[x - 1][y + 1] == '1') minecount++; if (mine[x - 1][y + 1] == '1') minecount++; if (mine[x][y + 1] == '1') minecount++; if (mine[x + 1][y + 1] == '1') minecount++; if (mine[x + 1][y] == '1') minecount++; if (mine[x + 1][y - 1] == '1') minecount++; if (mine[x][y - 1] == '1') minecount++; if (mine[x - 1][y - 1] == '1') minecount++; return minecount; } //利用函数递归调用实现的扩展函数 void expand(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y) { if (0 == GetMineCount(mine, x, y)) { show[x][y] = ' '; Spacenumber++; if (show[x][y - 1] == '*') { expand(mine, show, row, col, x, (y - 1)); } if (show[x][y + 1] == '*') { expand(mine,show, row, col, x, (y + 1)); } if (show[x - 1][y] == '*') { expand(mine, show, row, col, (x - 1), y); } if (show[x + 1][y] == '*') { expand(mine, show, row, col, (x + 1), y); } } else { show[x][y] = GetMineCount(mine, x, y) + '0'; } } //找雷函数 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int sum = 0; int count = 0; int ret = 0; while (row*col-sum>nume) { printf("请输入您的坐标:"); scanf("%d%d", &x, &y); printf("\n"); count++; while (1 == (x >= 1 && x <= row && y >= 1 && y <= col)) { sum++; x--; y--; if ('1' == mine[x][y]) { if (1 == count)//判断是否第一次就踩到雷了 { printf("炸了!再给你一次机会!\n"); printf("\n"); break; } else { printf("恭喜你中奖了,你踩到雷了!GAME OVER!\n"); printf("\n"); return 0; } } else { expand(mine, show, row, col, x, y); PrintBoard(show, ROW, COL); break; } if (0 == (x >= 1 && x <= row && y >= 1 && y <= col)) { printf("输入非法!请重新输入!\n"); printf("\n"); } } } if (row*col-sum == nume) { printf("恭喜你,扫雷成功!\n"); printf("\n"); } }
find.c
#include "game.h" int nume;//全局变量定义 int Spacenumber;//全局变量定义 //菜单函数 void MENU() { printf(" ##### \n"); printf(" ###### ###### \n"); printf(" ####### 1.PLAY ####### \n"); printf(" ####### 2.EXIT ####### \n"); printf(" ###### ###### \n"); printf(" ##### \n"); } //选择界面 void interface() { printf("*********************************************************************\n"); printf("******************** 1.菜鸟 *************************************\n"); printf("******************** 2.高手 *************************************\n"); printf("******************** 3.老鸟 *************************************\n"); printf("*********************************************************************\n"); printf("\n"); } //难度选择,返回不同的雷的数目 int Choose(int a) { switch (a) { case 1: return ROW; case 2: return ROW + ROW / 2; case 3: return ROW * 2 ; default: { printf("输入错误,请重新输入!"); break; } } } //游戏函数 void game() { char mine[ROWS][COLS] = { '0' }; char show[ROWS][COLS] = { '0' }; InitBoard(mine, ROW, COL, '0');//布雷的函数初始化为‘0’ InitBoard(show, ROWS, COLS, '*');//显示的函数初始化为‘0’ //PrintBoard(mine, ROW, COL); PrintBoard(show, ROW, COL); SetMine(mine,ROW,COL);//生成随机位置的雷 //PrintBoard(mine, ROW, COL); FindMine(mine, show, ROW, COL);//找雷函数 } //执行函数 void TEST() { srand((unsigned)time(NULL)); int input = 0; int i = 0; do { MENU(); printf("请选择->"); scanf("%d", &input); switch (input) { case 1: { interface(); printf("请选择难度"); scanf("%d", &i); nume= Choose(i);//全局变量赋予其雷的数目 game(); break; } case 2: printf("您将退出游戏!\n"); break; default: printf("您输错了,请再输入!\n"); break; } } while (input); } //主函数 int main() { TEST(); system("pause"); return 0; }
注:代码在VS2013上已运行,无误。
已知bug:(我也想改,但不会,所以会继续以优化-_+)
①:当游戏是 9*9 时,如果我把雷数设置成80个时,编译成功,但运行会出现问题
②..............
发现的问题:
①:全局变量在头文件中初始化为0和不为0效果不一样,待解决,
②............