热门游戏 2048 C++ 源代码分享
/*By Reason*/
#include<iostream>
#include <iomanip>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#include <conio.h> //为了读取方向键
#include<windows.h>
using namespace std;
//srand( (unsigned)time( NULL ) ); //随机数种子 不能用在这里
int pane[][]; //棋盘
int N=; //2的n次方
void showpane() //显示棋盘
{
cout<<setw()<<"X2048 by Reason"<<endl;
cout<<setw()<<" |-----------------------|"<<endl;
for(int i=;i<=;i++)
{
cout<<setw()<<"";
for(int j=;j<=;j++)
{
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
cout<<setw()<<"|"<<setw()<<pane[i][j]; if(j==)
{
cout<<setw()<<"|"<<endl;
cout<<setw()<<" |-----------------------|"<<endl;
}
}
}
}
void newgame() //开始游戏
{
N=;
for(int i=;i<=;i++) //初始化棋盘
for(int j=;j<=;j++)
pane[i][j]=;
srand( (unsigned)time( NULL ) );
int m=rand()%;
int n=rand()%;
int p=rand()%;
int q=rand()%;
pane[m][n]=pane[p][q]=;
showpane();
}
int if2n(int x) //判断x是否是2的n次方
{
int flag=;
for(int n=;n<=;n++)
{
if(x==pow(,n))
{
flag=;
if(n>N)
N=n;
return flag;
}
}
return flag;
}
int upmove() //上移
{
int flag=;
for(int j=;j<=;j++)
for(int i=;i<;i++)
{
if(if2n(pane[i][j]+pane[i+][j])==)
{
pane[i][j]=pane[i][j]+pane[i+][j];
pane[i+][j]=;
flag=;
}
}
return flag;
}
int downmove() //下移
{
int flag=;
for(int j=;j<=;j++)
for(int i=;i>;i--)
{
if(if2n(pane[i][j]+pane[i-][j])==)
{
pane[i][j]=pane[i][j]+pane[i-][j];
pane[i-][j]=;
flag=;
}
}
return flag;
}
int leftmove() //左移
{
int flag=;
for(int i=;i<=;i++)
for(int j=;j<;j++)
{
if(if2n(pane[i][j]+pane[i][j+])==)
{
pane[i][j]=pane[i][j]+pane[i][j+];
pane[i][j+]=;
flag=;
}
}
return flag;
}
int rightmove() //右移
{
int flag=;
for(int i=;i<=;i++)
for(int j=;j>;j--)
{
if(if2n(pane[i][j]+pane[i][j-])==)
{
pane[i][j]=pane[i][j]+pane[i][j-];
pane[i][j-]=;
flag=;
}
}
return flag;
}
int testup() //能否上移测试
{
int flag=;
for(int j=;j<=;j++)
for(int i=;i<;i++)
{
if(if2n(pane[i][j]+pane[i+][j])==)
{
flag=;
}
}
return flag;
}
int testdown() //测试能否下移
{
int flag=;
for(int j=;j<=;j++)
for(int i=;i>;i--)
{
if(if2n(pane[i][j]+pane[i-][j])==)
{
flag=;
}
}
return flag;
}
int testleft() //测试能否左移
{
int flag=;
for(int i=;i<=;i++)
for(int j=;j<;j++)
{
if(if2n(pane[i][j]+pane[i][j+])==)
{
flag=;
}
}
return flag;
}
int testright() //测试能否右移
{
int flag=;
for(int i=;i<=;i++)
for(int j=;j>;j--)
{
if(if2n(pane[i][j]+pane[i][j-])==)
{
flag=;
}
}
return flag;
}
int panemax() //棋盘最大数
{
int max=pane[][];
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(pane[i][j]>max)
max=pane[i][j];
return max;
}
int ifwin() //判断是否胜利
{
int flag=;
if(panemax()==)
{
cout<<setw()<<"You Win!"<<endl;
flag=;
}
return flag;
}
int ifGameOver() //判断是否游戏结束
{
int flag=;
if(testup()+ testdown() + testleft() + testright() ==)
{
cout<<setw()<<"Game Over!"<<endl;
flag=;
}
return flag;
}
void addnewnumberup() //上移后添加新数
{
srand( (unsigned)time( NULL ) );
int n;
if(N==)
n=;
else
n=(rand()%(N)+);
int newnumber=pow(,n);
for(int i=;i>=;i--)
for(int j=;j<=;j++)
if(pane[i][j]==)
{
pane[i][j]=newnumber;
return;
}
}
void addnewnumberdown() //下移后添加新数
{
srand( (unsigned)time( NULL ) );
int n;
if(N==)
n=;
else
n=(rand()%(N)+); int newnumber=pow(,n);
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(pane[i][j]==)
{
pane[i][j]=newnumber;
return;
}
}
void addnewnumberleft() //左移后添加新数
{
srand( (unsigned)time( NULL ) );
int n;
if(N==)
n=;
else
n=(rand()%(N)+);
int newnumber=pow(,n);
for(int j=;j>=;j--)
for(int i=;i<=;i++)
if(pane[i][j]==)
{
pane[i][j]=newnumber;
return;
}
}
void addnewnumberright() //右移后添加新数
{
srand( (unsigned)time( NULL ) );
int n;
if(N==)
n=;
else
n=(rand()%(N)+);
int newnumber=pow(,n);
for(int j=;j<=;j++)
for(int i=;i<=;i++)
if(pane[i][j]==)
{
pane[i][j]=newnumber;
return;
}
}
int GetDirection() //读取方向
{
int ret = ; do
{
int ch = _getch();
if(isascii(ch))
continue; ch = _getch();
switch(ch)
{
case :
ret = ; // top
break;
case :
ret = ; // left
break;
case :
ret = ; // right
break;
case :
ret = ; // down
break;
default:
break;
}
} while (ret == ); return ret;
}
int main() //主函数
{
system("color f9");
int makesure=;
while(makesure)
{
system("cls");
newgame();
while(ifwin()+ifGameOver()==)
{
int c=GetDirection();
switch(c)
{
case :
upmove();
addnewnumberup();
system("cls");
showpane();
break;
case :
downmove();
addnewnumberdown();
system("cls");
showpane();
break;
case :
leftmove();
addnewnumberleft();
system("cls");
showpane();
break;
case :
rightmove();
addnewnumberright();
system("cls");
showpane();
break;
default:
break;
}
}
cout<<setw()<<"你的最后成绩为:"<<panemax()<<endl;
cout<<setw()<<"若要重新开始游戏请输入1,若要结束请输入0。"<<endl;
cin>>makesure;
while(makesure!=&&makesure!=)
{
cout<<"输入不正确,请重新输入!"<<endl;
cin>>makesure;
}
}
cout<<"再见!"<<endl;
system("pause"); }
热门游戏 2048 C++ 源代码分享的更多相关文章
- cocos2d-x开发的《派对小游戏》-github源代码分享
这是博主非常久曾经写的一个cocos2d-x跨平台小游戏,我称它为<派对小游戏>,如今分享给大家.希望对大家有所帮助的话. 项目源代码地址:https://github.com/xieba ...
- C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!
中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规 ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)
1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...
- Android 带你玩转实现游戏2048 其实2048只是个普通的控件
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40020137,本文出自:[张鸿洋的博客] 1.概述 博主本想踏入游戏开放行业,无 ...
- C语言小游戏: 2048.c
概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...
- 开源游戏“2048”IOS移植版
简介: 这个游戏是我在今年(2014/05)课余时闲着无聊做的一个益智类小游戏,总共花了4个工作日才完成,为了游戏的效率,做了很多优化,目前在IE5以上浏览器能够流畅运行,运行时如果屏幕分辨率不兼容, ...
- 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...
- STM32F051 IAP源代码分享
STM32F051 IAP源代码分享 假设不懂IAP的请自己主动脑补或者怒戳这里 http://www.openedv.com/posts/list/11494.htm 然后STM32F051的IAP ...
- 使用Jquery+EasyUI 进行框架项目开发案例解说之二---用户管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之二 用户管理源代码分享 在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享> ...
随机推荐
- 动态对象创建(二)重载new和delete
动态对象创建(二)重载new和delete 前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常 ...
- c#脚本控制shader
如图所示,c#脚本控制shader颜色. public class ControlColor : MonoBehaviour { , , , ); public Material mat; publi ...
- Java常用代码工具类相关
1.HttpServletRequest转换成Map public static Map<String,String> parseXML(HttpServletRequest reques ...
- PHP-Manual的学习----【入门指引】
2017年6月27日17:03:53 笔记:简介 PHP是什么? PHP能做什么?1.PHP("PHP: Hypertext Preprocessor",超文本预处理器 ...
- DrawRightEditText自定义EditText实现有内容时右侧图标按钮显示无内容时右侧图标按钮隐藏加上为空时晃动动画(二)
经过大神指导,上面封装的还不够全面,触摸事件应该也放进自定义中去,那么问题来了,怎么区分呢!,这就涉及到了自定义属性的介绍了 我通过设置属性来判断在onTouch事件中应该进行什么操作,接下来看看改良 ...
- 一个关于运维人员做事的很好的case,拿出来和大家共勉
很久没有写KM了,最近lester这边在梳理CDB这边存在的问题,并推动那些问题解决措施的落地.无疑当前CDB存在比较多的问题,也有很多坑.需要我们运维和开发的同学多思考问题的根源和解决办法,并付诸实 ...
- 【BZOJ3105】[cqoi2013]新Nim游戏 贪心+线性基
[BZOJ3105][cqoi2013]新Nim游戏 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个 ...
- Random Fourier Features
K-DSN 深度堆叠网络 Random Features for Large-Scale Kernel Machines To accelerate the training of kernel ma ...
- linux c编程:标准IO库
前面介绍对文件进行操作的时候,使用的是open,read,write函数.这一章将要介绍基于流的文件操作方法:fopen,fread,fwrite.这两种方式的区别是什么呢.1种是缓冲文件系统,一种是 ...
- 梯度下降算法(gradient descent)
简述 梯度下降法又被称为最速下降法(Steepest descend method),其理论基础是梯度的概念.梯度与方向导数的关系为:梯度的方向与取得最大方向导数值的方向一致,而梯度的模就是函数在该点 ...