赞
踩
一、 利用C语言实现扫雷游戏
1、输入方式:首先玩家输入排查雷的坐标,如果不是雷,游戏继续并计算周围有几个雷;如果是雷,“很遗憾,你被炸死了”。
2、坐标的判定:如果该坐标周边有雷,则显示周围雷的个数。
3、游戏结束判定:当玩家触碰到雷,或者棋盘上所有非雷的区域被玩家全部找到。
二、设计基本流程
1、游戏主菜单
2、游戏设计部分:
三、主要设计流程
1、主菜单:
主菜单用do while循环结构,实现玩完一次游戏不过瘾,还可以接着玩。(do while 循环可以保证整个循环至少运行一次)
- void menu()
- {
- printf("**********************************\n");
- printf("******** 1. play ***********\n");
- printf("******** 0. exit ***********\n");
- printf("**********************************\n");
-
- }
-
- void test()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- game();
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("选择错误,请重新选择!\n");
- break;
- }
- } while (input);
-
- }
先调试一下:
2、游戏设计部分
为了之后访问二维数组时不越界,设置棋盘时,每行和每列都要加2(若想玩9x9的棋盘,在最初设置棋盘时要设置成11x11)
- #define ROW 9
- #define COL 9
-
- #define ROWS ROW+2
- #define COLS COL+2
-
- //1、布置好雷的信息
- char mine[ROWS][COLS] = { 0 }; //11*11
- //2、排查出雷的信息
- char show[ROWS][COLS] = { 0 };
初始化mine棋盘:布雷的棋盘初始化全为'0'。(这里的0为字符0)
初始化show棋盘:显示的棋盘初始化全为'*'。
- 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;
- }
- }
- }
先调试一下,一边写一边运行,养成好习惯:
在扫雷游戏中,如果该坐标不是雷,此时周围一圈8个坐标会提示雷的个数。用临时变量count来记录周围雷的个数。将布设的雷的坐标设为‘1’。
- int get_mine_count(char mine[ROWS][COLS], int x, int y)
- {
- return mine[x - 1][y]+
- mine[x - 1][y - 1] +
- mine[x][y - 1] +
- mine[x + 1][y - 1] +
- mine[x + 1][y] +
- mine[x + 1][y + 1] +
- mine[x][y + 1] +
- mine[x - 1][y + 1] - 8 * '0';
- }
布置雷的结果:
扫雷函数是一个重要的模块,到最后需要确定游戏胜利的条件,我们要统计当前状态玩家棋盘中显示剩余 * 的个数,如果个数等于总雷数时,说明扫雷完成,游戏胜利,代码如下:
- void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
- {
- int x = 0;
- int y = 0;
- int win = 0;
- while (win < row*col - EASY_COUNT)
- {
- printf("请输入排查雷的坐标:>");
- scanf("%d%d", &x, &y);
- if (x >= 1 && x <= row && y >= 1 && y <= col)
-
- {
- //坐标合法
- //1、踩雷
- if (mine[x][y] == '1')
- {
- printf("很遗憾,你被炸死了\n");
- DisplayBoard(mine, row, col);
- break;
- }
- else //不是雷
- {
- //计算x,y坐标周围有几个雷
- int count = get_mine_count(mine, x, y);
- show[x][y] = count + '0';
- DisplayBoard(show, row, col);
- win++;
- }
- }
- else
- {
- printf("输入坐标非法,请重新输入!\n");
- }
- }
-
- if (win == row*col - EASY_COUNT)
- {
- printf("恭喜你,排雷成功\n");
- DisplayBoard(mine, ROW, COL);
- }
-
- }
-
调试结果:
四、代码部分
一共有三个文件夹:
1、game.c存放的是函数的实现
- #define _CRT_SECURE_NO_WARNINGS 1#
- #include "game.h"
-
- 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 DisplayBoard(char board[ROWS][COLS], int row, int col)
- {
- int i = 0;
- int j = 0;
- //打印列号
- for (i = 0; i <= col; i++)
- {
- printf("%d ", i);
- }
- printf("\n");
- for (i = 1; i <= row; i++)
- {
- printf("%d ", i);
-
- for (j = 1; j <= col; j++)
- {
- printf("%c ", board[i][j]);
- }
- printf("\n");
- }
- }
-
- void SetMine(char board[ROWS][COLS], int row, int col)
- {
- int count = EASY_COUNT;
- while (count)
- {
- int x = rand() % row + 1; //1--9
- int y = rand() % col + 1;
- if (board[x][y] == '0')
- {
- board[x][y] = '1';
- count--;
- }
- }
- }
-
- int get_mine_count(char mine[ROWS][COLS], int x, int y)
- {
- return mine[x - 1][y]+
- mine[x - 1][y - 1] +
- mine[x][y - 1] +
- mine[x + 1][y - 1] +
- mine[x + 1][y] +
- mine[x + 1][y + 1] +
- mine[x][y + 1] +
- mine[x - 1][y + 1] - 8 * '0';
- }
-
- void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
- {
- int x = 0;
- int y = 0;
- int win = 0;
- while (win < row*col - EASY_COUNT)
- {
- printf("请输入排查雷的坐标:>");
- scanf("%d%d", &x, &y);
- if (x >= 1 && x <= row && y >= 1 && y <= col)
-
- {
- //坐标合法
- //1、踩雷
- if (mine[x][y] == '1')
- {
- printf("很遗憾,你被炸死了\n");
- DisplayBoard(mine, row, col);
- break;
- }
- else //不是雷
- {
- //计算x,y坐标周围有几个雷
- int count = get_mine_count(mine, x, y);
- show[x][y] = count + '0';
- DisplayBoard(show, row, col);
- win++;
- }
- }
- else
- {
- printf("输入坐标非法,请重新输入!\n");
- }
- }
-
- if (win == row*col - EASY_COUNT)
- {
- printf("恭喜你,排雷成功\n");
- DisplayBoard(mine, ROW, COL);
- }
-
- }
2、game.h存放函数声明等
- #define ROW 9
- #define COL 9
-
- #define ROWS ROW+2
- #define COLS COL+2
-
- #define EASY_COUNT 10
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
-
-
- void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
- void DisplayBoard( char board[ROWS][COLS], int row, int col);
- 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 get_mine_count(char mine[ROWS][COLS], int x, int y);
3、test.c存放游戏主函数
- #define _CRT_SECURE_NO_WARNINGS 1
-
-
- #include "game.h"
-
- void menu()
- {
- printf("**********************************\n");
- printf("******** 1. play ***********\n");
- printf("******** 0. exit ***********\n");
- printf("**********************************\n");
-
- }
-
- void game()
- {
- //雷信息存储
- //1、布置好雷的信息
- char mine[ROWS][COLS] = { 0 }; //11*11
- //2、排查出雷的信息
- char show[ROWS][COLS] = { 0 };
- //初始化
- InitBoard(mine, ROWS, COLS, '0');
- InitBoard(show, ROWS, COLS, '*');
- //打印棋盘
- DisplayBoard(mine, ROW, COL);
- DisplayBoard(show, ROW, COL);
- //布置雷
- SetMine(mine, ROW, COL);
- DisplayBoard(mine, ROW, COL);
- //扫雷
- FindMine(mine, show, ROW, COL);
-
- }
-
- void test()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- game();
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("选择错误,请重新选择!\n");
- break;
- }
- } while (input);
-
- }
-
- int main()
- {
- test();
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。