第一次尝试写一个扫雷游戏,但是不完全版本

这是第一次尝试去自己写一个扫雷游戏,虽然它没有达到我自己所理想的一个预期,我想要的是它在展开的时候,可以展开周围一片的,但是这个展开到哪里的判定逻辑,我暂时还没有想出来,所以目前只能展开到以扫雷点为中心的3*3的范围之内,如图,这是第一次玩的截图

下面是代码

头文件代码:

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


void game(void);//游戏主体函数

void put_qipan(char** game, int wide); //输出棋盘函数

void chushiqipan(char** qipan, int wide, char set);//初始化棋盘的函数

void produce_lei(char** game, int wide, int lei_number);//产生雷的函数

void find_zhouwei(char** game, char** show, int x, int y, int* sum, int wide);//用于展开周围的不是雷的点

int find_lei(char** game, int x, int y);//找出雷的个数的函数

void intput_lei(char** game, char** show, int wide, int lei_number); //用户输入坐标找雷的函数

int nandu_menu();//选择难度的函数

void chaqizi(char** game, char** show, int wide);//用去插旗子的函数
 

源文件代码:

game.c的代码:

#include"game.h"

void game(void) {
    int wide = 11;
    int lei_number = 10;
    int nandu = nandu_menu();
    switch (nandu) {
    case 1: {
        wide = 11;
        lei_number = 10;
        break;
    }
    case 2: {
        wide = 17;
        lei_number = 40;
        break;
    }
    case 3: {
        wide = 27;
        lei_number = 99;
        break;
    }
    }
    srand(time);
    //生成游戏棋盘
    char** game = (char**)malloc(wide * sizeof(char*));
    for (int i = 0;i < wide;i++) {
        game[i] = (char*)malloc(wide * sizeof(char));
    }
    chushiqipan(game, wide, '0');//初始化游戏棋盘
    //生成展示棋盘
    char** show = (char**)malloc(wide * sizeof(char*));
    for (int i = 0;i < wide;i++) {
        show[i] = (char*)malloc(wide * sizeof(char));
    }
    chushiqipan(show, wide, '*');//初始化展示棋盘

    produce_lei(game, wide, lei_number);//产生给定数量的雷

    put_qipan(show, wide);

    intput_lei(game, show, wide, lei_number);//用户输入函数
}

//难度菜单
int nandu_menu() {
    int nandu = 0;
    while (nandu < 1 || nandu > 3){
        printf("**********************\n");
        printf("*请输如你想选择的难度*\n");
        printf("****输入 1 简单模式***\n");
        printf("****输入 2 普通模式***\n");
        printf("****输入 3 困难模式***\n");
        printf("**********************\n");
        printf("请输入:>");
        scanf("%d", &nandu);
        if (nandu < 1 || nandu > 3) {
            printf("输入错误,请重新输入\n");
        }
    } 
    system("cls");
    return nandu;
}
//用户输入排雷坐标函数
void intput_lei(char** game, char** show, int wide, int lei_number) {

    int sum_lei = 0;
    int* sum = &sum_lei;

    while (sum_lei < wide * wide - 1) {
        int x = 0;
        int y = 0;
        int choice_chaqi = 1;
        do {
            printf("****是否要进行插旗****\n");
            printf("***输入 1 进行插旗****\n");
            printf("***输入 0 进行排雷****\n");
            printf("请输入:>");
            scanf("%d", &choice_chaqi);
            if (choice_chaqi > 1 || choice_chaqi < 0) {
                printf("输入错误,请重新输入\n");
            }
            else if (choice_chaqi == 1) {
                chaqizi(game, show, wide);
                system("cls");
                put_qipan(show,wide);
                }
        } while (choice_chaqi);
        printf("请输入你想要排雷点的坐标:>");
        scanf("%d %d", &x, &y);
        if (x < 1 || x > wide - 2 || y < 1 || y > wide - 2) {
            printf("输入越界,请重新输入\n");
        }
        else if (show[x][y] != '*'&&show[x][y]!='&') {
            printf("此处已经排过了,请重新输入\n");
        }
        else if (game[x][y] == '1') {
            system("cls");
            printf("您踩雷了!游戏结束\n");
            put_qipan(game, wide);
            break;
        }
        else {
            system("cls");
            find_zhouwei(game,show, x, y, sum, wide);
            put_qipan(show, wide);
        }
    }
    
}
//用于插旗子的函数
void chaqizi(char** game, char** show,int wide) {
    int x = 0;
    int y = 0;
    int flag = 1;
    while (flag) {
        printf("请输入你想要插旗子的坐标:>");
        scanf("%d %d", &x, &y);
        if (x < 1 || x > wide - 2 || y < 1 || y > wide - 2) {
            printf("输入越界,请重新输入\n");
        }
        else if (show[x][y] !='*') {
            printf("此处不可插旗子,请重新输入\n");
        }
        else{
            show[x][y] = '&';
            flag = 0;
        }
    }
}
//用于展开周围的不是雷的点
void find_zhouwei(char** game, char** show, int x, int y, int* sum, int wide) {
    for (int i = x - 1;i <= x + 1; i++) {
        if (i <= 0 || i >= wide - 1) {
            continue;
        }
        for (int j = y - 1;j <= y + 1; j++) {
            if (j <= 0 || j >= wide - 1) {
                continue;
            }
            if (game[i][j] != '1') {
                int lei_number = find_lei(game, i, j);
                show[i][j] = '0' + lei_number;
                (*sum)++;
                
            }
        }
    }
}
//给出周围有几个雷的函数
int find_lei(char** game, int x, int y) {
    int lei_number = 0;
    for (int i = x - 1;i <= x + 1;i++) {
        for (int j = y - 1;j <= y + 1;j++) {
            lei_number += game[i][j] - '0';
        }
    }
    return lei_number;
}
//产生雷的函数
void produce_lei(char** game, int wide, int lei_number) {
    while (lei_number) {
        int x = rand( ) % (wide - 3) + 1;
        int y = rand( ) % (wide - 3) + 1;
        if (game[x][y] != '1') {
            game[x][y] = '1';
            lei_number--;
        }
    }
}
//初始化矩阵的函数
void chushiqipan(char **qipan,int wide,char set) {

    for (int i = 0;i < wide;i++) {
        for (int j = 0;j < wide;j++) {
            qipan[i][j] = set;
        }
    }

}
//输出矩阵的函数
void put_qipan(char **game,int wide) {
    //以下为示例输出
    printf("***三月三扫雷小游戏***\n");
    for (int i = 0;i < wide-1;i++) {
        printf("%2d", i);
    }
    printf("\n");
    for (int i = 1;i < wide-1;i++) {
        printf("%2d", i);
        for (int j = 1;j < wide-1;j++) {
            printf("%2c", game[i][j]);
        }
        printf("\n");
    }
    //以上为示例输出    
}

test.c的代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu(void);//菜单函数
int main() {
    int is_play = 1;
    while(is_play){
        menu();
        scanf("%d", &is_play);
        if (is_play < 0 || is_play > 1) {
            printf("输入错误,请重新输入:>");
            scanf("%d", &is_play);
        }
        else if (is_play == 1) {
            //system("cls");
            game();
        }
    } 
    return 0;
}
void menu(void) {
    printf("**********************\n");
    printf("***三月三款扫雷游戏***\n");
    printf("****输入 1 开始游戏***\n");
    printf("****输入 0 结束游戏***\n");
    printf("**********************\n");
    printf("请输入:>");
}

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月三ovo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值