今天给大家分享的是自己很早时期写的扫雷游戏。该扫雷游戏功能大部分已经实现,但缺少一些优化,由于本人一直没有时间进行修改,所以就直接分享思路给大家,至于优化问题就留给大家自己补充吧!
下面是源码:
一.头文件test.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 9 //行数
#define COL 9 //列数
#define EASY_MINE 10
#define ROWS ROW + 2
#define COLS COL + 2
void menu(); //菜单
void game(); //游戏地图
//初始化
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 mine[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);
二.源文件test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{
int i, j; //i控制行数,j控制列数
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, j; //i控制行数,j控制列数
printf("------------------------------------------------扫雷游戏------------------------------------------------\n");
for (i = 0; i <= col; i++)
{
printf("%d\t", i);
}
printf("\n\n");
for (i = 1; i <= row; i++)
{
printf("%d\t", i);
for (j = 1; j <= col; j++)
{
printf("%c\t", Board[i][j]);
}
printf("\n\n");
}
printf("------------------------------------------------扫雷游戏------------------------------------------------\n");
}
void Setmine(char mine[ROWS][COLS], int row, int col)
{
//布置十个雷
int count = 10; //雷的数量
while (count > 0 && count < 11)
{
//生成随机的下标
int x = rand() % row + 1; //行数的下标
int y = rand() % col + 1; //列数的下标
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
//1.首先玩家需要填入需要排查的坐标
//2.检查坐标是不是雷
/*
* 如果是雷 则提醒玩家被雷炸死 游戏结束
* 如果不是雷 则统计该玩家输入的坐标周围有几个雷 并存储排查雷的信息到show数组里 游戏继续
*/
int x, y;
int Find = 0; //记录已经找到的不是雷的个数
while (Find < row * col - EASY_MINE)
{
printf("请输入坐标(先输入行后输入列):");
scanf("%d%d", &x, &y);
if (x < 1 || x > row || y < 1 || y > col)
{
printf("您输入的信息有误,请重新输入!\n");
}
else
{
if (mine[x][y] == '1')
{
printf("很遗憾,您被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
//查找输入坐标的周围8格内是否含有雷
int count = GetMineCount(mine, x, y);
show[x][y] = count + 48;
//显示排查信息
DisplayBoard(show, ROW, COL);
Find++;
}
}
if (Find == row * col - EASY_MINE)
{
printf("\n\n");
printf("*******************************************************\n");
printf("\n");
printf("恭喜您找到了全部雷的位置,您赢了!!\n");
printf("\n");
printf("*******************************************************\n");
printf("\n\n");
printf("复盘:\n");
DisplayBoard(mine, ROW, COL);
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]) - 8 * 48;
}
三.源文件main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
void menu() //菜单
{
printf("*********************************************\n");
printf("*********************************************\n");
printf("*********** 扫雷 ***************\n");
printf("*********** 1. 开始游戏 ***************\n");
printf("*********** 0. 退出游戏 ***************\n");
printf("*********************************************\n");
printf("*********************************************\n");
}
void game() //游戏地图
{
char mine[ROWS][COLS]; //存放布置好的雷的信息 初始化为0
char show[ROWS][COLS]; //向玩家展示的棋盘,存放排查出的雷的信息 初始化为‘*’
//初始化棋盘
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);
}
int main()
{
srand((unsigned int)time(NULL)); //为了让编译器不报警告,建议加上unsigned int进行强制转换
int choice; //储存游戏开始的选择
do {
menu();
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("好的,游戏马上开始\n");
Sleep(2500);
game();
break;
case 0:
printf("好的,欢迎下次游玩\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (choice != 0); //选1为真,则继续循环,重新选择;选0则直接跳出do while循环;选其他的同样重新选择
return 0;
}
初始C语言系列可能要先暂缓一下了,等我忙完火速更新!!!