这个小游戏是笔者在大一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;
}

C++扫雷小游戏(基于CMD命令行)的更多相关文章

  1. python 控制 cmd 命令行颜色

    基于win7 + python3.4 import ctypes import sys '''Windows CMD命令行颜色''' # 句柄号 STD_INPUT_HANDLE = -10 STD_ ...

  2. [Java] cmd命令行如何切换目录

    cmd.exe是微软Windows系统基于WINDOWS上的命令解释程序,类似于微软的DOS操作系统.cmd.exe是一个32位的命令行程序,运行在Windows NT/2000/XP/2003/vi ...

  3. Node.js(window)基础(1)——用cmd命令行访问某一文件夹下的js文件

    一.安装,从官网上下载安装,安装基本一直点击下一步就行.注意:node.js基于Python的,安装node.js之前电脑上要安装Python,最好是Python2.7或2.6. 二.cmd进入命令行 ...

  4. Windows 如何在cmd命令行中查看、修改、删除与添加环境变量

    转自:http://www.cnblogs.com/saptechnique/archive/2013/02/17/2914222.html 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对 ...

  5. 如何在cmd命令行中查看、修改、删除与添加环境变量,语法格式例子:set path;echo %APPDATA%

    如何在cmd命令行中查看.修改.删除与添加环境变量 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修 ...

  6. Windows如何在cmd命令行中查看、修改、删除与添加、设置环境变量

    首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修改环境变量的方法有两种:一种是直接修改注册表(此种方 ...

  7. 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目

    前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...

  8. Mongodb的备份,恢复,导入与导出(cmd命令行实现)

    要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下命令均在cmd ...

  9. 【转】PowerShell入门(二):PowerShell是Cmd命令行的加强版吗?

    转至:http://www.cnblogs.com/ceachy/archive/2013/01/31/PowerShell_vs_Cmd.html PowerShell是命令行的加强版吗?Power ...

随机推荐

  1. POJ-3468(线段树+区间更新+区间查询)

    A Simple Problem With Integers POJ-3468 这题是区间更新的模板题,也只是区间更新和区间查询和的简单使用. 代码中需要注意的点我都已经标注出来了,容易搞混的就是up ...

  2. Java 查找算法

    1 查找算法介绍 在 java 中,我们常用的查找有四种: 1) 顺序(线性)查找 2) 二分查找/折半查找 3) 插值查找 4) 斐波那契查找   2 线性查找算法 有一个数列: {1,8, 10, ...

  3. spring基础:什么是框架,框架优势,spring优势,耦合内聚,什么是Ioc,IOC配置,set注入,第三方资源配置,综合案例spring整合mybatis实现

    知识点梳理 课堂讲义 1)Spring简介 1.1)什么是框架 源自于建筑学,隶属土木工程,后发展到软件工程领域 软件工程中框架的特点: 经过验证 具有一定功能 半成品 1.2)框架的优势 提高开发效 ...

  4. .NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service

    实在是被某软忽悠瘸了,愤而写此一篇.希望能让同样需求的同学们少走弯路.某软在<在 Windows 服务中托管 ASP.NET Core>中,介绍了通过创建Worker Service工程, ...

  5. Java 使用BigDecimal计算值没有变化?

    BigDecimal 加减乘除后自身变量不会变化, 需要定义一个新的BigDecimal来获取计算好后的值

  6. Solon 框架详解(十)- Solon 的常用配置

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  7. POJ_2387 Til the Cows Come Hom 【最短路】

    一.题目 POJ2387 二.分析 Bellman-Ford算法 该算法是求单源最短路的,核心思想就是不断去更新到起点的最短距离,更新的前提是没有负边.如果有负边需要手动控制循环次数. Dijkstr ...

  8. Stone Game, Why are you always there? HDU - 2999

    题目链接:https://vjudge.net/problem/HDU-2999 题意:有N堆石头,两个人交替取,每次只能取连续的k个石子,最后没有石子取得人输. 思路:如果我们每次取靠边的k个,那么 ...

  9. 攻防世界 reverse 流浪者

    流浪者 int __thiscall sub_401890(CWnd *this) { struct CString *v1; // ST08_4 CWnd *v2; // eax int v3; / ...

  10. Etcd常用运维命令

    目录 常用命令 常见操作 如何缩容? 如何扩容? 数据目录丢失或被误删除,节点启动失败或者加入集群报错? 操作步骤 操作步骤不正确的各种常见错误日志 常用命令 #查看集群member情况 etcdct ...