• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++实现简单的扫雷游戏(控制台版)

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

作者:咸猫 字体:[增加 减小] 来源:互联网 时间:2017-05-28

咸猫 通过本文主要向大家介绍了c++控制台程序,c++控制小数点位数,c++格式控制符,c++输出格式控制,c++控制台输出等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

代码片段扫雷V1.1

#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 | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define PURPLE FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY
 
using namespace std;
 
const int STARTX = 30;
const int STARTY = 6;
const int MAXX = 9;//雷区的宽
const int MAXY = 9;//雷区的高
const int BOMBNUMBER = 10;//地雷数量
 
class Cube{
private:
  bool ifHaveBomb;//该方块是否含有炸弹
  bool ifOpen;//该方块有无被玩家翻开
  int nearBombNumber;//该区块周围8格的含有炸弹的方块的数量
public:
  void setOpen() {
    //将Open的值改为true
    ifOpen = true;
  }
  bool getOpen() {
    //获取ifOpen的值
    return ifOpen;
  }
  void setNearBombNumber(int number) {
    //给nearBombNumber赋值
    nearBombNumber = number;
  }
  void haveBomb() {
    //给方块放置地雷
    ifHaveBomb = true;
  }
  bool getIfHaveBomb() {
    //获取ifHaveBomb的值
    return ifHaveBomb;
  }
  int getNearBombNumber() {
    //获取nearBombNumber的值
    return nearBombNumber;
  }
  void resetCube(bool ifhavebomb = false, bool ifopen = false, int nearbombnumber = 0){
    //初始化成员数据
    ifHaveBomb = ifhavebomb;
    ifOpen = ifopen;
    nearBombNumber = nearbombnumber;
  }
};
Cube cube[MAXX][MAXY];
 
void GoTo(int x, int y);//定位光标
void setBomb(int bombNumber);//生成bombNumber个炸弹并且放进随机的方块中
void show();//显示地雷阵
int checkAndSetNearBombNumber(int x, int y);//检查当前方块周围的雷数量
void gameStart();//初始化游戏
void showXY();//显示雷区坐标
bool player(bool &life);//玩家输入坐标翻开方块
void message(bool life);//玩家游戏结束后输出的信息
void autoOpen(int x,int y);//玩家翻开的方块为不含雷且周围无雷的方块时,自动翻开周围无雷的方块
bool ifWin();//判断玩家是否扫雷成功
void showBomb();//游戏结束后显示地雷位置
 
int main() {
 
  gameStart();
  show();
  bool life = true, win = true;
  while (player(life) && !ifWin()) {
  }
  message(life && ifWin());
  return 0;
}
 
void GoTo(int x, int y) {
  //定位光标
  COORD coord = { x,y };
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
 
void setBomb(int bombNumber = BOMBNUMBER) {
  //生成bombNumber个炸弹并且放进随机的方块中
  srand((unsigned)GetCurrentTime());
  while (bombNumber--) {
    int x = MAXX + 1, y = MAXY + 1;
    while ((x >= MAXX || y >= MAXY) || cube[x][y].getIfHaveBomb() == true) {
      x = rand() % MAXX;
      y = rand() % MAXY;
    }
    cube[x][y].haveBomb();
  }
}
 
void show() {
  //显示地雷阵
  system("cls");
  showXY();
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
  for (int i = 0;i < MAXY;i++) {
    GoTo(STARTX, STARTY + i);
    for (int j = 0;j < MAXX;j++) {
      if (cube[j][i].getOpen() == true) {
        if (cube[j][i].getIfHaveBomb() == false) {
          if (cube[j][i].getNearBombNumber() == 0) { //挖开无雷的方块显示该方块周围多少个方块含雷,若为0则显示空格
            printf(" ");
          } else {
            printf(" %d", cube[j][i].getNearBombNumber());
          }
        } else {
          printf("×");//有雷的方块被挖开后显示×
        }
      } else {
        printf("■");//未翻开的方块用■显示
      }
    }
  }
}
 
void showXY() {
  //显示坐标轴
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
  GoTo(STARTX - 3, STARTY + MAXY / 2);
  printf("Y");
  GoTo(STARTX + MAXX, STARTY - 2);
  printf("X");
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
  for (int i = 0;i < MAXY;i++) {
    GoTo(STARTX - 1, STARTY + i);
    printf("%d ", i);
  }
  for (int i = 0;i < 2 * MAXX;i += 2) {
    GoTo(STARTX + i + 1, STARTY - 1);
    printf("%d ", i / 2);
  }
}
 
int checkAndSetNearBombNumber(int x, int y) {
  //检查当前方块周围的雷数量
  int num = 0;
   
  if (cube[x][y].getIfHaveBomb() == true) {
    //若该方块有地雷,则不用判断它周围有几个雷
    return 0;
  } else {
    //用两个循环当前方块周围8格扫一遍
    for (int i = -1; i <= 1; i++) {
      for (int j = -1; j <= 1; j++) {
        int nx = x + i;
        int ny = y + j;
        if (!(ny == y && nx == x) && (nx >= 0 && nx <= MAXX - 1) &&
          (ny >= 0 && ny <= MAXY - 1)) {
          if (cube[nx][ny].getIfHaveBomb()) {
            num++;
          }
        }
      }
    }
    cube[x][y].setNearBombNumber(num);//设置该方块附近的地雷的数量
    return 0;
  }
}
 
void gameStart() {
  //初始化游戏
  for (int i = 0;i < MAXY;i++) {
    for (int j = 0;j < MAXX;j++) {
      cube[j][i].resetCube();
    }
  }
  setBomb();
  for (int i = 0;i < MAXY;i++) {
    for (int j = 0;j < MAXX;j++) {
      checkAndSetNearBombNumber(j, i);
    }
  }
}
 
bool player(bool &life) {
  //玩家输入坐标翻开方块
  int x, y;
  GoTo(STARTX - 3, STARTY + MAXY + 1);
  printf("请输入坐标(x,y),x和y用空格隔开");
  GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
  scanf("%d%d", &x, &y);
  if ((x < 0) || (x > MAXX - 1) || (y < 0) || (y > MAXY - 1)) {
    //当玩家输入的坐标超出范围时
    show();
    GoTo(STARTX - 3, STARTY + MAXY + 3);
    printf("该坐标不存在,请重新输入坐标");
    GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
  } else if (cube[x][y].getIfHaveBomb() == true) {
    //当玩家翻开的方块有地雷时
    cube[x][y].setOpen();
    show();
    life = false;
    return false;
  } else if (cube[x][y].getOpen() == false) {
    //当玩家翻开的方块无雷时
    if (cube[x][y].getNearBombNumber() == 0) {
      autoOpen(x, y);
      cube[x][y].setOpen();
      show();
    } else {
      cube[x][y].setOpen();
      show();
    }
  } else if (cube[x][y].getOpen() == true) {
    //当玩家输入已翻开方块的坐标时
    show();
    GoTo(STARTX, STARTY + MAXY + 3);
    printf("该方块已被挖开,请再次输入坐标");
    GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
  }
  ifWin();
  return true;
}
 
void message(bool result) {
  if (result == true) {
    //玩家胜利时输出的信息
    showBomb();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
    GoTo(STARTX - 1, STARTY + MAXY + 1);
    printf("祝贺你,你胜利了!");
    GoTo(STARTX, STARTY + MAXY + 2);
  } else {
    //玩家失败时输出的信息
    showBomb();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE);
    GoTo(STARTX - 1, STARTY + MAXY + 1);
    printf("××你踩中地雷了××");
    GoTo(STARTX, STARTY + MAXY + 2);
  }
}
 
void autoOpen(int x, int y) {
  //玩家翻开的方块为不含雷且周围无雷的方块时,自动翻开周围无雷的方块
  for (int i = -1; i <= 1; i++) {
    for (int j = -1; j <= 1; j++) {
      int nx = x + i;
      int ny = y + j;
      if (!(ny == y && nx == x) && (nx >= 0 && nx <= MAXX - 1) &&
        (ny >= 0 && ny <= MAXY - 1) && cube[nx][ny].getOpen() == false) {
        if (cube[nx][ny].getNearBombNumber() == 0) {
          cube[nx][ny].setOpen();
          autoOpen(nx, ny);
        } else {
          cube[nx][ny].setOpen();
        }
      }
    }
  }
}
 
bool ifWin() {
  //判断玩家是否扫雷成功达到游戏结束条件
  int num = 0;
  for (int i = 0;i < MAXX;i++) {
    for (int j = 0;j < MAXY;j++) {
      if (cube[j][i].getOpen() == false) {
        num++;
      }
    }
  }
  if (num == BOMBNUMBER) {
    return true;
  } else {
    return false;
  }
}
 
void showBomb() {
  //游戏结束后显



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++实现简单的扫雷游戏(控制台版)
  • 用VC++6.0的控制台实现2048小游戏的程序
  • VC++中HTControl控制类使用之CHTDlgBase对话框基类实例

相关文章

  • 2017-05-28深入分析C++中声明与定义的区别
  • 2017-05-28C语言实现在数组A上有序合并数组B的方法
  • 2017-05-28C++泛型算法的一些总结
  • 2017-05-28Cocos2d-x UI开发之CCControlButton控件类实例
  • 2017-05-28Cocos2d-x Schedule定时器的使用实例
  • 2017-05-28C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法
  • 2017-05-28C/C++宏定义的可变参数详细解析
  • 2017-05-28数据结构之位图(bitmap)详解
  • 2017-05-28用C实现添加和读取配置文件函数
  • 2017-05-28C++处理键盘输入的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C/C++产生随机数函数简单介绍
    • C语言编程中实现二分查找的简单入门实例
    • c++中strcpy函数在VS2015无法使用的问题
    • c语言实现的hashtable分享
    • 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
    • 浅析stl序列容器(map和set)的仿函数排序
    • C++的try块与异常处理及调试技术实例解析
    • C++中4种类型转换方式 cast操作详解
    • C++遍历文件夹获取文件列表
    • 如何使用递归和非递归方式反转单向链表

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有