扫雷思想及主函数

摘要:
摆雷是以随机数放入的,下面会附上代码,详见代码5.扫雷。详细说明一下扫雷的思想:5.1.先定义intwin=0当我们向控制台输入坐标后,先判断输入坐标是否合法,不合法继续执行5.1,合法执行5.2。

1.建雷盘(9*9雷盘)

2.初始化雷盘,雷盘1每个位置初始化为字符0,雷盘2每个位置初始化为字符*。

3.为了检验,输出我们初始化好的雷盘。

4.向棋盘放雷,这块我们可以以雷数设计难度。摆雷是以随机数放入的,下面会附上代码,详见代码

5.扫雷。

详细说明一下扫雷的思想:

5.1.先定义int win = 0(用来判断结束的条件)当我们向控制台输入坐标后,先判断输入坐标是否合法,不合法继续执行5.1,合法执行5.2。

5.2.判断输入坐标是否是雷?如果是雷,直接输出“菜鸟,你踩雷了”,否则,执行5.3。

5.3.统计该位置周围八个的雷数,如果雷数不为0,将雷数转换成字符赋给该位置,否则执行5.4。

5.4.将上述坐标的周围八个坐标放入一个二维数组,递归判断,将周围不是雷全部置空,周围有雷的置为雷数(字符型)操作完之后执行5.5(详见下面代码)

5.5一遍输入后输出本次雷盘1,以便下次输入,执行5.6

5.6标记雷数,(我们用字符m表示该位置有雷)标记一次输出一次雷盘1,执行5.7(详见下面代码)

5.7转到5.1继续执行,结束条件就是(雷盘上m和*的个数之和小于等于雷数并且win == 9 *9 - 雷数),然后输出挑战成功

test.c

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include "game.h"#include <time.h>#include <stdlib.h>
voidgame(){
    char set1 = '0';
    char set2 = '*';
    //棋盘
    char Mine[Rows][Cols] = { 0};
    //新建棋盘
    char Show[Rows][Cols] = { 0};
    //初始化棋盘
Init(Mine, Rows, Cols,set1);
    Init(Show, Rows, Cols,set2);
    //展示
Display(Mine, Row, Col);
    Display(Show, Row, Col);
    //放雷
    printf("请选择难度:>
");
    printf("1.简单——10
");
    printf("2.一般——20
");
    printf("3.困难——30
");
    int input = 0;
    int countMine = 0;
    scanf("%d", &input);
    switch(input){
    case 1:
        countMine =EASY_COUNT;
        PutMine(Mine, Row, Col, countMine);
        //检查Mine
        printf("检查
");
        ShowMine(Mine, Row, Col);
        //扫雷
ClearMine(Mine,Show, Row, Col, countMine);
        break;
    case 2:
        countMine =GENERAL_COUNT;
        PutMine(Mine, Row, Col, countMine);
        //检查Mine
        printf("检查
");
        ShowMine(Mine, Row, Col);
        //扫雷
ClearMine(Mine, Show, Row, Col, countMine);
        break;
    case 3:
        countMine =HARD_COUNT;
        PutMine(Mine, Row, Col, countMine);
        //检查Mine
        printf("检查
");
        ShowMine(Mine, Row, Col);
        //扫雷
ClearMine(Mine, Show, Row, Col, countMine);
        break;
    default:
        printf("请重新输入:>");
    }
}
voidmenu(){
    printf("1..开始游戏
");
    printf("0..结束
");
}
voidtest(){
    
    int input = 1;
    while(input){
        printf("请选择:
");
        menu();
        scanf("%d", &input);
        switch(input){
            case 1:
                game();
                break;
            case 0:
                break;
            default:
                printf("请重新输入");
                break;
            }
        }
}
intmain(){
    srand((unsigned int)time(0));
    test();
    system("pause");
    return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS#include "game.h"#include<string.h>#include <time.h>#include <stdio.h>#include <math.h>#include <stdlib.h>
//初始化
void Init(char arr[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++){
            arr[i][j] = set;
        }
    }
    printf("----------------------------
");

}
//展示
void Display(char arr[Rows][Cols], int row, intcol){
    int i = 0;
    int j = 0;
    for (int k = 0; k <= col; k++){
        printf("%d ", k);
    }
    printf("");
    for (i = 1; i <= row; i++){
        printf("%d ", i);
        for (j = 1; j <= col; j++){
            printf("%c ", arr[i][j]);
        }
        printf("");
    }
    printf("----------------------------
");
}
//摆雷
void PutMine(char mine[Rows][Cols], int row, int col,intcount){
    int x = 0;
    int y = 0;
    while (count >0){
        x = rand() % row + 1;
        y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[x][y] = 1 + '0';
            count--;
        }
    }
}
//检查
void ShowMine(char arr[Rows][Cols], int row, intcol){
    int i = 0;
    int j = 0;
    for (int k = 0; k <= Col; k++){
        printf("%d ", k);
    }
    printf("");
    for (i = 1; i <= row; i++){
        printf("%d ", i);
        for (j = 1; j <= col; j++){
            printf("%c ", arr[i][j]);
        }
        printf("");
    }
}

//获取x,y 坐标周围八个格子的雷数
int getMine(char mine[Rows][Cols], int x, inty){

    return mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] - 8 * '0';
    
}


void OtherIsHaveMine(char mine[Rows][Cols], char show[Rows][Cols], int arr[8][2], int row, intcol){
    for (int i = 0; i <8; i++){
        int x = arr[i][0];
        int y = arr[i][1];
        if (x>0 && x <= row&&y > 0 && y <= col&&(show[x][y] == '*')){
            if (getMine(mine, x, y) == 0){
                show[x][y] = ' ';
                int ch[8][2] = { x - 1, y, x - 1, y - 1,
                    x, y - 1, x + 1, y - 1,
                    x + 1, y, x + 1, y + 1,
                    x, y + 1, x - 1, y + 1};
                OtherIsHaveMine(mine, show, ch, row, col);
            }
            else{
                show[x][y] = getMine(mine, x, y) + '0';
            }
        }
    }
}
//是否要标记雷:   1代表标记雷(用字符m表示有雷)    0代表不标记继续扫雷
void SignMine(char show[Rows][Cols], int row, intcol){
    int input = 1;
    int x = 0;
    int y = 0;
    while(input){
        printf("是否标记雷
");
        printf("1.标记
");
        printf("0.不标记
");
        scanf("%d", &input);
        switch(input){
            case 0:
                printf("继续扫雷:
");
                break;
            case 1:
                while (1){
                    printf("请输入有雷的坐标:>
");
                    scanf("%d", &x);
                    scanf("%d", &y);
                    if ((x > 0 && x <= row) && (y > 0 && y <= col) && show[x][y] == '*'){
                        show[x][y] = 'm';
                        system("cls");
                        ShowMine(show, row, col);
                        break;
                    }
                    else{
                        printf("请输入正确的坐标
");
                    }
                }
                break;
            default:
                printf("请正确输入;>
");

        }
    }
    
}
//统计标记雷的个数,如果小于等于雷数,返回1;大于雷数返回0
int TotalSignMine(char show[Rows][Cols], int row, int col, intcount){
    int SignMineCount = 0;
    for (int i = 1; i <= row; i++){
        for (int j = 1; j <= col; j++){
            if (show[i][j] == 'm'){
                SignMineCount++;
            }
        }
    }
    if (SignMineCount >count)
        return 0;
    return 1;
}

//扫雷
void ClearMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col, intcount){
    int x = 0;
    int y = 0;
    while (1){
        int win = 0;
        printf("请输入坐标:
");
        scanf("%d", &x);
        scanf("%d", &y);
        if ((x > 0 && x <= row) && (y > 0 && y <= col)&&show[x][y]=='*'){
            //判断是否有雷
            if(mine[x][y] == '0'){
                //没有雷统计该格子周围八个格子的雷数
                show[x][y] = getMine(mine, x, y) + '0';
                //如果雷数等于0的话,递归判断其周围格子
                if (show[x][y] == '0'){
                    show[x][y] = ' ';
                    //递归判断周围格子
                    int arr[8][2] = { x - 1, y, x - 1, y - 1,
                        x, y - 1, x + 1, y - 1,
                        x + 1, y, x + 1, y + 1,
                        x, y + 1, x - 1, y + 1};
                    OtherIsHaveMine(mine, show, arr, row, col);
                }
                for (int i = 1; i <= row; i++){
                    for (int j = 1; j <= col; j++){
                        //if (show[i][j] == ' '||(show[i][j]-'0' <9&&show[i][j]-'0'>0))
                        if (show[i][j] != '*' || show[i][j] != 'm' && show[i][j] != '*'){
                            win++;
                        }
                    }
                }
                //标记雷数大于真正的雷数时,返回0
                if(TotalSignMine(show, row, col, count)){
                    if (win == row*col -count){
                        printf("挑战成功sayoulala
");
                        ShowMine(mine, row, col);
                        break;
                    }
                }
                else{
                    printf("你标记的雷有可能不是雷,请你在标记的地方找出不是雷的位置");
                }
                system("cls");
                ShowMine(show, row, col);
                //是否标记雷
SignMine(show, row, col);

            }
            else{
                printf("很遗憾你被炸死了...........菜鸡
");
                ShowMine(mine, row, col);
                break;
            }
        }
        else{
            printf("坐标输入不正确,");
        }
    }
}

game.h

#ifndef _GAME_H_
#define Row 9
#define Col 9
#define Rows Row+2
#define Cols Col+2
#define EASY_COUNT 10
#define GENERAL_COUNT 20
#define HARD_COUNT 30

//初始化
void Init(char arr[Rows][Cols], int rows, int cols,charSet);
//展示
void Display(char arr[Rows][Cols], int row, intcol);
//摆雷
void PutMine(char arr[Rows][Cols], int row, int col, intcount);
//检查
void ShowMine(char arr[Rows][Cols], int row, intcol);
//扫雷
void ClearMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col, intcount);
//是否标记雷
void SignMine(char show[Rows][Cols], int row, intcol);
//周围没雷置空
void OtherIsHaveMine(char mine[Rows][Cols], char show[Rows][Cols], int arr[8][2], int row, intcol);
//统计标记雷的个数,如果小于等于雷数,返回1;大于雷数返回0
int TotalSignMine(char show[Rows][Cols], int row, int col, intcount);
#endif

在控制台操作的扫雷代码就是上面所写的,我试着玩了几局没有发现错误,如果被那位读者发现错误,请在评论区指出,我会第一时间修改,谢谢!

免责声明:文章转载自《扫雷思想及主函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记webSocket+jwt实现方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

scanf函数的使用

函数原型编辑 1 intscanf( constchar*format, ... ); scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。 其调用格式为: scanf("<格式化字符串>",<地址表>); 函数 scanf() 是从标准输入流 stdio 中读内容的通用子程序,可以读入全部固...

IPTABLES详解(10):IPTABLES自定义链

前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。 iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,...

VueJS v-model 双向绑定

原理是包含了两个操作 1.v-bind绑定了value属性 2.v-on 给当前元素绑定input事件 简单示例 <input type="text" v-model="str"> {{str}} ---- str:"asd" 延伸: 下面通过js更改str属性,也可以实现input value的改变,但是value改变不会...

Yacc 与 Lex 快速入门

源地址: http://www.ibm.com/developerworks/cn/linux/sdk/lex/index.html Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler。 让我们从 Lex 开始吧。 Lex Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模...

EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C

     首先介绍下这3个文件的关系:可以说INPUT1.C的函数粒度最大,它的函数getdata()就完成了整个INPUT文件数据的读入,该函数又调用了INPUT2.C中的部分函数,INPUT2.C文件中的函数分为两类,一类是解析INPUT文件的函数;另一类是工具函数,包括将节点、管段数据存入哈希表中,构建哈希索引、字符串的匹配,从哈希表中查找数据等,该...

(转载)Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议

转自:http://www.cnblogs.com/jicheng1014/archive/2010/01/28/1658793.html 这因为有个任务涉及到使用telnet 来连接远端的路由器,获取信息,之后进行处理. 所以需要写一个自动telnet登录到远端,之后获取信息进行处理的程序. 自己C++ 一塌糊涂,所以几乎最开始就没打算用C++或者C写...