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

游戏界面

由于这个游戏是我抱着玩一玩的心态做出来的,所以没有过多的去设计界面,也没有去找游戏的资源(图片、游戏音效等)。仅使用了不同颜色的方块来表示游戏中方块的状态和种类。(绿色为初始状态(未翻转的状态),黄色为翻转后的背景颜色,蓝色表示已插旗的方块,红色代表地雷)

图1 游戏主菜单界面

图二 模式一的游戏界面(20*20 40个雷)

图三 模式二的游戏界面(10*10 20个雷)

图四 游戏成功界面

图五 游戏失败界面

2.全部代码

#include<graphics.h>
#include<iostream>
#include<conio.h>
#include<time.h>
using namespace std;
#define POINTWIDTH 30
//雷的数量
int mineCnt;
int mapSize;
//已翻转的个数
int _count;
//是否有雷
bool mine[20][20] = { false };
//是否已翻转
bool overturned[20][20] = { false };
bool flaged[20][20] = { false };
//游戏模式
int mode;
//游戏重新开始的标志
int cmd = 1;
//游戏结束标志
bool gameOver;
//玩家获胜标志
bool _win;
//小方格(坐标)
typedef struct point {
 int x;
 int y;
 point(int _x, int _y) {
 x = _x; y = _y;
 }
}point;
//计算周围的地雷数量
int getAroundMineCnt(point p) {
 int cnt=0;
 for (int i = p.x - 1; i <= p.x + 1; i++) {
 for (int j = p.y - 1; j <= p.y + 1; j++) {
  if (i >= 0 && i < 20 && j >= 0 && j < 20 && mine[i][j])
  cnt++;
 }
 }
 return cnt;
}
//画点(小方格)
void drawPoint(point p,int color) {
 setfillcolor(color);
 fillrectangle(p.x*POINTWIDTH +140,p.y*POINTWIDTH +140, p.x * POINTWIDTH + 140+ POINTWIDTH, p.y * POINTWIDTH + 140+ POINTWIDTH);
}
//画地雷(红色方块代替)
void drawMine(point p) {
 setfillcolor(RED);
 fillrectangle(p.x * POINTWIDTH + 140, p.y * POINTWIDTH + 140, p.x * POINTWIDTH + 140+POINTWIDTH, p.y * POINTWIDTH + 140+POINTWIDTH);
}
//画旗(蓝色方块代替)
void drawflag(point p) {
  flaged[p.x][p.y] = true;
 drawPoint(p, BLUE);
}
//游戏结束对话框与"重玩"、"退出"
void gameover(int &cmd) {
 gameOver = 1;
 for (int i = 0; i < mapSize; i++) {
 for (int j = 0; j < mapSize; j++) {
  if (mine[i][j]) {
  point p(i, j);
  drawMine(p); }
 }
 }
 Sleep(500);
 setfillcolor(LIGHTGRAY);
 fillrectangle(200,300,700,550);
 rectangle(200, 500, 350, 550);
 rectangle(550, 500, 700, 550);
 setbkmode(1);
 settextstyle(60, 0, 0);
 outtextxy(300, 400, _T("Game over"));
 settextstyle(38, 0, 0);
 outtextxy(220, 510, _T("Restart"));
 outtextxy(560, 510, _T( "  Quit"));
 MOUSEMSG m;
 while (1) {
 m = GetMouseMsg();
 if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>200 && m.x < 350)
  break;
 else if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>550 && m.x < 700) {
  cmd = 0;
  break;
 }
 }
}
//游戏胜利对话框与"重玩"、"退出"
void win(int &cmd) {
 _win = 1;
 setfillcolor(LIGHTGRAY);
 fillrectangle(200, 300, 700, 550);
 rectangle(200, 500, 350, 550);
 rectangle(550, 500, 700, 550);
 setbkmode(1);
 settextstyle(60, 0, 0);
 outtextxy(300, 400, _T("You Win!"));
 settextstyle(38, 0, 0);
 outtextxy(220, 510, _T("Restart"));
 outtextxy(560, 510, _T("  Quit"));
 MOUSEMSG m;
 while (1) {
 m = GetMouseMsg();
 if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>200 && m.x < 350)
  break;
 else if (m.mkLButton&&m.y > 500 && m.y < 550 && m.x>550 && m.x < 700) {
  cmd = 0;
  break;
 }
 }
}
//翻转
void overturn(point p,int t) {
 settextstyle(POINTWIDTH*0.8 , POINTWIDTH*0.8 , 0);
 settextcolor(BLACK);
 if (t == 1) {
 if (!mine[p.x][p.y]) {
  _count++;
  drawPoint(p, YELLOW);
  overturned[p.x][p.y] =true ;
  //判断周围的雷的数量是否为0,为0则翻转该方块周边的8个方块
  if (getAroundMineCnt(p) != 0) {
  int cnt = getAroundMineCnt(p);
  _TCHAR a[3];
  _stprintf_s(a, L"%d", cnt);
  outtextxy(p.x*POINTWIDTH+POINTWIDTH*0.1+ 140, p.y*POINTWIDTH+POINTWIDTH*0.1 + 140, a);
  if (_count == mapSize * mapSize - mineCnt) { win(cmd); return; }
  }
  else {
  for (int i = p.x - 1; i <= p.x + 1; i++) {
   for(int j=p.y-1;j<=p.y+1;j++)
   if (i >= 0 && i < mapSize && j >= 0 && j < mapSize&&!overturned[i][j]) {
    point temp(i, j);
    overturn(temp, 1);
   }
  }
  }
 }
 else { gameover(cmd); return; }
 }
 else {
 if (!flaged[p.x][p.y]) {
  drawflag(p);
 }
 else {
  flaged[p.x][p.y] = false;
  drawPoint(p, GREEN);
 }
 }
}
//右键插旗
void play() {

 while (true) {
 MOUSEMSG m;
 m = GetMouseMsg();
 if (m.mkLButton&&m.x > 140 && m.x < 140+mapSize*POINTWIDTH && m.y > 140 && m.y < 140+mapSize*POINTWIDTH)
 {
  point p((m.x - 140) / POINTWIDTH, (m.y - 140) / POINTWIDTH);//将鼠标点击的坐标转换成对应位置的方块
  if(!overturned[p.x][p.y])
  overturn(p,1);
 }
 if (m.mkRButton&&m.x > 140 && m.x < 740 && m.y > 140 && m.y < 740)
 {
  point p((m.x - 140) / POINTWIDTH, (m.y - 140) / POINTWIDTH);
  if(!overturned[p.x][p.y])
  overturn(p, 2);
 }
 if (gameOver) return;
 else if (_win) return;
 }
}
//初始化游戏界面
void initGameface() {
 if(mode==1)
 rectangle(140, 140, 740, 740);
 else rectangle(140, 140, 440, 440);
 setbkcolor(LIGHTGRAY);
 cleardevice();
 setbkcolor(YELLOW);
 point p(0, 0);
 for (int i = 0; i < mapSize; i++) {
 for (int j = 0; j < mapSize; j++) {
  p.x = i;
  p.y = j;
  drawPoint(p, GREEN);
 }
 }

}
//地雷的随机生成器
void generator() {
 int cnt = 0;
 while (cnt < mineCnt) {
 int i = rand() % mapSize;
 int j = rand() % mapSize;
 if (!mine[i][j]) {
  mine[i][j] = true;
  cnt++;
 }
 }
}
//游戏的开始界面(图1)
void startInterface(int &mode) {
 mode = 1;
 initgraph(880, 880);
 setbkcolor(LIGHTGRAY);
 cleardevice();
 setlinecolor(RED);
 rectangle(100, 100, 780, 300);
 rectangle(300, 400, 580, 500);
 rectangle(300, 530, 580, 630);
 rectangle(300,660, 580, 760);
 settextcolor(RED);
 settextstyle(100,0,0);
 outtextxy(300,140,L"扫 雷");
 settextstyle(60, 0, 0);
 outtextxy(320, 420, L"新 游 戏");
 outtextxy(320, 550, L"简    单");
 outtextxy(320, 680, L"游戏帮助");
 MOUSEMSG m;
 while (1) {
 m = GetMouseMsg();
 if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>400 && m.y < 500)
  break;
 else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>530 && m.y < 630)
  if (mode == 1) {
  mode = 2;
  rectangle(300, 530, 580, 630);
  outtextxy(320, 550, L"困    难");
  }
  else {
  mode = 1;
  rectangle(300, 530, 580, 630);
  outtextxy(320, 550, L"简    单");
  }
 else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>660 && m.y < 760) {
  cleardevice();
  MOUSEMSG mm;
  while (1) {
  mm = GetMouseMsg();
  if (mm.mkLButton) break;
  }
  startInterface(mode);
 }
 }
}
//初始化游戏
void initgame(int mode) {
 _win = 0;
 _count = 0;
 gameOver = 0;
 if (mode == 1) {
 mineCnt= 40;
 mapSize = 20;
 }
 else {
 mineCnt = 20;
 mapSize = 10;
 }
 for (int i = 0; i < mapSize; i++) {
 for (int j = 0; j < mapSize; j++) {
  mine[i][j] = 0;
  flaged[i][j] = 0;
  overturned[i][j] = 0;
 }
 }
}
//整个游戏过程
void game() {
 srand(unsigned(time));
 startInterface(mode);
 while (cmd) {
 initgame(mode);
 initGameface();
 generator();
 play();
 }
}
int main() {
 game();
}

3. 符加说明:本程序使用了简单好用的easyx图形库:可以Easyx官网中下载安装,且Easyx官网提供的文档详细的介绍了各种函数的用法,很容易上手。

总结

以上所述是小编给大家介绍的利用c++和easyx图形库做一个低配版扫雷游,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • C++ 迷宫游戏实现代码

    C++ 迷宫游戏实现代码 题目 通过让游戏角色自动寻找迷宫出口,走出迷宫,来练习C++面向对象之封装的基础知识.迷宫图如下所示,其中X表示墙. 1.程序分析 走出去的原理:遵循右手规则或左手规则.右手扶墙走,就会走出迷宫,反之,亦然. step1 创建迷宫类,打印出迷宫地图. step2 创建走迷宫的人的类. 2.程序实现 MazeMap.h #ifndef MAZEMAP_H #define MAZEMAP_H #include <iostream> #include <Windows

  • C++面向对象实现五子棋小游戏

    尽量将面向对象的思想融入进程序中 ChessBoard.h //ChessBoard.h #pragma once #define ROW 15 #define COL 15 #include<iostream> using namespace std; class ChessBoard//棋盘类 { public: char m_cSquare[ROW][COL]; public: ChessBoard(); void show(); }; ChessBoard.cpp //ChessBoa

  • C++实现简单射击小游戏

    使用c++制作简单的横板射击小游戏,供大家参考,具体内容如下 #include <easyx.h> #include <time.h> #include <conio.h> class Bullet; class Tank; class E_Bullet; class Boss; bool dead = false; bool wined = false; struct pos//坐标类 { int a; int b; }; class E_Bullet//敌人打出的子

  • C++ 实现2048游戏示例

    这游戏前一段时间传的很火,前几天早上实在太无聊了,就决定把这游戏自己也写一个. 前后写了一个多小时吧,大概300行左右,没什么复杂算法,不过实在懒得去优化了,但估计优化完能控制在200行以下,有兴趣的朋友可以自己优化一下. 说明:我一开始玩的是IOS APP版的TRHEES,后来才玩的2048,两者在滑动的规则上有些区别,本人这个版本是这两者的结合. 最后,祝试玩愉快! 界面丑陋,求不笑. 以下是源代码: 复制代码 代码如下: /*By Reason*/#include<iostream>#i

  • C++实现的分布式游戏服务端引擎KBEngine详解

    KBEngine 是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端. 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术, 将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏. (经常被问到承载上限,kbengine底层架构被设计为多进程分布式动态负载均衡方案

  • C++实现推箱子小游戏源码

    本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 功能尚为完善. // ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<windows.h> #define KEY_DOWN(vk_code) GetAsyncKeyState(vk_code) & 0x8000 ? 1 : 0 using

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

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

  • C++实现基于控制台界面的吃豆子游戏

    本文实例讲述了C++实现基于控制台界面的吃豆子游戏.分享给大家供大家参考.具体分析如下: 程序运行界面如下所示: ESC键可退出游戏. main.cpp源文件如下: #include "lib.h" #pragma once extern int level; int main() { FOOD food; WALL wall; BODY CurPos; HALL hall; int iExit = 0; while(1) { if(iExit) break; Init(&fo

  • 贪吃蛇游戏C++命令行版实例代码

    本文实例讲述了贪吃蛇游戏C++命令行版的实现代码,是非常经典的游戏.分享给大家供大家参考.具体实现方法如下: 众所周知,贪吃蛇游戏是经典的计算机游戏. 游戏描述如下: 1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格. 2. 贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时: ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时: ③玩家的键盘输入不是方向键时: 命令行显示"Game Over!"并且退出游戏. 3. 贪吃蛇活动的区域内每次随机产生一颗&quo

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

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

  • 利用java开发简易版扫雷游戏

    1.简介 学了几周的Java,闲来无事,写个乞丐版的扫雷,加强一下Java基础知识. 2.编写过程 编写这个游戏,一共经历了三个阶段,编写了三个版本的游戏代码. 第一版:完成了扫雷游戏的基本雏形,实现了游戏的基本功能,游戏运行在cmd黑窗口中,以字符绘制游戏界面,无图形化窗口,通过控制台输入字符完成游戏控制.代码放置在一个java文件中,代码的可读性以及可扩展性都比较差. 第二版:在第一版实现基本功能的基础之上,对游戏代码进行重构,根据各部分的功能创建多个类,增加代码注释,提高代码的可读性以及可

  • C++用easyx图形库实现障碍跑酷小游戏

    用easyx图形库做一个简单的c++小游戏-障碍跑酷 开发环境:visual c++6.0 库:easyx图形库 下载地址 EasyX(c++图形库) v20200806 官方安装免费版 当时我原本是想模仿做一个Flappy Bird的小游戏,在想如何写的时候突然有了新的想法,就有了这个障碍跑酷的小游戏.(这是我之前写的代码,没有很注重规范,看上去有点乱,但我很尽力的都标上了注释.) 游戏介绍: 1.操控小球,小球一开始只具有左a,右d与跳跃w的功能 2.可根据按1,2,3,4调节小球的跳跃高度

  • 教你使用python做一个“罚点球”小游戏

    在学习了一点 Python 基础之后,我们可以做一个罚点球的小游戏,大概流程是这样: 每一轮,你先输入一个方向射门,然后电脑随机判断一个方向扑救.方向不同则算进球得分,方向相同算扑救成功,不得分. 之后攻守轮换,你选择一个方向扑救,电脑随机方向射门. 第5轮结束之后,如果得分不同,比赛结束. 5轮之内,如果一方即使踢进剩下所有球,也无法达到另一方当前得分,比赛结束. 5论之后平分,比赛继续进行,直到某一轮分出胜负. 实现方法有很多种,我这里提供的只是一种参考.你可以按照自己喜欢的方式去做,那样才

  • 利用momentJs做一个倒计时组件(实例代码)

    vue和moment做的一个倒计时 展示样式: <template> <div class="table-right flex-a-center"> <div class="time-text"> <span class="timeTextSpan" v-for="item,index of h" >{{item}}</span> <span class=&qu

  • Python利用3D引擎做一个太阳系行星模拟器

    这次,我们再来用Ursina引擎来做一个太阳系行星模拟器吧! 想要了解Ursina 3D引擎的基本使用方法的话,查看我的另一篇文章:详解Python 3D引擎Ursina如何绘制立体图形 这一次,我们要实现的效果如下 首先,送上本次需要用到的资源 Earth.jpg Jupiter.jpg Mars.jpg Mercury.jpg Neptune.jpg Saturn.jpg Sun.jpg Uranus.jpg Venus.jpg 现在,就开始写代码吧! 首先,导入我们需要的模块,导入3D引擎

  • 如何使用 Flask 做一个评论系统

    因为我博客使用的Disqus代理服务下线,博客的评论系统可能有一阵子没有工作了.惭愧的是我竟然最近才发现,我的工作环境一直是没有GFW存在的,发现是因为有个朋友为了留言给我不惜通过赞赏1元钱的方式.赞赏功能也是我最近才上的功能,但我怎么是这么一个无良的博主呢,我认为一个好的评论交流环境还是非常有必要的.但是自建评论还是换用其他墙内友好的评论系统,我还是纠结了一阵的,大致上我有这么几个要求: 主要服务墙内,Disqus虽香但墙内用不了啊 颜值,要能匹配当前博客的主色调,或者能方便地自定义皮肤 评论

  • c++使用Easyx图形库实现飞机大战

    公共的头文件        common.h #pragma once #include <graphics.h> #include <iostream> #include <string> #include <map> #include <list> #include <thread> #include <vector> #include <ctime> #include <mmsystem.h>

  • 使用jquery+iframe做一个ajax上传效果(实例)

    html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <title>利用j

  • 利用js的闭包原理做对象封装及调用方法

    创建一个js文件,名为testClosure.js: (function () { function a() { alert('i am a'); } outFunc = function () { a(); } })(); 这里不论写多少个function,a b c d ...外面都调用不到,包括这里面var定义的变量也都调用不到,那么你在里面尽情的写,就不用担心这些函数名变量名跟外界冲突: 只需要暴露一个outFunc这个函数供外界调用.这个函数呢没有用var定义,就变成一个全局变量,外界

随机推荐