C++ 控制台版 2048小游戏
先说说2048游戏的规则:
开始的时候空格中会出现两个数字(只能为2或者4),用户可以选择上下左右键进行移动,数字们整体沿着方向移动,中间不存在空格,如果相邻的两个数字相等,那么合并至沿着方向的后一个,更新最大值,总分数加上新出现的数字。当出现2048,Win。或者没有空格了,Lose。
基本就是一个按照思路的模拟题,没有什么难度。不过我想写一个自动求解的程序,但是bfs搜索的话解空间太庞大,没有想到好的方法,有路过的牛人还请指点。
//2048 by Tach#include<iostream>
#include<string>
#include<ctime>
#include<cstring>
#include<conio.h>
#include<iomanip>
#include<algorithm>
using namespace std;
int g[4][4];
int vis[4][4];
int maxNum=0,score=0;
void print() //打印图案
{for(int i=0;i<4;i++){for(int j=0;j<4;j++)cout<<setw(5)<<g[i][j];cout<<endl<<endl;} cout<<"Max:"<<maxNum<<" "<<"Score:"<<score<<endl;
}
void init()
{for(int i=0;i<4;i++)for(int j=0;j<4;j++)g[i][j]=0;memset(vis,0,sizeof(vis));print();
}
bool GameOver() //判断是是否还有空格
{bool flag=false;for(int i=0;i<4;i++)for(int j=0;j<4;j++){if(vis[i][j]==0){flag=true;goto loop;}}loop:return flag;
}bool GetResult() //判断是否出现2048
{for(int i=0;i<4;i++)for(int j=0;j<4;j++){if(g[i][j]==2048)return true;}
}
void RandNum(int f) //随机生成2或者4,f代表需要生成的个数
{int num=0;while(1){int x=rand()%4;int y=rand()%4;if(vis[x][y]==0){vis[x][y]=1;int z=rand()%4+2;if(z%2!=0)z-=1;g[x][y]=z;num++;if(num==f)break;}}system("cls");print();
}
void work() //主函数,处理按键
{while(1){int ch=getch();if(ch==72)//上{for(int j=0;j<4;j++)for(int i=0;i<4;i++){if(vis[i][j]==1){for(int k=i-1;k>=0;k--){if(vis[k][j]==1){if(g[k][j]==g[k+1][j]){g[k][j]+=g[k][j];g[k+1][j]=0;vis[k+1][j]=0;maxNum=max(maxNum,g[k][j]);score+=g[k][j];break;}elsebreak;} else{int temp=g[k][j];//类似冒泡g[k][j]=g[k+1][j];g[k+1][j]=temp;vis[k+1][j]=0;vis[k][j]=1;}}}} RandNum(1);system("cls");print();if(GameOver()==false){cout<<"Game Over!!1"<<endl;break;}if(GetResult()==true){cout<<"You Win!!"<<endl;break;}}if(ch==80)//下 {for(int j=0;j<4;j++)for(int i=3;i>=0;i--){if(vis[i][j]==1){for(int k=i+1;k<4;k++){if(vis[k][j]==1){if(g[k][j]==g[k-1][j]){g[k][j]+=g[k-1][j];g[k-1][j]=0;vis[k-1][j]=0;maxNum=max(maxNum,g[k][j]);score+=g[k][j];break;}elsebreak;} else{int temp=g[k][j];g[k][j]=g[k-1][j];g[k-1][j]=temp;vis[k-1][j]=0;vis[k][j]=1;}}}} RandNum(1);system("cls");print();if(GameOver()==false){cout<<"Game Over!!1"<<endl;break;}if(GetResult()==true){cout<<"You Win!!"<<endl;break;}}if(ch==75)//左 {for(int i=0;i<4;i++)for(int j=0;j<4;j++){if(vis[i][j]==1){for(int k=j-1;k>=0;k--){if(vis[i][k]==1){if(g[i][k]==g[i][k+1]){g[i][k]+=g[i][k+1];g[i][k+1]=0;vis[i][k+1]=0;maxNum=max(maxNum,g[i][k]);score+=g[i][k];break;}elsebreak;} else{int temp=g[i][k];g[i][k]=g[i][k+1];g[i][k+1]=temp;vis[i][k+1]=0;vis[i][k]=1;}}}} RandNum(1);system("cls");print();if(GameOver()==false){cout<<"Game Over!!!"<<endl;break;}if(GetResult()==true){cout<<"You Win!!"<<endl;break;}}if(ch==77)//右 {for(int i=0;i<4;i++)for(int j=3;j>=0;j--){if(vis[i][j]==1){for(int k=j+1;k<4;k++){if(vis[i][k]==1){if(g[i][k]==g[i][k-1]){g[i][k]+=g[i][k-1];g[i][k-1]=0;vis[i][k-1]=0;maxNum=max(maxNum,g[i][k]);score+=g[i][k];break;}elsebreak;} else{int temp=g[i][k];g[i][k]=g[i][k-1];g[i][k-1]=temp;vis[i][k-1]=0;vis[i][k]=1;}}}} RandNum(1);system("cls");print();if(GameOver()==false){cout<<"Game Over!!!"<<endl;break;}if(GetResult()==true){cout<<"You Win!!"<<endl;break;}}}
}
int main()
{init();srand((unsigned)time(NULL));RandNum(2);work();return 0;
}
C++ 控制台版 2048小游戏相关推荐
- 2048网页版html项目报告,jQuery编写网页版2048小游戏
大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了,但是自己实现起 ...
- java编辑2048小游戏_Java 制作命令行版 2048小游戏
Java 命令行版 2048小游戏(2020年8月14日) 制作背景 大二即将开学,从头开始学习了一个多月的java,对二维数组的操作稍微熟悉了一些.于是想做一个简单的2048来试一试. 众所周知,2 ...
- 网页版2048小游戏
网页版2048小游戏 使用jquery3.3.1 进行的一次开发,各文件源码如下: 2048.css .div_2048{background-color: #FFFAF0;width:1000px; ...
- C语言版2048小游戏创作思路及代码
自己学习c语言也有一段时间,但还是对c语言没有感觉,所有想通过写博客来提高自己对c语言的理解. 在写2048的时候,参考了不少优秀的代码,也有一些自己的理解,希望能给大家一些参考. 先要有界面,顺带把 ...
- 2048c语言的思路,C语言版2048小游戏创作思路及代码
#include "stdafx.h" #include "stdlib.h" #include "conio.h" //writeKey( ...
- html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)
在前面的五篇文章中,小编带大家完成了网页版2048小游戏的基本游戏逻辑.但是在游戏结束的gameover()方法中咱们只是简单的通过alert来弹出一些信息,这样的话只能出现下图的效果.这样的游戏,不 ...
- java编写2048小游戏
java版2048小游戏 java编写2048小游戏 java编写2048小游戏 // An highlighted block /*** */ package games;/*** @author ...
- C++实现2048小游戏(控制台版的)
无聊,在公司写了个2048小游戏的程序,聊以自娱.(事实是我手机坏了,没得玩). 很简单,直接上代码了. #include <iostream> #include <windows. ...
- 2048小游戏 java版(代码+注释)
一个纯纯小白,想写点什么,也想学习一下怎么在这里写东西,就简单的写个2048小游戏.写的不好,大佬就不用看了,希望和大家交流学习,有写的不好或有更好的建议也欢迎提出来.(需要用的可直接 ...
最新文章
- 计算机设备报废界定,福建省国家税务局关于印发《计算机及其附属设备报废淘汰暂行办法》的通知...
- Window平台下的Android的环境配置
- php redis新增数据类型,Redis有哪几种数据类型
- C语言之去掉https链接的默认443端口
- blue html中转换,BlueFox Free PDF to HTML Converter(PDF文件转换软件)
- Spring Boot 操作 Memcache
- HTML文档包应含几个基本标记,HTML基本结与常用标记.doc
- python接口自动化(十九)--Json 数据处理---实战(详解)
- mysql 5.5主从同步_MySQL 5.5主从同步
- 万维网文档在服务器端动态,信息网络应用基础作业2.docx
- 从一个MFC工程移植对话框类到另一个MFC工程
- 我从编程总结的 22 个经验
- Keil下载代码闪退的问题(已解决)
- JS对象定义和基本方法
- LiveVideoStackCon2021 北京站专访:从上云到创新,视频云的新技术、新场景
- 基于Bootstrap4写的一个JQuery分页插件
- 用Python做一个好玩的朋友圈九宫格抽奖
- 对*.mht文件结构的一个浅显分析
- C#控件之OpenFileDialog选择图片文件并在picturebox里面显示
- 报错:Could not connect to any X display