栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言实现扫雷游戏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言实现扫雷游戏

 相信大家都玩过扫雷吧?电脑游戏规则:在一块9*9的网格中,左键翻开这一格,右键标记地雷,双击左键(或者左右键一起点)可以看到这个数字的可点击范围,你点出了一个数字,是1,就说明它周围的8的格子里有1个雷,是2就有两个雷,是3就有三个雷···以此类推。如果你把数字周围的雷全扫出后还有空格,不必再一格一格翻开,直接双击左键就可以了。但如果你标记错了雷,那就会"boom!"一切重新开始。

  1. 初始化棋盘

  2. 显示棋盘

  3. 布置雷区

  4. 统计当前坐标周围雷数

  5. 排雷

  6. 第一次排雷绝对安全

  7. 判断输赢

 这是我game.h里面的代码:

#pragma once
#include
#include
#include
#ifndef __GAME_H__//#ifndef A_H意思是"if not define a.h"  如果不存在a.h
#define __GAME_H__//引入a.h

#include
#include
#include

//实际的行列(打印出来的棋盘)
#define ROW 9
#define COL 9
//设计时的行列(比实际的多两行以防越界,多出来的两行、列不打印)
#define ROWS ROW+2
#define COLS COL+2
//设置的雷数目为10
#define minenum 10
void game();
void Init_board(char board[ROWS][COLS], int rows, int cols, char set);//初始化两个棋盘
void Display_board(char board[ROWS][COLS], int row, int col);//显示棋盘
void Set_mine(char real_board[ROWS][COLS], int row, int col);//布置雷区
int Count_mine(char real_board[ROWS][COLS], int x, int y);//统计当前坐标周围的雷数
void Find_mine(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col);//排雷
void Fsafe(char board[ROWS][COLS], int x, int y);//第一次排雷绝对安全
void Unfold(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col, int x, int y);//没雷展开
int Iswin(char board[ROWS][COLS], int row, int col);//判断输赢

#endif//否则不需要引入c
//头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 

这是我game.c里面的代码:

 

#define _CRT_SECURE_NO_WARNINGS 
#include "game.h"

void Init_board(char board[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++)
        {
            board[i][j] = set;
        }
    }
}

void Display_board(char board[ROWS][COLS], int row, int col)//显示棋盘(传不同的参可以展示不同的键盘)
{
    int i = 0;
    int j = 0;
    for (i = 0; i <= col; i++)
    {
        printf("%d ", i);//设置列标以便用户使用
    }
    printf("n");
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);//设置行标
        for (j = 1; j <= col; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("n");
    }
}

void Set_mine(char real_board[ROWS][COLS], int row, int col)//布置雷区
{
    int x = 0;
    int y = 0;
    int count = minenum;
    while (count)
    {
        x = rand() % row + 1;
        y = rand() % col + 1;
        if (real_board[x][y] == '0')
        {
            real_board[x][y] = '1';
            count--;
        }
    }
}

int Count_mine(char real_board[ROWS][COLS], int x, int y)//统计mine数组中x,y坐标周围有几个雷
{
    return real_board[x - 1][y - 1] +
        real_board[x - 1][y] + 
        real_board[x - 1][y + 1] +
        real_board[x][y - 1] +
        real_board[x][y + 1] +
        real_board[x + 1][y - 1] + real_board[x + 1][y] + real_board[x + 1][y + 1]
        - 8 * '0';
}

void Fsafe(char real_board[ROWS][COLS], int x, int y)//第一次排雷很安全
{
    int i = 0;
    int j = 0;
    if (real_board[x][y] == '1')
    {
        i = rand() % 9 + 1;
        j = rand() % 9 + 1;
        if (real_board[i][j] == '0')
        {
            real_board[i][j] = '1';
            real_board[x][y] = '0';
        }
    }
}

int Iswin(char board[ROWS][COLS], int row, int col)//判断是否排完雷赢了
{
    int i = 0;
    int j = 0;
    int count = 0;
    for (i = 1; i <= row; i++)
    {
        for (j = 1; j <= col; j++)
        {
            if (board[i][j] == '*')//计算剩余雷的个数
            {
                count++;
            }
        }
    }
    return count;
}

void Unfold(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col, int x, int y)//没雷展开
{
    int i = 0;
    int j = 0;
    if (Count_mine(real_board, x, y) == 0)
    {
        play_board[x][y] = '0';
        for (i = -1; i <= 1; i++)
        {
            for (j = -1; j <= 1; j++)
            {
                if (x + i >= 1 && x + i <= row && y + j >= 1 && y + j <= col && (i != 0 || j != 0))
                {
                    if (play_board[x + i][y + j] != '0')
                    {
                        Unfold(play_board, real_board, row, col, x + i, y + j);
                    }
                }
            }
        }
    }
    else
    {
        play_board[x][y] = Count_mine(real_board, x, y) + '0';
    }
}

void Find_mine(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col)//排雷
{
    int x = 0;
    int y = 0;
    int ret = 0;
    int count = 0;//排查次数
    while (Iswin(play_board, row, col) != minenum)
    {
        printf("请输入你要排查的坐标:n");
        scanf("%d%d", &x, &y);
        if (x<1 || x>row || y<1 || y>col)
        {
            printf("输入坐标超出范围,请重新输入:n");
        }
        else
        {

            if (real_board[x][y] == '1')
            {
                if (count == 0)
                {
                    Fsafe(real_board, x, y);
                    Unfold(play_board, real_board, row, col, x, y);
                    Display_board(play_board, row, col);
                    count++;
                }
                else
                {
                    printf("你被炸死了,游戏结束n");
                    Display_board(real_board, row, col);
                    count++;
                    printf("一共排查了%d次n", count);
                    break;
                }
            }
            else
            {
                Unfold(play_board, real_board, row, col, x, y);
                Display_board(play_board, row, col);
                count++;
            }
        }
    }
    if (Iswin(play_board, row, col) == minenum)
    {
        printf("恭喜你,扫雷成功!!!n");
        printf("一共排查了%d次n", count);
        Display_board(real_board, row, col);
    }
}

void game()
{
    char play_board[ROWS][COLS] = { 0 };
    char real_board[ROWS][COLS] = { 0 };
    Init_board(play_board, ROWS, COLS, '*');
    Init_board(real_board, ROWS, COLS, '0');
    Display_board(play_board, ROW, COL);
    Set_mine(real_board, ROW, COL);
    Find_mine(play_board, real_board, ROW, COL);
}

这是我test.c文件里的代码:

#define _CRT_SECURE_NO_WARNINGS 
#include "game.h"
void menu()
{
	printf("************************************************n");
	printf("*********    扫雷游戏***************************n");
	printf("************  1. 开始 **************************n");
	printf("***********   0. 退出 **************************n");
	printf("************************************************n");

}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//默认情况下生成一个随机数,这个随机数来自系统时钟
	do
	{
		menu();
		printf("请输入你的选择:n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏已退出n");
			break;
		default:
			printf("输入错误,请重新输入n");
			break;
		}
	} while (input);
}

代码就写完了,最后到了最激动人心的时刻我们来实现这个游戏:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913347.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号