扫雷的C语言版设计

大家好,我是寒窗烟雨,今天我带来的扫雷的设计,用C语言一一呈现。

希望大家喜欢,对大家有所帮助,如有疑问或意见可以在评论区提出来,谢谢。

一、游戏思路

图1-0;

扫雷大家应该都不陌生,如图1-0图展示。

1.1变量存放。

我们需要一个二维数组,考虑到要用数字表示周围地雷的数量。

如果地雷用数字表示,不太好和周围数量分清,如此,我打算用字母‘E’表示地雷,与周围数字区分开来。既然地雷用字符表示,那数组类型就是char;

考虑到展示和地雷存放不能放在同一个数组中;那么就需要两个数组

char show[][];//第一个展示数组
char mine[][];//第二个地雷数组

最开始简单点,先初始化一个9*9的游戏雷区;那么定义

char show[9][9];
char mine[9][9];

1.2计算越界

现在还有一个问题需要考虑:

图1-1;

如图1-1图显示,假设我们在3*3中扫雷;

如果我们下O的地方,首先我们需要看它是不是雷,不是就统计它周围8格的地雷数量,数量为‘2’个。

如果我们下X的地方,首先它是不是雷,然后开始统计周围8格,这时发生一个问题,X的周围只有3格,其他5格在数组中是越界了,会使程序出错崩溃;

 图1-3;

解决方法:我选在数组的外围再加一圈,变成5*5;如图1-3;

这样X的一圈都可以不会发生数组越界问题,棋盘展示还是3*3,而最外面一圈什么都不存;

这样我们的两个数组,应该这样初始化:

char show[9+2][9+2];
char mine[9+2][9+2];

1.3计算周围地雷数量

图1-4;

当我们需要算O周围的地雷数量时,我们需要用到周围格子的坐标;

 他们的坐标变化相比O坐标如图1-4,如此就可以通过例:mine[x-1][y]找到O坐标上面的格子内容;通过判断,

if(mine[x-1][y] == ‘E’)
{
    count++;    //地雷数量
}

  最后通过

show[x][y] = count+48; //+48是吧count数量变成字符数量
                       //ASCII码中‘0’十进制值为48;

最后用display函数展示show函数;

2、程序框架

创建项目和.h和.c文件,然后对其把程序框架搭建好22

//-----main.c-----
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

int main()
{
	int ch;

	do
	{
		menu();
	
		while (scanf("%d", &ch) != 1) //防止输入字母导致死循环
		{
			int c = getchar(); //个人习惯,防止getchar报警
			continue;
		}

		switch (ch)
		{
			case 0: //退出	
					break;
			case 1: //进入游戏环节
					game();
					break;
			default://输入错误
					printf("输入错误,请重新输入!\n");
					break;
		}

	}while(ch);

	return 0;
}
//进入游戏环节
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "game.c"

#define COW 9    //展示长度
#define COL 9

#define COWS COW+2  //存储长度
#define COLS COL+2

#define CWCL COW*COL  //地雷最大数量
#define line 10  //设置地雷数量


void menu(); // 菜单;

void game();//游戏环节

void input_gamer();   //玩家输入,判断棋局并做处理

void display_char();	 //展示棋局

void ending();		 //判断结束

//-----game.c-----
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"



void menu()
{
	printf("******************************\n");
	printf("**********  1.PLAY  **********\n");
	printf("******************************\n");
	printf("**********  0.EIXT  **********\n");
	printf("******************************\n");

}


void game()
{
	char show[COWS][COLS]; //展示数组
	char mine[COWS][COLS]; //地雷数组
	int e_char[CWCL][2];   //地雷坐标
	
    init_char();

	while (1)
	{
		input_gamer();   //玩家输入,判断棋局并做处理
		display_char();	 //展示棋局
		ending();		 //判断结束
	}

}

void init_char()
{

}

void input_gamer()
{

}

void display_char()
{

}

void ending()
{
	
}

3、完善程序

//---main.c---
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

int main()
{
	srand((unsigned int)time(NULL)); //设置随机函数
	int ch = 2;

	do
	{
		menu();
		printf(">>");
		while (scanf("%d", &ch) != 1)
		{
			getchar();
			continue;
		}

		switch (ch)
		{
			case 0: //退出	
					break;
			case 1: //进入游戏环节
					game();
					break;
			default: 
					printf("输入错误,请重新输入!\n");
					break;
		}

	} while (ch);

	return 0;
}
//---game.c---
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"


void menu()
{
	printf("******************************\n");
	printf("**********  1.PLAY  **********\n");
	printf("******************************\n");
	printf("**********  0.EIXT  **********\n");
	printf("******************************\n");

}


void game()
{
	char show[COWS][COLS]; //展示数组
	char mine[COWS][COLS]; //地雷数组
	int e_char[CWCL][2] = {0};   //地雷坐标
	
	printf("开始扫雷游戏!\n");
	init_char(show, mine, e_char);
	
	int ch = 1;
	int sh = 0;
	while (ch)
	{
		display_char(show);	 //展示棋局
		//display_char(mine);	 //展示棋局
		sh = input_gamer(show,mine);   //玩家输入,判断棋局并做处理	 
		ch = ending(sh,show,e_char);	//判断结束
		//ch--;
	}

}

void init_char(char show[COWS][COLS], char mine[COWS][COLS], int e_char[CWCL][2])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < COWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			show[i][j] = '*';
			mine[i][j] = ' ';
		}
	}

	int len = 0;
	while (len < line)  
	{
		int x = rand() % COW + 1; //范围1~9;
		int y = rand() % COL + 1; //范围1~9;
		
		if (mine[x][y] == ' ')
		{
			mine[x][y] = '!';
			e_char[len][0] = x;
			e_char[len][1] = y;
			len++;
		}
	}
}

int input_gamer(char show[COWS][COLS], char mine[COWS][COLS])
{
	int x = 0;
	int y = 0;
	printf("请输入坐标:\n>>");
	int xy = 1;
	while (xy)
	{
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			xy = 0;
		}
		else
		{
			printf("坐标超出范围,请重新输入0~9范围的坐标:\n>>");
		}

	}


	int coun = 0;
	static int st = CWCL-line;
	if (mine[x][y] != '!')
	{
		st--;
		coun = rever(mine, x, y);
		if (0 == coun)
		{
			show[x][y] = ' ';
		}
		else
		{
			show[x][y] = coun+48;
		}
		if (0 == st)
		{
			return 2;
		}

		return 0;
	}
	else
	{
		show[x][y] = '!';
		return 1;
	}

}

void display_char(char show[COWS][COLS])
{
	int i = 0;
	int j = 0;

	
	for (i = 0; i <= COW; i++)
	{
		for (j = 0; j <= COW; j++)
		{
			if (0 == i)
			{
				printf("%d ", j);
			}
			else if (0 == j)
			{
				printf("%d ", i);
			} 
			else
			{
				printf("%c ", show[i][j]);
			}
		}
		printf("\n");
	}
}

int ending(int sh, char show[COWS][COLS], int e_char[CWCL][2])
{
	if (0 == sh)
	{
		return 1;
	}
	else 
	{
		int i = 0;
		for (i = 0; i < line; i++)
		{
			show[e_char[i][0]][e_char[i][1]] = '!';
		}
		display_char(show);

		if(1 == sh)
			printf("你排到雷了,游戏失败!\n");
		else
			printf("你已经把雷排完了,恭喜你游戏获胜了!\n\n");

		return 0;
	}
}

int rever(char mine[COWS][COLS],int x,int y)
{
	return (int)(mine[x-1][y-1] - ' ' +
			mine[x - 1][y] - ' ' +
			mine[x - 1][y+1] - ' ' +
			mine[x][y - 1] - ' ' +
			mine[x][y] - ' ' +
			mine[x][y + 1] - ' ' +
			mine[x + 1][y - 1] - ' ' +
			mine[x + 1][y] - ' ' +
			mine[x + 1][y + 1] - ' ');  //'!' - ' ' = int 1; ' ' - ' ' = int 0;
}
//---game.h---
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#include "game.c"

#define COW 9    //展示长度
#define COL 9

#define COWS (COW+2)  //存储长度
#define COLS (COL+2)

#define CWCL (COW*COL)  //地雷最大数量
#define line 10  //设置地雷数量 


void menu(); // 菜单;

void game();//游戏环节

void init_char(char show[COWS][COLS], char mine[COWS][COLS], int e_char[CWCL][2]);

int input_gamer(char show[COWS][COLS], char mine[COWS][COLS]);   //玩家输入

void display_char(char show[COWS][COLS]);	 //展示棋局

int ending(int sh, char show[COWS][COLS], int e_char[CWCL][2]);		 //判断结束


4、结语

对我来说,这篇博客是失败的,这个扫雷项目也是写的很糟糕。

最后感谢大家看到这里。

有疑问和建议都可以和我说。

把地雷数量设置为80,棋盘为9*9:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值