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 | 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() {
 system("title 李柏衡");
 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() {
 //游戏结束后显示地雷位置
 for (int i = 0;i < MAXY;i++) {
  for (int j = 0;j < MAXX;j++) {
   if (cube[j][i].getIfHaveBomb() == true) {
    cube[j][i].setOpen();
   }
  }
 }
 show();
}

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

(0)

相关推荐

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

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

  • C++实现扫雷小游戏

    本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #include<conio.h> #include<queue> #include<ctype.h> #define A 17 //地图的高 #define B 17 //地图的宽 #define C

  • C++实现扫雷游戏

    本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下 直接上代码 #include<stdio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #include<conio.h> #include<queue> #include<ctype.h> #define A 17 //地图的高 #define B 17 //地图的宽 #de

  • C++基于EasyX实现简单扫雷游戏

    本文实例为大家分享了C++ EasyX实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 [实现代码] #include <cmath> #include <time.h> #include <easyx.h> #include <conio.h> using namespace std; #define Size 500 //定义窗口大小 #define SquareSize 50 //定义格子大小 #define BackGroundColor LIG

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

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

  • C语言实现简单扫雷游戏

    本文实例为大家分享了C语言实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 步骤 1.首先打印游戏选择菜单 2.地图及初始化 1).展示给玩家的地图(show_map) 2).地雷的图(mine_map可知地雷的位置) 3.打印地图 4.用户输入坐标,并检查坐标的合理性 5.判断当前位置是否有地雷,没有则出现数字(表示周围格子中有几个地雷) 6.打印新的地图 7.重复3~6步骤,直到踩雷游戏结束,或胜利. 8重新继续游戏或退出! 代码 主函数及游戏选择菜单 #include<stdio.h>

  • java实现简单扫雷游戏

    本文实例为大家分享了java实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 package com.test.swing; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.

  • C语言版简单扫雷游戏

    本文实例为大家分享了C语言版的简单扫雷游戏,供大家参考,具体内容如下 思想 我们在设计的时候,首先将其分为三个部分,分别为头文件game.h游戏界面及主要实现的功能函数部分test.c,还有就是最重要的游戏实现部分game.c. 一.头文件构建: 我们通过game.h将所有用到的头文件引用进去,目的是更加直观的让读者看懂我们的结构,另外我们思路也会通畅一些. #include <stdio.h> #include <stdlib.h> #include <time.h>

  • Python实现简单扫雷游戏

    本文实例为大家分享了Python实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 #coding: utf-8 __note__ = """ * 扫雷小游戏 * 需要python3.x以上 * 需要安装PyQt5 * pip install PyQt5 """   import sys   try:     import PyQt5 except ImportError:     import tkinter     from tkinter

  • C语言模拟实现简单扫雷游戏

    本文指的扫雷是简单模拟电脑中的扫雷游戏,但以我目前的水平,也就只能在黑框中实现 test.c #include<stdio.h> #include<stdlib.h> #include<time.h> #include "game2.h" void menu() { printf("********* welcome ********\n"); printf("**********1.play**********\n&q

  • 基于JavaScript实现简单扫雷游戏

    对于10年前的人来说,扫雷肯定是家喻户晓,由于当时的科技并不是很发达,大家对于电脑游戏的了解,可能都是从扫雷开始的,今天就交大家一种用js原生代码写一个简单的扫雷游戏,话不多说,直接上干货: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="wid

  • C语言代码实现简单扫雷游戏

    C语言实现扫雷游戏,供大家参考,具体内容如下 game1.h中的代码如下: 里边放置的是相关的函数声明 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set); void

  • 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语言实现扫雷,用递归实现周围一圈无雷时,自动继续判断下一圈是否有雷,直到四周有地雷的信息. 最终结果展示 初始游戏界面 四周无地雷继续向外展开,直到出现地雷信息 项目创建 本项目由test.c,game.c,game.h构成,其中test.c用于测试,存放main函数,game.c存放具体函数定义,game.h引用头文件.定义预定义符号以及存放函数声明. 项目构思及实现 1.main函数 预期程序运行时先出现选择界面,玩家输入1进入游戏,输入0退出游戏,一次游戏结束后,再次弹

随机推荐