首页 > 其他分享 >33.【C语言】实践扫雷游戏

33.【C语言】实践扫雷游戏

时间:2024-07-24 16:58:34浏览次数:18  
标签:ROWS 33 COLS C语言 char int game 扫雷 mine

预备知识:

第13篇 一维数组 第13.5篇 二维数组

第28篇 库函数 第29篇 自定义函数 第30篇 函数补充

0x1游戏的运行:

1.随机布置雷

2.排雷

基本规则:

点开一个格子后,显示1,对于9*9,代表以1为中心的去心九宫格内有一个雷,找到后标记

,直到标完所有的雷,游戏结束;如果中途点中雷,游戏结束

0x2.编写过程

现创建9*9的雷区,编写代码

但这样会程出现问题,边缘的雷需要另外写代码(否则九宫格越界)-->为了方便,扩大一圈(11*11)

定义二维数组:char board[11][11]

两个二维数组:一个布雷,一个显示玩家排雷的状态

game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 10
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
void menu();
void game();
void InitBoard(char board[ROWS][COLS], int row, int col, char set);
void SetMine(char board[ROWS][COLS], int row, int col);
void DisplayBoard(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);

DisplayBoard.c

#include "game.h"
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
	printf("-------99扫雷-------\n");
	printf("0 ");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);//打印行
	}
	printf("y");
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);//打印列
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("x");
	printf("\n--------------------\n");
}

 FineMine.c

#include "game.h"
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-COUNT)
	{
		
		//DisplayBoard(mine, ROW, COL);//作弊模式:)
		printf("输入排查雷的坐标 x y :>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("这是雷,很遗憾游戏结束\n");
				DisplayBoard(mine, ROW, COL);
				Sleep(3000);
				system("cls");
				break;
			}
			else
			{
				win++;
				system("cls");
				int sum = GetMineCount(mine, x, y);//t统计去心九宫格雷的个数
				show[x][y] = sum + '0';
				
				DisplayBoard(show, ROW, COL);
			}
		}

		else
		{
			printf("输入有误,重新输入\n");
		}

	}
	if (win== row * col - COUNT)
		printf("赢了\n");
}

game.c

#include "game.h"
void game()
{
	char mine[ROWS][COLS] = { 0 };//定义布雷数组
	char show[ROWS][COLS] = { 0 };//定义显示玩家排雷的状态的数组
	InitBoard(mine, ROWS, COLS, '0');//初始化布雷数组
	InitBoard(show, ROWS, COLS, '?');//初始化显示玩家排雷的状态的数组
	SetMine(mine, ROW,COL);//布雷
	DisplayBoard(show, ROW, COL);//打印显示玩家排雷的状态的数组
	FindMine(mine,show,ROW,COL);//玩家找雷
}

GetMineCount.c

#include "game.h"
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{
	return mine[x][y + 1] + mine[x][y - 1] + mine[x - 1][y] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x + 1][y - 1] - 8 * '0';
}

InitBoard.c

#include "game.h"
//初始化雷区
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

main.c


#include "game.h"
int main()
{
	int tmp = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//调用菜单函数
		scanf("%d", &tmp);
		switch (tmp)
		{
		case 2:
			break;
		default:
		{
			printf("输入错误,重新选择!\n");
			Sleep(1000);
			system("cls");
			break;
		}
		  case 1:
		  {
			  system("cls");
			  game();
			  break;
		  }

		}

	} 
	while (tmp != 2);
	return 0;
}

menu.c

#include "game.h"
void menu()//主菜单函数
{
	printf("**********************************************\n");
	printf("*******************1.PLAY********************\n");
	printf("*******************2.EXIT*********************\n");
	printf("**********************************************\n");
	printf("请选择:\n");
}

SetMine.c

#include "game.h"
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = 10;
	while (count)
	{
		int x = rand() % row + 1;//x:1~9
		int y = rand() % col + 1;//y:1~9
		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}

}

 

标签:ROWS,33,COLS,C语言,char,int,game,扫雷,mine
From: https://blog.csdn.net/2401_85828611/article/details/140641664

相关文章

  • 【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
    目录C语言结构体(`struct`)详解结构体概览表1.结构体的基本概念1.1结构体定义1.2结构体变量声明2.结构体成员的访问2.1使用点运算符(`.`)访问成员输出2.2使用箭头运算符(`->`)访问成员输出3.结构体的初始化3.1结构体初始化输出3.2使用指定初始化器输出4.结构......
  • 线段树(区间操作,例题:洛谷P3372 线段树 1)
    在上一节线段树(原理、构造和区间查询,例题:BalancedLineup)中介绍了线段树的构造,下面就来说一下它的区间操作。区间操作与Lazy-Tag有关,如果修改操作是对区间内的每个元素一一修改,就会比较繁琐低效,目前的解决办法是线段树的tree[i].data记录的是区间i的值(详细见上节),可以再定义一......
  • [c语言分支循环语句详解 -----选择结构、循环结构]
            c语言是结构化的程序设计语言,分为顺序结构、选择结构、循环结构。我们生活中的所有事情都可以用三种顺序结构表示。顺序结构顺序结构是C语言的基本结构程序由上而下运行,运行完上条语句再往下运行,平时写的程序基本都用到顺序结构。选择结构我们可以使用i......
  • C语言代码实现——扫雷
    目录前言1扫雷游戏的分析和实现1.1扫雷游戏的功能1.2扫雷游戏的分析1.3完整代码2扫雷游戏的扩展2.1扫雷扩展的实现总结前言扫雷,相信大家都或多或少的了解这款游戏,本篇文章将分析这个游戏的设计思路,并用C语言代码来实现这个游戏。1扫雷游戏的分析和实现1.1......
  • STM32F103C8T6与LD3320进行串口通讯控制LED灯的亮灭
    目录概要整体架构流程技术名词解释技术细节LD3320部分LD3320串口测试32单片机代码部分main.c(要与LD3320保持一致)串口部分概要STM32微控制器与LD3320语言模块通过串口进行数据交互,实现语音识别和控制功能。整体架构流程通过STC-ISP将LD3320部分的代码烧录进LD......
  • 2024.7.23 c语言学习笔记
    复习:什么是指针?   也叫地址address,就是内存块的首位置,英文名叫painter。他是一个常量,指针不能被赋值,不能自增自减,例如:数组名就是内存块首地址,他就是一个指针常量。Inta=10,&a就是首地址,是指针常量;什么是指针变量?顾名思义,存放指针(地址)数据的变量,也叫地址变量。就......
  • 【C语言】自定义类型——联合和枚举
    目录一、联合体1.1联合体类型的声明1.2联合体的特点1.2.1特点11.2.2特点21.2.3特点31.3联合体的大小1.4相同成员的结构体和联合体的对比1.5使用联合体节省空间的例子1.6运用联合体判断大小端1.7利用联合体打印存储的字节内容二、枚举类型2.1枚举类型的......
  • C语言课程设计:图书管理系统【源码+文档】
    【文章序言】:很高兴你能来阅读,博客分享日常编程,希望自己向着优秀程序员前行!博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起......
  • 代码随想录 day33 斐波那契数 | 爬楼梯 |使用最小花费爬楼梯
    斐波那契数斐波那契数解题思路利用代码随想录给出的解题模板进行解题。先确定dp数组和dp下标的含义,之后需要确定遍历的顺序,接着我们通过枚举获得遍历的规矩,最后确定dq的初始值。知识点动态规划心得第一次做动态规划,主要是掌握基本的解题思路,了解一下到底是怎么解决问题的......
  • c语言的编译与调试
    1.GCC/G++gcc和g++是GNUCompilerCollection中的编译器,分别用于编译C和C++程序。它们的编译过程主要包括四个步骤:预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)。1.1编译过程预处理(Pre-Processing):gcc-Ehello.c-ohello.i对hello.c文件进行预处......