[C++项目]2048控制台游戏
#include <iostream>
#include <windows.h>
#include <ctime>
using namespace std; int const ROW = ;
int const COL = ;
int game[ROW][COL] = {}; //上下左右
int const UP = ;
int const DOWN = ;
int const LEFT = ;
int const RIGHT = ; //游戏所处的状态
int const GAME_OVER = ;
int const GAME_WIN = ;
int const GAME_CONTINUE = ; enum GameNum
{
Game_2 = ,
Game_4 = ,
Game_8 = ,
Game_16 = ,
Game_32 = ,
Game_64 = ,
Game_128 = ,
Game_256 = ,
Game_512 = ,
Game_1024 = ,
Game_2048 = ,
}; //打印所得的数组
void Print()
{
system("cls");
cout << "***************** 2048 控 制 台 版 ******************" << endl;
cout << "***************** By Linxu ******************" << endl << endl;
for (int i = ; i < ROW; ++i)
{
cout << "================================"<< endl;
for (int j = ; j < COL; ++j)
{
if (game[i][j] == )
{
cout <<"| \t";
}
else
{
cout <<"| " << game[i][j] << "\t";
}
}
cout << "|" << endl;
}
cout << "================================"<< endl;
cout << "【操作说明】:"<< endl;
cout << "请使用按照↑↓←→控制移动方向" << endl << endl;
} bool CreateNumber()
{
int x = -;
int y = -;
int times = ;
int maxTimes = ROW * COL;
//三分之二的概率生成2,三分之一的概率生成4
int whitch = rand() % ;
do
{
x = rand() % ROW;
y = rand() % COL;
++times;
} while (game[x][y] != && times <= maxTimes); //说明格子已经满了
if(times >= maxTimes)
{
return false;
}
else
{
GameNum num;
if(whitch == )
{
num = Game_4;
}
else if(whitch)
{
num = Game_2;
}
game[x][y] = num;
} return true;
} void Process(int direction)
{
switch (direction)
{
case UP:
//最上面一行不动
for(int row = ; row < ROW; ++row)
{
for(int crow = row; crow >= ; --crow)
{
for(int col = ; col < COL; ++col)
{
//上一个格子为空
if(game[crow-][col] == )
{
game[crow-][col] = game[crow][col];
game[crow][col] = ;
}
else
{
//合并
if(game[crow-][col] == game[crow][col])
{
game[crow - ][col] *= ;
game[crow][col] = ;
} }
}
}
}
break;
case DOWN:
//最下面一行不动
for(int row = ROW - ; row >= ; --row)
{
for(int crow = row; crow < ROW - ; ++crow)
{
for(int col = ; col < COL; ++col)
{
//上一个格子为空
if(game[crow + ][col] == )
{
game[crow + ][col] = game[crow][col];
game[crow][col] = ;
}
else
{
//合并
if(game[crow + ][col] == game[crow][col])
{
game[crow + ][col] *= ;
game[crow][col] = ;
} }
}
}
}
break;
case LEFT:
//最左边一列不动
for(int col = ; col < COL; ++col)
{
for(int ccol = col; ccol >= ; --ccol)
{
for(int row = ; row < ROW; ++row)
{
//上一个格子为空
if(game[row][ccol-] == )
{
game[row][ccol - ] = game[row][ccol];
game[row][ccol] = ;
}
else
{
//合并
if(game[row][ccol - ] == game[row][ccol])
{
game[row][ccol - ] *= ;
game[row][ccol] = ;
} }
}
}
}
break;
case RIGHT:
//最右边一列不动
for(int col = COL - ; col >= ; --col)
{
for(int ccol = col; ccol <= COL - ; ++ccol)
{
for(int row = ; row < ROW; ++row)
{
//上一个格子为空
if(game[row][ccol + ] == )
{
game[row][ccol + ] = game[row][ccol];
game[row][ccol] = ;
}
else
{
//合并
if(game[row][ccol + ] == game[row][ccol])
{
game[row][ccol + ] *= ;
game[row][ccol] = ;
} }
}
}
}
break;
} } //处理输入输出,返回上下左右
int Input()
{
//读取上下左右四个方向键
int upArrow = ;
int downArrow = ;
int leftArrow = ;
int rightArrow = ;
int direction = ;
while (true)
{
upArrow = GetAsyncKeyState(VK_UP);
downArrow = GetAsyncKeyState(VK_DOWN);
leftArrow = GetAsyncKeyState(VK_LEFT);
rightArrow = GetAsyncKeyState(VK_RIGHT); if(upArrow)
{
direction = UP;
break;
}
else if(downArrow)
{
direction = DOWN;
break;
}
else if(leftArrow)
{
direction = LEFT;
break;
}
else if(rightArrow)
{
direction = RIGHT;
break;
} Sleep();
} return direction;
} //判断游戏状态
int Judge()
{
//赢得游戏
for(int i = ; i < ROW; ++i)
{
for(int j = ; j < COL; ++j)
{
if(game[i][j] == )
{
return GAME_WIN;
break;
}
}
} //横向检查
for(int i = ; i < ROW; ++i)
{
for(int j = ; j < COL - ; ++j)
{
if(!game[i][j] || (game[i][j] == game[i][j+]))
{
return GAME_CONTINUE;
break;
}
}
}
//纵向检查
for(int j = ; j< COL; ++j)
{
for(int i = ; i < ROW -; ++i)
{
if(!game[i][j] || (game[i][j] == game[i+][j]))
{
return GAME_CONTINUE;
break;
}
}
} //不符合上述两种状况,游戏结束
return GAME_OVER; } int main()
{
//设置一个随机数种子
srand((unsigned int)time());
CreateNumber();
CreateNumber();
Print();
int direction = ;
int gameState = -;
while(true)
{
direction = Input(); gameState = Judge();
if(direction && gameState == GAME_CONTINUE)
{
Process(direction);
CreateNumber();
Print();
Sleep();
}
else if(gameState == GAME_WIN)
{
Print();
cout << "You Win!" << endl;
break;
}
else if(gameState == GAME_OVER)
{
Print();
cout <<"You lose!" << endl;
break;
}
} return ;
}
[C++项目]2048控制台游戏的更多相关文章
- [c++项目]迷宫 控制台游戏
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #i ...
- c语言----<项目>_小游戏<2048>
2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...
- c#撸的控制台版2048小游戏
1.分析 最近心血来潮,突然想写一个2048小游戏.于是搜索了一个在线2048玩玩,熟悉熟悉规则. 只谈核心规则:(以左移为例) 1.1合并 以行为单位,忽略0位,每列依次向左进行合并,且每列只能合并 ...
- Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
- 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束
引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...
- .NET手撸2048小游戏
.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
- 控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...
- C# 开发2048小游戏
这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...
随机推荐
- QPainterPath 不规则提示框(二)
前一篇讲过不规则提示框,但是提示框的方向是固定的,不能达到随意变换方向的效果,本接讲述可以动态变换方向的提示框 先看效果图 图1 图2 图3 图4 如上图1所示,上一篇文章的代码可以达到类似效果 本 ...
- HttpClient在.NET Core中的正确打开方式
问题来源 长期以来,.NET开发者都通过下面的方式发送http请求: using (var httpClient = new HttpClient()) { var response = await ...
- 10分钟明白对偶建模法 / +Leampms的“主模型建模”和“对偶模型建模” 之 —— 三类最短路径问题
摘要 对偶模型建模是非常有独特的一种建模方式 —— 当问题本身要求指标极小的情况下,对偶模型表现为求极大.本文给出三种最短路径问题的线性规划/混合整数规划模型,其中的第三类最短路径问题采用对偶建模方法 ...
- https浅析
https浅析 http协议本身有着很大的缺陷 1. 通信使用明文,若被抓包,则直接被窃取信息 2. 不验证与自身通信者的身份,有可能遭到伪装 - 在数据传输的过程中,经过了某一计算机,该计算 ...
- Eclipse中安装git后pull远程仓库出现错误解决方法
该图中位置为false 在配置文件中添加如下语句 -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
- 基于Springboot集成security、oauth2实现认证鉴权、资源管理
1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...
- JAVA设计模式——简单工厂
工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式.我看有的书上和有的文章里是分为两种,没有简单工厂. 工厂模式主要的作用是:一个对象在实例化的时候可以选择多个类,在实例化的时候根据一些业务规 ...
- 关于elementui表单数字校验踩坑记
需求:1.输入类型是数字.2.数字大小有限制.3.非必填 做法: <el-form-item label="熟悉程度" prop="averageCaseRunTi ...
- java 设计模式 ---- 单例模式
只产生一个实例, 所以要使用静态方法对外暴露对象(如果使用反射技术, 也能调用私有的构造方法) 懒汉模式 并发时还是可能会产生多个实例, 所以同步处理 public class User{ priva ...
- Spark MLlib KMeans 聚类算法
一.简介 KMeans 算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇心的移动距离小于某个给定的值. ...