Dev-c++编写消消乐游戏 思路和代码 详解
消消乐游戏结构
创作背景
思路
代码
总结
创作背景
最近又放寒假了。真的是作业多多,寒假少少啊……不过在赶作业之余,我也是有时间编程的,只不过没有之前那么"放肆"了。消消乐游戏(简单)是我挤出大量零零散散的时间编出来的(亲测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++编写消消乐游戏 思路和代码 详解相关推荐
- Dev-c++编写走迷宫游戏 思路和代码 详解
创作背景 今天又是放元旦假的一天,无聊的我刷够了手机,就跑过去打开电脑······ 熟悉的Dev-c++图标又映入我的眼帘,今天编点什么呢······ 我绞尽脑汁,冥思苦想,终于想到了一个游戏--走迷 ...
- 简单跑酷java代码_如何实现一个简单的跑酷游戏?(代码详解)
本篇文章给大家带来的内容是介绍如何实现一个简单的跑酷游戏?(代码详解).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 采用的物理引擎是:Phaser.js 官网地址:http:// ...
- C语言实现三子棋小游戏(编程思路以及代码详解)
目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...
- Arduino中编写打砖块小游戏(完整代码)
标题 Arduino中编写打砖块小游戏(完整代码) 程序中有大量的注释,希望真的能帮助到你! (一)环境 硬件:OLED 屏幕(128*64).摇杆模块(程序中使用的是摇杆模块的模拟量,如果你身边没有 ...
- 马德里烈风和java的鱼雷,碧蓝航线航母舰载机怎么搭配_碧蓝航线航母舰载机搭配思路及优缺点详解_手心游戏...
碧蓝航线航母舰载机怎么搭配?碧蓝航线航母舰载机优缺点是什么?在碧蓝航线游戏中因为防空炮的改变让航母有了被削弱的感觉,那么舰载机怎么搭配好呢?一起来看一下碧蓝航线航母舰载机搭配思路及优缺点详解吧. 碧蓝 ...
- protobuf前后端解析_前端后台以及游戏中使用google-protobuf详解
前端后台以及游戏中使用google-protobuf详解 [TOC] 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更小 ...
- 从零编写60%+胜率的短线择时信号!零基础python量化投资代码详解【邢不行】
引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. 如果有人说你是百年难得一见的量化投资天才, ...
- [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)
完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...
- php论坛思路,PHP论坛实现积分系统的思路代码详解
PHP论坛实现积分系统的思路代码详解,积分,头像,等级,用户,字段 PHP论坛实现积分系统的思路代码详解 易采站长站,站长之家为您整理了PHP论坛实现积分系统的思路代码详解的相关内容. 首先在用户表定 ...
最新文章
- iOS NSString中实用的方法
- usb大容量存储设备驱动_Win10默认已禁用USB驱动器缓存 1903版本起无需点击安全弹出...
- LeetCode Remove Duplicates from Sorted List
- 初步的看一下C#窗体程序的直接反汇编代码
- 运营商何时推出无限流量?
- 解决安装IIS时提示找不到zClientm.exe文件的问题
- PTA-Hello World(C语言)
- python print return_对python中return和print的一些理解
- 开发安全的ASP.NET应用程序
- 软考历程(4)——安全问题之病毒
- 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第二章(1) 2020-12-21
- 计算机自带仿真软件,crt软件(电脑终端仿真工具)V8.5.4 最新版
- 绘制附带 AHT20 温湿度传感器的 stm32 电路原理图
- mybatis常用标签
- 计算机画图软件技巧,CAD绘图技巧(一)—速度篇
- 目标检测---教你利用yolov5训练自己的目标检测模型
- 室内定位技术现状和发展趋势
- [回溯法] 和尚挑水问题-华为笔试
- 58同城渠道“去赶集化” 代理商或成联姻牺牲品
- 2020年蓝桥杯暑假第1次练习赛(C++组)