实践 : 简单扫雷游戏

一、扫雷游戏分析

        1、游戏界面

                             

                初始界面                             排查雷界面                              排雷失败

        2.游戏分析

                < 1 >  棋盘设计

                扫雷游戏,我们需要在9*9(或者更多)的棋盘上去布置雷和排查雷,所布置的雷与排查雷的信息都需要进行记录,所以用两个二维数组来记录这些信息;如用mine数组来记录布置的雷的信息---‘0’代表不是雷,‘1’代表是雷;用show数组来记录所排查的雷的信息,刚开始,用‘*’来展示,由于会排查边缘是否为雷,并统计周围8个位置雷的信息,所以就把数组大小设置成11*11;

                

mine(雷)
show(排查雷)

                <2> 布置雷的信息

                布置雷其实就是生成一个或多个随机的坐标,将这些坐标的位置布置成雷,用代码实现就是将mine这个数组数组中生产随机坐标处的值改为‘1’;

                rand函数:这里就要用到随机生成数字rand函数

                                   rand函数头文件<stdlib.h>;

                                  rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。使用rand生成0--9的随机数:

int x;
x = rand() % 9;

                                   srand()用来设置rand()产生随机数时的随机数种子。为了让rand每次生成的随机数不相同,就需要用到srand,srand((unsigned int)time(NULL));

srand((unsigned int)time(NULL));
int x;
x = rand() % 9 ; 

                                   此时就会用到time函数,头文件<time.h>;

                布置雷的过程中还需注意:本次所生成的随机坐标处是不是‘1’,可以增加一处判断。

                <3>排查雷的信息

                排查雷,即输入一个坐标,判断此处是不是雷;如果是,则游戏结束;如果不是,则游戏继续,并输出该坐标周围8个位置雷的个数。

                因为游戏需要重复输入,可以用while循环来编写代码

                判断:  首先,要判断输入的坐标合不合理,如果合理才继续进行(不合理则重新输入)

                             根据输入的坐标,判断mine数组中这个坐标处是不是‘1’,是‘1’则游戏结束;

                             如果不是‘1’,就要统计这个坐标周围8个位置雷的个数,这里写一个函数COUNT_Mine来实现;

                COUNT_Mine函数:

                                show数组是一个字符数组,这里就要用到字符‘0’转化为0:只需‘0’-0即可;

                                统计完成数目后在转换为字符存入数组show中,+‘0’即可;

                                统计坐标周围8个位置的雷的个数

                               根据图析,可以看出周围8个坐标的规律,因为‘1’代表雷,‘0’不是雷;所以,只用将周围8个位置的值相加,并减去8*‘0’即可。

                                (当然,也可以使用循环去解决,代码如下:)

    int i = 0;
	int sum = 0;
	for (i = -1; i <= 1; i++) {
		int j = 0;
		for (j = -1; j <= 1; j++) {
			sum += mine[i][j] - '0';
		}
	}

二、游戏代码实现

        1、game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MINE 10
#define LINE 9  //行
#define ROW 9   //列

#define LINES LINE+2
#define ROWS ROW+2

//初始化
void csh(char arr[LINE][ROWS], int line, int row, char set);

//输出
void Printf(char arr[LINE][ROWS], int line, int row);

//布置雷
void set_Mine(char arr[LINES][ROWS], int line, int row);

//查找雷
void find_Mine(char mine[LINES][ROWS], char show[LINES][ROWS] , int line, int row);

        2、game.c

#include "game.h"

//初始化
void csh(char arr[LINE][ROWS], int lines, int rows, char set) {
	int i = 0;
	for (i = 0; i < lines; i++) {
		int j = 0;
		for (j = 0; j < rows; j++) {
			arr[i][j] = set;
		}
	}
}

//输出
void Printf(char arr[LINE][ROWS], int line, int row) {
	int i = 0;
	printf("-----扫雷游戏-----\n");
	for (i = 0; i <=row; i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= line; i++) {
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= row; j++) {
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

//布置雷
void set_Mine(char arr[LINES][ROWS], int line, int row)
{
	int count = MINE;
	int x = 0;
	int y = 0;
	while (count) {
		x = rand() % line + 1;
		y = rand() % row + 1;
		if (arr[x][y] != '1') {
			arr[x][y] = '1';
			count--;
		}
	}
}

//查找雷

int COUNT(char mine[LINES][ROWS], int x, int y) {
	/*int i = 0;
	int sum = 0;
	for (i = -1; i <= 1; i++) {
		int j = 0;
		for (j = -1; j <= 1; j++) {
			sum += mine[i][j] - '0';
		}
	}
	return sum;*/
	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 find_Mine(char mine[LINES][ROWS], char show[LINES][ROWS], int line, int row) {	
	int x, y;
	int times = 0;
	while (times<LINE*ROW - MINE) {
		printf("输入要查找的坐标\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9) {

			if (mine[x][y] == '1') {
				printf("game over !\n 菜!就多练!!!\n");
				Printf(mine, LINE, ROW);
				break;
			}
			else {
				show[x][y] = COUNT(mine, x, y)+'0';
				times++;
				Printf(show, LINE, ROW);
			}
		}
		else {
			printf("输入错误,重新输入\n");
		}
	}
	if (times == LINE * ROW - MINE) {
		printf("恭喜 ,geme win!\n");
	}
}

        3、test.c

#include "game.h"

void test() {
	printf("*****************************\n");
	printf("***********1. 开始***********\n");
	printf("***********0. 结束***********\n");
	printf("*****************************\n");
	printf("---请选择---\n");
	int a;
	char mine[LINES][ROWS] = { '0' };
	char show[LINES][ROWS] = { '*' };
	srand((unsigned int)time(NULL));
	do {
		scanf("%d", &a);
		switch (a) {
		case 1:
			//初始化
			csh(mine, LINES, ROWS, '0');
			csh(show, LINES, ROWS, '*');
			//输出
			//Printf(mine, LINE, ROW);
			Printf(show, LINE, ROW);

			//随机生成雷
			set_Mine(mine, LINE, ROW);
			//Printf(mine, LINE, ROW);


			//查找雷
			find_Mine(mine, show, LINE, ROW);
			break;
		case 0:
			printf("game over");
			break;
		default:
			printf("输入错误 重新输入\n");
			break;
		}
	} while (a);
}

int main() {
	test();
	return 0;
}

三、扫雷游戏进阶

       扩展:选择挑战难度9*9/20*20等;

                  如果排查位置周围不是雷,显示一片区域;

        等等

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值