/*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. resin 4.0 项目的配置

    前一篇我们了解了resin中配置数据源,依照不同项目的要求我们进行数据源的配置,如多个项目共享多个数据源,一个项目配置多个数据源,以下我们来看看项目的部署方式: 1.在一个host(虚拟主机)下配置一 ...

  2. saltstack之nginx部署

    1./srv/salt/nginx目录树 . conf.sls file |--- nginx |--- nginx-1.5.1.tar.gz |--- nginx.conf |--- nginx_l ...

  3. Solr6.5创建core

    首先在solrhome(solrhome的路径和配置见中solr的web.xml)http://www.cnblogs.com/paulversion/p/6827949.html 中创建mycore ...

  4. 附004.Kubernetes Dashboard简介及使用

    一 Kubernetes dashboard简介 1.1 Web UI简介 dashboard是基于Web的Kubernetes用户界面.可以使用dashboard将容器化应用程序部署到Kuberne ...

  5. Android 新建一个类,在src新建一个类,使继承自活动

    一:先新建一个包 右键src,新建包: 二:包中新建类 右建包,新建类,将超类改为andorid.app.Activity

  6. Pairs of Integers

    Pairs of Integers You are to find all pairs of integers such that their sum is equal to the given in ...

  7. ConfigurableBeanFactory

    ConfigurableBeanFactory :关系如下 在上面这样的一个关系图中可以先看下SingletonBeanRegistry的源代码: package org.springframewor ...

  8. [Oracle]根据字段值全库搜索相关数据表和字段

    这个需求比较冷门,但对于在某些特定的情况下,还是会有这样的需要的.好在Oracle实现还比较方便,用存储过程则轻松实现. 查询字符串: create or replace procedure sear ...

  9. ElasticSearch(二十六)修改分词器及定制自己的分词器

    1.默认的分词器 standard 分词器 standard tokenizer:以单词边界进行切分standard token filter:什么都不做lowercase token filter: ...

  10. LOJ#10117. 「一本通 4.1 练习 2」简单题

    LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...