消消乐游戏结构

创作背景

思路

代码

总结

创作背景

最近又放寒假了。真的是作业多多,寒假少少啊……不过在赶作业之余,我也是有时间编程的,只不过没有之前那么"放肆"了。消消乐游戏(简单)是我挤出大量零零散散的时间编出来的(亲测Dev-c++无报错,可以运行):

思路

消消乐游戏的思路真的是很简单易懂了:

1.获取玩家输入(游戏地图边框大小:n),作不合法处理

2.初始化:随机生成地图界面

do{

3.输出当前地图界面

4*.获取玩家鼠标左键点击位置(位于控制台窗口内),作不合法处理

5.深搜(dfs),搜索四连通(四个方向连通且同色)块

6.统计此次消除的得分

7.随机生成数(代表颜色)填补上次消除空白处

}while(地图界面未形成无法消除情况);

总体形成玩家消除,机器填补的循环过程

思路就是上方的执行过程

代码

头文件:

#include<bits/stdc++.h>
#include<windows.h>

宏定义:

#define dn() ((GetAsyncKeyState(VK_LBUTTON)&0x8000)?true:false)//检测鼠标左键是否按下

变量和数组:

POINT p;
CONSOLE_FONT_INFO font;
int a[11][11],n,x,y,v,sc;
int dx[]={0,-1,0,0,1},dy[]={0,0,-1,1,0};//方向数组(上下左右)
bool g[11][11];//dfs时用作标记

初始化函数:

void init(){//获取玩家输入(n)并随机生成地图界面memset(a,0,sizeof(a));do{cout<<"Please enter the size of interface(2<=n<=10):";cin>>n;}while(n<2 || n>10);srand(int(time(NULL)));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)a[i][j]=rand()%6+1;
}

输出地图界面函数:

void put(){//输出当前地图界面memset(g,false,sizeof(g));system("cls");for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){switch(a[i][j]){case 0:cout<<"  ";continue;case 1:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);break;case 2:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN);break;case 3:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);break;case 4:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);break;case 5:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_BLUE);break;case 6:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); }cout<<"□";}cout<<endl;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<"Score:";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<sc<<endl<<endl;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}

对玩家获取的鼠标左键点击坐标(列)转换:

int c(int y){//列转换函数return (y%2?(y+1)/2:y/2);
}

深搜函数(此情境下无需回溯):

void dfs(int x,int y){//搜索四连通且同色块if(a[x][y]!=v)return;for(int d=1;d<5;d++){int xx=x+dx[d],yy=y+dy[d];if(xx>0 && xx<=n && yy>0 && yy<=n && !g[xx][yy] && a[xx][yy]==v){g[xx][yy]=true;dfs(xx,yy);}            }
}

判断当前地图界面是否成无法消除情况:

bool lose(){//判断可消除性for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int d=1;d<5;d++){int xx=i+dx[d],yy=j+dy[d];if(xx>0 && xx<=n && yy>0 && yy<=n && a[i][j]==a[xx][yy])return false;}return true;
}

主函数:

int main(){init();do{Sleep(1250);put();DWORD mode;GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),&mode);mode&=~ENABLE_QUICK_EDIT_MODE;SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),mode);do{//循环检测鼠标左键点击位置的合法性while(!dn());POINT p;GetCursorPos(&p);ScreenToClient(GetForegroundWindow(),&p);               GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),FALSE,&font); x=(p.y/=font.dwFontSize.Y)+1;y=(p.x/=font.dwFontSize.X)+1;Sleep(100);if(x>n || y>n*2)continue;break;}while(1);v=a[x][c(y)];dfs(x,c(y));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(g[i][j]){sc++;//统计此次消除得分a[i][j]=0;}put();srand(int(time(NULL)));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!a[i][j])a[i][j]=rand()%6+1;//填补上次消除空白处}while((n<7?(!lose()):1));//地图越大,那无法消除的情况就越无法达到,所以我控制范围,争取较少的时间复杂度(觉得不稳妥的可以改成"while(!lose())")Sleep(1875);put();Sleep(1875);system("cls");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);cout<<"You lost!";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<"\n\nScore:";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_BLUE);cout<<sc;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);return 0;
}

总结

这次的消消乐游戏的"精华"在于获取玩家的鼠标左键的点击位置。其实真的不算难,主要是获取点击位置时花的时间太多。不过最后还是起作用了。这就与平常的游戏结构差不多。

若有任何错误、问题或需求,各位大神请在评论区发表评论。

Dev-c++编写消消乐游戏 思路和代码 详解相关推荐

  1. Dev-c++编写走迷宫游戏 思路和代码 详解

    创作背景 今天又是放元旦假的一天,无聊的我刷够了手机,就跑过去打开电脑······ 熟悉的Dev-c++图标又映入我的眼帘,今天编点什么呢······ 我绞尽脑汁,冥思苦想,终于想到了一个游戏--走迷 ...

  2. 简单跑酷java代码_如何实现一个简单的跑酷游戏?(代码详解)

    本篇文章给大家带来的内容是介绍如何实现一个简单的跑酷游戏?(代码详解).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 采用的物理引擎是:Phaser.js 官网地址:http:// ...

  3. C语言实现三子棋小游戏(编程思路以及代码详解)

    目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...

  4. Arduino中编写打砖块小游戏(完整代码)

    标题 Arduino中编写打砖块小游戏(完整代码) 程序中有大量的注释,希望真的能帮助到你! (一)环境 硬件:OLED 屏幕(128*64).摇杆模块(程序中使用的是摇杆模块的模拟量,如果你身边没有 ...

  5. 马德里烈风和java的鱼雷,碧蓝航线航母舰载机怎么搭配_碧蓝航线航母舰载机搭配思路及优缺点详解_手心游戏...

    碧蓝航线航母舰载机怎么搭配?碧蓝航线航母舰载机优缺点是什么?在碧蓝航线游戏中因为防空炮的改变让航母有了被削弱的感觉,那么舰载机怎么搭配好呢?一起来看一下碧蓝航线航母舰载机搭配思路及优缺点详解吧. 碧蓝 ...

  6. protobuf前后端解析_前端后台以及游戏中使用google-protobuf详解

    前端后台以及游戏中使用google-protobuf详解 [TOC] 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更小 ...

  7. 从零编写60%+胜率的短线择时信号!零基础python量化投资代码详解【邢不行】

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. ​ ​ 如果有人说你是百年难得一见的量化投资天才, ...

  8. [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)

    完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...

  9. php论坛思路,PHP论坛实现积分系统的思路代码详解

    PHP论坛实现积分系统的思路代码详解,积分,头像,等级,用户,字段 PHP论坛实现积分系统的思路代码详解 易采站长站,站长之家为您整理了PHP论坛实现积分系统的思路代码详解的相关内容. 首先在用户表定 ...

最新文章

  1. iOS NSString中实用的方法
  2. usb大容量存储设备驱动_Win10默认已禁用USB驱动器缓存 1903版本起无需点击安全弹出...
  3. LeetCode Remove Duplicates from Sorted List
  4. 初步的看一下C#窗体程序的直接反汇编代码
  5. 运营商何时推出无限流量?
  6. 解决安装IIS时提示找不到zClientm.exe文件的问题
  7. PTA-Hello World(C语言)
  8. python print return_对python中return和print的一些理解
  9. 开发安全的ASP.NET应用程序
  10. 软考历程(4)——安全问题之病毒
  11. 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第二章(1) 2020-12-21
  12. 计算机自带仿真软件,crt软件(电脑终端仿真工具)V8.5.4 最新版
  13. 绘制附带 AHT20 温湿度传感器的 stm32 电路原理图
  14. mybatis常用标签
  15. 计算机画图软件技巧,CAD绘图技巧(一)—速度篇
  16. 目标检测---教你利用yolov5训练自己的目标检测模型
  17. 室内定位技术现状和发展趋势
  18. [回溯法] 和尚挑水问题-华为笔试
  19. 58同城渠道“去赶集化” 代理商或成联姻牺牲品
  20. 2020年蓝桥杯暑假第1次练习赛(C++组)

热门文章

  1. PowerDesigner设计表添加注释问题
  2. html5css设置链接颜色,html超链接颜色设置
  3. java在面板中加入图片_我想在这面板上添加图片,可是图片显示不出来,求助~...
  4. RabbitMQ自动扩展消费者源码分析
  5. IBGP负载均衡(ENSP实验)、等价路由/EBGP负载均衡
  6. 硬核!30 张图解 HTTP 常见的面试题,给你整明白
  7. 详细介绍外观设计专利的申请流程和费用
  8. Java面试题库,腾讯面试需要Java转go
  9. Excel如何利用公式向导截取右侧文本指定内容?
  10. hive 删除某个分区中部分数据