C++基于CMD命令行实现扫雷小游戏

本文实例为大家分享了C++基于CMD命令行实现扫雷小游戏的具体代码,供大家参考,具体内容如下

这个小游戏是笔者在大一C语言课程设计的时候写的,基于命令行,为了显得漂亮一些,特别加上了彩色特效。

注意:Win10系统须将命令行调为旧版命令行,否则有可能会显示乱码!

代码示例:

#include <stdio.h>  
#include <conio.h>  
#include <stdlib.h>  
#include <time.h>  
#include <stdlib.h>  
#include <windows.h>  
 
// 由于棋盘格与逻辑雷区格有一定差别,所以为了坐标能够相互映射,设置宏I,J,分别映射逻辑表的i,j。
#define I (i+2)
#define J (2*(j+1)+1)
 
/*字体颜色处理函数*/  
  
void SetColor(unsigned short ForeColor,unsigned short BackGroundColor){  
    HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);  
    SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));  
}  
  
/*游戏主程序*/  
  
void showmine();        //显示所有地雷  
void setmine(int x);  //布雷  
void printmine();       //打印所有地雷  
void countmine(int rowno, int colno);    //数雷算法  
//构建棋盘  
char row[16][80]={  
    {"----------Platform---------------------"},  
    {"------------------------------------------------------------------------"},  
    {"01|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"02|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"03|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"04|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"05|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"06|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"07|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"08|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"09|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"10|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"11|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"12|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"13|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
    {"14|\x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02 \x02"},  
};  
构建雷区//  
int mines[14][14]={             //雷区模拟图(01二值化,标记地雷)  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
};  
  
  
int mines_demo[14][14]={          //雷数统计图(用于显示周围雷总数)  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0},  
};  
  
//  
  
int countstep=0;  //已挖坑数目(计数器),用于判定玩家获胜
int n=5;  //布雷数(待输入)
/主函数开始///  
void main()  
{  
    int i=0,j=0;  
    int flag=1;  
    int temp=0;  
    char ch1;  
    SetColor(3,0);  
    printf("欢乐扫雷\n\n");  
    printf("w-上 s-下 a-左 d-右 q-挖雷\n\n");  
    SetColor(7,0);  
    printf("作者:PeterZheng\n");  
    printf("EagleEyes 工作室\n");  
    printf("EagleEyes.Inc\n\n");  
    getch();  
    system("cls");  
    printf("你想要布几颗雷?(1< mines <196)");  
    scanf("%d",&n);    
    system("cls");
    setmine(n);  
    row[I][J]='\x01';  
    system("cls");  
    showmine();  
    printf("\n\n");
    //按键消息处理核心代码
    while(flag)  
    {  
        ch1=getch();  
        if(ch1=='w'){  
            if(i==0){  
                system("cls");  
                showmine();  
                continue;  
            }else{  
                system("cls");  
                if(row[I][J]<'9' && row[I][J]>='0'){  //确认移动前的位置属于已被挖雷(在上一次光标移动时已经恢复数字,只是还没有showmine()而已)
                    i--;  //光标移动
                    if(row[I][J]<'9' && row[I][J]>='0'){  //确认移动后的位置已被挖雷
                        temp=row[I][J];  //用temp记录该位置原数字
                        row[I][J]='\x01';  //将该位置标记为选中
                        showmine();  //显示雷区图
                        row[I][J]=temp;  //将选中位置改回原数字
                        continue;  
                    }  
                    row[I][J]='\x01'; //如果不会被覆盖,则直接选中即可  
                    showmine();  //显示雷区图
                    continue;    
                }  
                //移动前的位置未被挖雷情况
                row[I][J]='\x02';  
                i--;  
                if(row[I][J]<'9' && row[I][J]>='0'){  
                    temp=row[I][J];  
                    row[I][J]='\x01';  
                    showmine();  
                    row[I][J]=temp;  
                    continue;  
                }  
                row[I][J]='\x01';  
                showmine();  
            }  
        }else if(ch1=='s'){  
            if(i==13){  
                system("cls");  
                showmine();  
                continue;  
            }else{  
                system("cls");  
                if(row[I][J]<'9' && row[I][J]>='0'){//防止当前位数字覆盖  
                    i++;  
                    if(row[I][J]<'9' && row[I][J]>='0'){ //防止下一位数字覆盖  
                        temp=row[I][J];  
                        row[I][J]='\x01';  
                        showmine();  
                        row[I][J]=temp;  
                        continue;  
                    }  
                    row[I][J]='\x01';  
                    showmine();  
                    continue;  
                }  
                row[I][J]='\x02';  
                i++;  
                if(row[I][J]<'9' && row[I][J]>='0'){  
                    temp=row[I][J];  
                    row[I][J]='\x01';  
                    showmine();  
                    row[I][J]=temp;  
                    continue;  
                }  
                row[I][J]='\x01';  
                showmine();  
            }  
        }else if (ch1=='a'){  
            if(j==0){  
                system("cls");
                if(row[I][J]<'9' && row[I][J]>='0'){  
                    temp=row[I][J];  
                    row[I][J]='\x01';  
                    showmine();  
                    row[I][J]=temp;  
                    continue;  
                } 
                showmine();  
                continue;  
            }else{  
                system("cls");  
                if(row[I][J]<'9' && row[I][J]>='0'){  
                    j--;  
                    if(row[I][J]<'9' && row[I][J]>='0'){  
                        temp=row[I][J];  
                        row[I][J]='\x01';  
                        showmine();  
                        row[I][J]=temp;  
                        continue;  
                    }  
                    row[I][J]='\x01';  
                    showmine();  
                    continue;  
                }  
                row[I][J]='\x02';  
                j--;  
                if(row[I][J]<'9' && row[I][J]>='0'){  
                    temp=row[I][J];  
                    row[I][J]='\x01';  
                    showmine();  
                    row[I][J]=temp;  
                    continue;  
                }  
                row[I][J]='\x01';  
                showmine();  
            }  
        }else if (ch1=='d'){  
            if(j==13){  
                system("cls");  
                showmine();  
                continue;  
            }else{  
                system("cls");  
                if(row[I][J]<'9' && row[I][J]>='0'){  
                    j++;  
                    if(row[I][J]<'9' && row[I][J]>='0'){  
                        temp=row[I][J];  
                        row[I][J]='\x01';  
                        showmine();  
                        row[I][J]=temp;  
                        continue;  
                    }  
                    row[I][J]='\x01';  
                    showmine();  
                    continue;  
                }  
                row[I][J]='\x02';  
                j++;  
                if(row[I][J]<'9' && row[I][J]>='0'){  
                    temp=row[I][J];  
                    row[I][J]='\x01';  
                    showmine();  
                    row[I][J]=temp;  
                    continue;  
                }  
                row[I][J]='\x01';  
                showmine();  
            }  
        }else if(ch1=='q'){ //挖雷消息识别&处理  
            system("cls");  
            if (mines[i][j]==1)  //如果踩雷
            {  
                printmine();  //打印全图雷区,游戏结束...
                printf("\n BOOM!\n\n");  
                flag=0;  
                getch();  
                fflush(stdin);  
                break; 
            }else{  
                //如果没有踩雷...标示本位地雷数目(从雷数统计图读取)
                if(i>0 && j>0 && row[I][J]=='\x01'){  
                    row[I][J]=(char)(mines_demo[i][j]+48);  
                    countstep++;
                }else if(i==0 && j>0 && row[I][J]=='\x01'){  
                    row[I][J]=(char)(mines_demo[i][j]+48); 
                    countstep++;
                }else if(i>0 && j==0 && row[I][J]=='\x01'){  
                    row[I][J]=(char)(mines_demo[i][j]+48); 
                    countstep++;
                }else if(i==0 && j==0 && row[I][J]=='\x01'){  
                    row[I][J]=(char)(mines_demo[i][j]+48);  
                    countstep++;
                }  
                if(mines_demo[i][j]==0 && i>0 && j>0 && i<13 && j<13){      //无雷地区自动展开  
                    if(mines_demo[i+1][j]==0 && row[I+1][J]=='\x02'){  
                        row[I+1][J]=(char)(mines_demo[i+1][j]+48);  
                        countstep++;
                    }  
                    if(mines_demo[i-1][j]==0 && row[I-1][J]=='\x02'){  
                        row[I-1][J]=(char)(mines_demo[i-1][j]+48);  
                        countstep++;
                    }  
                    if(mines_demo[i][j+1]==0 && row[I][2*(j+1+1)+1]=='\x02'){  
                        row[I][2*(j+1+1)+1]=(char)(mines_demo[i][j+1]+48);  
                        countstep++;
                    }  
                    if(mines_demo[i][j-1]==0 && row[I][2*(j-1+1)+1]=='\x02'){  
                        row[I][2*(j-1+1)+1]=(char)(mines_demo[i][j+1]+48);  
                        countstep++;
                    }  
                    if(mines_demo[i+1][j+1]==0 && row[I+1][2*(j+1+1)+1]=='\x02'){  
                        row[I+1][2*(j+1+1)+1]=(char)(mines_demo[i+1][j+1]+48);  
                        countstep++;
                    }  
                    if(mines_demo[i+1][j-1]==0 && row[I+1][2*(j-1+1)+1]=='\x02'){  
                        row[I+1][2*(j-1+1)+1]=(char)(mines_demo[i+1][j+1]+48);  
                        countstep++;
                    }  
                    if(mines_demo[i-1][j+1]==0 && row[I-1][2*(j+1+1)+1]=='\x02'){  
                        row[I-1][2*(j+1+1)+1]=(char)(mines_demo[i-1][j+1]+48);  
                        countstep++;
                    }  
                    if(mines_demo[i-1][j-1]==0 && row[I-1][2*(j-1+1)+1]=='\x02'){  
                        row[I-1][2*(j-1+1)+1]=(char)(mines_demo[i-1][j+1]+48);  
                        countstep++;
                    }  
                }  
                system("cls");  
                showmine();  
                if(countstep==196-n)  
                {  
                    printf("\nYou Win!\n\n");  
                    getch();  
                    flag=0;  
                    break;  
                }  
            }  
        }  
    }  
}  
  
主函数结束/  
  
//数雷算法开始//  
void countmine(int rowno, int colno)  
{  
    int count;  
    int i,j;  
    i=rowno;  
    j=colno;  
    mines_demo[i][j]=mines[i-1][j]+mines[i+1][j]+mines[i][j-1]+mines[i][j+1]+mines[i-1][j-1]+mines[i-1][j+1]+mines[i+1][j-1]+mines[i+1][j+1];    
    return;  
}  
/数雷算法结束  
void DebugMines()
{
    int i=0 , j=0;
    printf("\n\n");
    for (i = 0 ; i < 14 ; i++)
    {
        for (j=0;j<14;j++)
        {
            printf("%d ",mines[i][j]);
        }
        printf("\n");
    }
    printf("\n\n");
    for (i = 0 ; i < 14 ; i++)
    {
        for (j=0;j<14;j++)
        {
            printf("%d ",mines_demo[i][j]);
        }
        printf("\n");
    }
}
///棋盘显示///  
void showmine(){  
    int i=0,j=0;  
    for(i=0;i<16;i++){  
        for(j=0;j<30;j++){  
            if(row[i][j]=='\xf'){  
                SetColor(4,0);  
                printf("%c",row[i][j]);  
                SetColor(7,0);  
                continue;  
            }else if(row[i][j]<='8' && row[i][j]>='0' && j>2){  
                SetColor(2,0);  
                printf("%c",row[i][j]);  
                SetColor(7,0);  
                continue;  
            }  
            printf("%c",row[i][j]);  
        }  
        printf("\n");  
    }
 
}  
  
/随机布雷///  
void setmine(int x){  
    int i,j,k;  
    //初始化棋盘  
    for(i=0;i<14;i++){  
        for(j=0;j<14;j++){  
            mines[i][j]=0;  
        }  
    }  
    //设置随机种子  
    srand(time(0));  
    //随机布雷开始  
    for(k=1;k<=x;){  
        i=rand()%14;  
        j=rand()%14;  
        if(mines[i][j]!=1){  
            mines[i][j]=1;  
            k++;  
        }else{  
            continue;  
        }  
    }  
    //方格雷数计算开始
    for(i=0;i<14;i++){  
        for(j=0;j<14;j++){  
            if(i>0 && j>0 && i<13 && j<13){  
                countmine(i,j);  
            }else{ //预置方格雷数计算 
                //if(mines[i][j]!=1){  
                    if(i==0 && j!=0 && j!=13){  
                        mines_demo[0][j]=mines[0][j-1]+mines[1][j]+mines[0][j+1]+mines[1][j-1]+mines[1][j+1];  
                    }else if(j==0 && i!=0 && i!=13){  
                        mines_demo[i][0]=mines[i-1][0]+mines[i+1][0]+mines[i-1][1]+mines[i+1][1]+mines[i][1];  
                    }else if(i==0 && j==0){  
                        mines_demo[0][0]=mines[0][1]+mines[1][1]+mines[1][0];  
                    }else if(i==13 && j==13){  
                        mines_demo[13][13]=mines[12][13]+mines[12][12]+mines[13][12];  
                    }else if(i==0 && j==13){  
                        mines_demo[0][13]=mines[0][12]+mines[1][12]+mines[1][13];  
                    }else if(i==13 && j==0){  
                        mines_demo[13][0]=mines[12][0]+mines[12][1]+mines[13][1];  
                    }else if(i==13 && j!=0 && j!=13){
                        mines_demo[i][j] = mines[i][j-1]+mines[i][j+1]+mines[i-1][j-1]+mines[i-1][j]+mines[i-1][j+1];
                    }else if (j==13 && i!=0 && i!=13)
                    {
                        mines_demo[i][j] = mines[i+1][j]+mines[i-1][j]+mines[i-1][j-1]+mines[i][j-1]+mines[i+1][j-1];
                    }
                //}  
            }  
        }  
    }  
    return;  
}  
  
/打印雷区(失败时)///  
void printmine()  
{  
    int i,j;  
    system("cls");  
    for(i=0;i<14;i++)  
    {  
        for(j=0;j<14;j++){  
            if( mines[i][j]==1){  
                row[I][J]='\xf';  
            }else{  
                row[I][J]='\x02';  
            }  
        }  
  
    }  
    showmine();  
    return;  
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++实现简单的扫雷游戏(控制台版)

    C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游戏时间.重新开一局等等的功能. 玩家输入坐标的方式来翻开方块只适用于小型的"雷区",若"雷区"大了,用坐标会变得很不方便. 代码片段扫雷V1.1 #include<stdio.h> #include<Windows.h> #define YELL

  • C++扫雷游戏的简单制作

    本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下 #ifndef SAOLEI_H #define SAOLEI_H class Block { friend class Saoleigame; public: Block(); bool isShown(); void setnum(int); int getnum(); bool isbomb(); protected: int num; bool flag_show; int x; int y; }; class

  • C++实现扫雷游戏(控制台不闪屏版)

    之前写了一个C++ 的控制台扫雷小游戏,但由于过度使用system("cls")刷屏,导致闪屏,因此重写了一个改善的不闪屏版本,并把逻辑重新捋了一遍. map.h #ifndef MAP_H_ #define MAP_H_ #define MAX_WID 18 #define MAX_LEN 32 #define UP_EDGE 1 //上边界 #define LEFT_EDGE 1 //左边界 #define RIGHT_EDGE _len //右边界 #define DOWN_ED

  • C++实现扫雷小游戏(控制台版)

    本文为大家分享了C++实现扫雷小游戏的具体代码,供大家参考,具体内容如下 程序功能: 提供三种模式:初级.中级.高级 操作模式:wsad控制光标移动,空格键打开方块 提供扫雷地图的类 map.h #ifndef MAP_H_ #define MAP_H_ #define MAX_LENGTH 32 //可以提供的地图最大长度 #define MAX_WIDTH 18 //可以提供的地图最大宽度 #define UP_EDGE 1 //上边界 #define DOWN_EDGE _wid //下边

  • C++实现一个扫雷小游戏

    本文实例为大家分享了C++实现扫雷小游戏的具体代码,供大家参考,具体内容如下 目前的版本是0.98版本,可以提出增加新功能意见哦 代码如下: #include<bits/stdc++.h> #include<windows.h> using namespace std; long long int c,dev,m,k,cnt,d,e,jie=10,z,abc,n,b[1000][1000],a[1000][1000],cc,cd,ce,def; //c是随机行,k是随机列 bool

  • C++学习心得之扫雷游戏

    本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下 一.序言 创建一个9*9有10个雷的扫雷游戏 文章的顺序是按照我当时的编程顺序写的,顺便写下我当初的一点思路,总的代码在文章最后,前面的都是分散的函数,有需要的朋友直接复制最后的 二.创建 创建一个头文件,一个放游戏的程序,一个放运行测试的程序 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdlib.h>//生成随机数 #include<stdio.h> #inc

  • C++实现简单扫雷游戏

    扫雷是一个经典的电脑小游戏,用C++来编一下,效果自己试一下 #include<stdio.h> #include<Windows.h> #define YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY #define CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY #define ORANGE FOREGROUND_RED |

  • C++实现扫雷经典小游戏

    用C++复现经典扫雷,供大家参考,具体内容如下 主要是dfs实现打开一片的操作,数字带有颜色,很真实. windows扫雷中鼠标左右键同时按也实现了,即试探. 先上图,详见下面代码: 代码中有详细注释,编译无任何错误警告. Ps.有bug请评论指出,谢谢啦~ 另外我觉得代码比较臃肿,有什么可以优化的也请提出~ #include<cstdio> #include<cstring> #include<algorithm> #include<conio.h> #i

  • 利用c++和easyx图形库做一个低配版扫雷游戏

    游戏界面 由于这个游戏是我抱着玩一玩的心态做出来的,所以没有过多的去设计界面,也没有去找游戏的资源(图片.游戏音效等).仅使用了不同颜色的方块来表示游戏中方块的状态和种类.(绿色为初始状态(未翻转的状态),黄色为翻转后的背景颜色,蓝色表示已插旗的方块,红色代表地雷) 图1 游戏主菜单界面 图二 模式一的游戏界面(20*20 40个雷) 图三 模式二的游戏界面(10*10 20个雷) 图四 游戏成功界面 图五 游戏失败界面 2.全部代码 #include<graphics.h> #include

  • C++代码实现扫雷游戏

    前言 提示:本文是基于easyX图形库实现的,还有部分功能可以添加,仅适合新手参考. 提示:以下是本篇文章正文内容,下面案例可供参考 一.扫雷游戏模式 在确定大小的矩形雷区中随机布置一定数量的地雷,玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷. 游戏的基本操作包括左键单击和右键单击.其中左键用于打开安全的格子,推进游戏进度:右键用于标记地雷,以辅助判断. 左键单击:在判断出不是雷的方块上按下左键,可以打开该方块.如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个

随机推荐