首页 > 其他分享 >C语言--扫雷

C语言--扫雷

时间:2023-04-24 23:31:42浏览次数:36  
标签:Mxkf ROWS -- COLS C语言 char int 扫雷 printf

game.h

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_COUNT 10  //Easy

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

Itals(char Mxkf[ROWS][COLS], int rows, int cols, char set);
Print(char Mxkf[ROWS][COLS], int row, int col);
Setmine(char Mxkf[ROWS][COLS], int row, int col);
Demine(char Mxkf[ROWS][COLS], char Mxyh[ROWS][COLS], int row, int col);

text.c

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include "game.h"

void menu()
{
	printf("****************************\n");
	printf("********** 1 Play **********\n");
	printf("********** 0 Exit **********\n");
	printf("****************************\n");
}

void game()
{
	char Mxkf[ROWS][COLS] = { 0 };
	char Mxyh[ROWS][COLS] = { 0 };
	//初始化棋盘
	Itals(Mxkf, ROWS, COLS, '0');
	Itals(Mxyh, ROWS, COLS, '*');
	//打印棋盘
	Print(Mxyh, ROW, COL);
	//设置地雷
	Setmine(Mxkf, ROW, COL);
	//Print(Mxkf, ROW, COL);
	//扫雷
	Demine(Mxkf, Mxyh, ROW, COL);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			break;
		}
	} while (input);
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"
//初始化棋盘
Itals(char Mxkf[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++)
		{
			Mxkf[i][j] = set;
		}
	}
}
//打印棋盘
Print(char Mxyh[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("\n   ");
	for (j = 1; j < col+1; j++)
	{
		printf("%2d", j);	//打印列标号
	}
	printf("\n\n");
	for (i = 1; i <= row; i++)
	{
		printf("%2d  ", i);  //打印行标号
		for (j = 1; j <= col; j++)
		{
			printf("%c ", Mxyh[i][j]);
		}
		printf("\n");
	}
}
//设置地雷
Setmine(char Mxkf[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = MINE_COUNT;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		//printf("%d %d\n",x,y);
		if (Mxkf[x][y] == '0')
		{
			Mxkf[x][y] = '1';
			count--;
		}
	}
}
//游戏结束
OverSetmine(char Mxkf[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 0; j <= col; j++)
		{
			//printf("%d %d\n",x,y);
			if (Mxkf[i][j] == '0')
				Mxkf[i][j] = ' ';
			if (Mxkf[i][j] == '1')
				Mxkf[i][j] = '@';
		}
	}
}
//统计周围地雷个数
int Record(char Mxkf[ROWS][COLS], int x, int y)
{
	return Mxkf[x - 1][y - 1] +
		Mxkf[x - 1][y] +
		Mxkf[x - 1][y + 1] +
		Mxkf[x][y - 1] +
		Mxkf[x][y + 1] +
		Mxkf[x + 1][y - 1] +
		Mxkf[x + 1][y] +
		Mxkf[x + 1][y + 1] - 8 * '0';
}
//展开
void Open(char Mxkf[ROWS][COLS], char Mxyh[ROWS][COLS], int x, int y)
{
	int count = Record(Mxkf, x, y);
	if (count == 0)
	{
		int i = 0;
		int j = 0;
		Mxyh[x][y] = ' ';
		for (i = -1; i <= 1; i++)
		{
			for (j = -1; j <= 1; j++)
			{
				if (Mxyh[x+i][y+j]=='*'&& (x + i) >= 1 && (x + i) <= ROWS && (y + j) >= 1 && (y + j) <= COLS)
				{
					Open(Mxkf, Mxyh, x + i, y + j);
				}
			}
		}
	}
	else
	{
		Mxyh[x][y] = count + '0';
	}
}
//开始扫雷
Demine(char Mxkf[ROWS][COLS], char Mxyh[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		int win = 0;
		printf("请输入坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row&&y >= 1 && y <= col)
		{
			//输入坐标合法
			if (Mxkf[x][y] == '1')
			{
				system("cls");
				printf("你被炸死了,游戏结束\n");
				OverSetmine(Mxkf, row, col);
				Print(Mxkf, row, col);
				printf("\n");
				break;
			}
			else
			{
				//统计一周地雷总数

				Open(Mxkf, Mxyh, x, y);
				system("cls");
				Print(Mxyh, row, col);
			}
			for (int i = 1; i <= row; i++)
			{
				for (int j = 1; j <= col; j++)
				{
					if (Mxyh[i][j] == '*')
					{
						win++;
					}
				}
			}
			if (win == MINE_COUNT)
			{
				printf("***********恭喜通关*********\n\n");
				break;
			}
		}
		else
		{
			printf("坐标非法,请重新输入:>");
		}
	}
}

展开用到了函数递归,好难啊,琢磨三四个小时还半知半解


标签:Mxkf,ROWS,--,COLS,C语言,char,int,扫雷,printf
From: https://blog.51cto.com/u_16071993/6222020

相关文章

  • 打卡6
    #include<iostream>usingnamespacestd;intmain(){intscore=0; cout<<"请您输入一个分数:"<<endl; cin>>score; if(score>700) { cout<<"恭喜您考上石家庄铁道大学"<<endl; }elseif(score>600) { ......
  • Medicine River-------------Learning Journals 8
      htttp://www.enotes.com......
  • GPT4有那么可怕吗?
    ChatGPT的影响3月22号也就是一个月前,马斯克,对你没听错,就是前几天发射火箭失败爆炸的那个,他联合几千名科学家用公开信请愿暂停一切大型AI实验半年以上,这六个月的时间是用来做一份监督和规范AI发展的协议,避免AI的发展走向极端,超出人类的控制。现在这封公开信已经有超过3万人参与......
  • axios传递参数的使用
    今天在学习elasticsearch时,遇到一个问题:项目中前端采用的是Vue2+axios,后端的接口采用Restful风格来接收:关于Resultful风格:1.GET(SELECT):从服务器取出资源(一项或多项);2.POST(CREATE):在服务器新建一个资源;3.PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源);......
  • 11.个人所得税
     问题分析:定义结构体类型的变量这里可以使用结构体数组存放不同的税率范围。 接着使用 for 循环遍历每一个征税范围,将个人收入中超出起征点的金额在每个征税范围内应缴纳的税款累加起来,就得到最后应缴纳的个人所得税。  代码:#include<stdio.h>#defineTAXBASE3500......
  • 建个随笔记录版本
    因式分解模拟器2.0*修复了两个式子前后互换位置无法识别的错误*增加了正确答案存在时间*整体难度下调*修改了难度的选择部分,更加简洁*增加了很多注释https://files.cnblogs.com/files/blogs/777644/%E5%9B%A0%E5%BC%8F%E5%88%86%E8%A7%A3%E6%A8%A1%E6%8B%9F%E5%99%A82.0.zip?t=1......
  • RS485串口MODBUS通讯仪器表自动存储到数据库的方法
    参考资料链接:https://blog.csdn.net/qq_15627707/article/details/113059580 软件名称:DAQforIIOT通用工业数据采集系统 www.daq-iot.com 19936624847 ......
  • 在 WSL2 搭建ESP8266/ESP32开发环境
    Ubuntu版本Ubuntu22.04.1LTS#wsl前期准备本文中所有命令均使用完整路径,环境安装完成后,目录结构如下/home/zhao/esp├──esp-gitee-tools├──esp32-sdk│  └──esp-idf└──esp8266-sdk└──ESP8266_RTOS_SDK下载esp32-gitee-tools[1]cd~/e......
  • 力扣844. 比较含退格的字符串
    给定s和t两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true。#代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。 示例1:输入:s="ab#c",t="ad#c"输出:true解释:s和t都会变成"ac"。示例2:输入:s="ab##",t="c#d#"输出:true解释:s......
  • 4.24总结
    --基础查询--1.查询多个字段/*1.查询多个字段SELECT字段列表FROM表名;SELECT*FROM表名;--查询所有数据去除重复记录SELECTDISTINCT字段列表FROM表名;3.起别名AS:AS也可以省略*/droptableifexistsstu;CREATETABLEstu(idint,namevarchar(20),......