/*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++ 源代码分享的更多相关文章

  1. cocos2d-x开发的《派对小游戏》-github源代码分享

    这是博主非常久曾经写的一个cocos2d-x跨平台小游戏,我称它为<派对小游戏>,如今分享给大家.希望对大家有所帮助的话. 项目源代码地址:https://github.com/xieba ...

  2. C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!

    中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规 ...

  3. Android 带你玩转实现游戏2048 其实2048只是个普通的控件(转)

    1.概述 博主本想踏入游戏开放行业,无奈水太深,不会游泳:于是乎,只能继续开发应用,但是原生Android也能开发游戏么,2048.像素鸟.别踩什么来着:今天给大家带来一篇2048的开发篇,别怕不分上 ...

  4. Android 带你玩转实现游戏2048 其实2048只是个普通的控件

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40020137,本文出自:[张鸿洋的博客] 1.概述 博主本想踏入游戏开放行业,无 ...

  5. C语言小游戏: 2048.c

    概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...

  6. 开源游戏“2048”IOS移植版

    简介: 这个游戏是我在今年(2014/05)课余时闲着无聊做的一个益智类小游戏,总共花了4个工作日才完成,为了游戏的效率,做了很多优化,目前在IE5以上浏览器能够流畅运行,运行时如果屏幕分辨率不兼容, ...

  7. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  8. STM32F051 IAP源代码分享

    STM32F051 IAP源代码分享 假设不懂IAP的请自己主动脑补或者怒戳这里 http://www.openedv.com/posts/list/11494.htm 然后STM32F051的IAP ...

  9. 使用Jquery+EasyUI 进行框架项目开发案例解说之二---用户管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之二 用户管理源代码分享  在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享> ...

随机推荐

  1. C++中多态性学习(上)

    多态性学习(上) 什么是多态? 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数.虽然这看上去好像很高级的样子 ...

  2. 自学宝典:10个学习Android开发的网站推荐

    1. Android Developers 作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会. 2. Android Gui ...

  3. struts2一个实例中遇到的问题

    今天实现了一个登录功能的Struts2小程序. 期间遇到了许多问题,记忆犹新的是 (1)新版本的tomcat9和eclipse Neon Release (4.6.0) 发生了冲突,启动服务器的时候老 ...

  4. 2820: YY的GCD

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1693  Solved: 901[Submit][Status][Discu ...

  5. hdu 2108 Shape of HDU【判断多边形是否是凸多边形模板】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=2108 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  6. 2017-2018-1 20179209《Linux内核原理与分析》第十周作业

    设备与模块 设备分类 块设备 块设备可以以块为单位寻址,块大小随设备不同而不同:设备通常支持重定位操作,也就是对数据的随机访问.块设备的例子有外存,光盘等. 字符设备 字符设备不可寻址,仅供数据的流式 ...

  7. Linux安装samba

    说明:samba的作用是实现window环境和linux环境下的文件共享,相当于window里的网络邻居,有一定的价值,但是随着时代的发展,现在用各种ssh软件登录linux实现文件共享和传输的场景越 ...

  8. linux后台开发必备技能

    一.linux和os: 1.命令:netstat tcpdump ipcs ipcrm  这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 2.cpu 内存 硬盘 等等与系统性能调试相关的 ...

  9. shell 日期加减运算

    比如今日是2012-04-22 $ date -d "+1 day" +%Y-%m-%d 2012-04-23   $ date -d "-1 day" +%Y ...

  10. Flex中容器的完全隐藏

    在html中,但我们设置某个dom元素的display属性为none时,dom元素不可见且其占用空间从dom树上隐藏,而在Flex中,但我们把某个组件的visible属性visible设为false的 ...