热门游戏 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进行框架项目开发案例解说之中的一个---员工管理源代码分享> ...
随机推荐
- [Java开发之路](8)输入流和输出流
1. Java流的分类 按流向分: 输入流: 能够从当中读入一个字节序列的对象称作输入流. 输出流: 能够向当中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地能够是文件,并且通常都是 ...
- 星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5253 Solved: 2395[Submit ...
- (比赛)B - 棋盘问题(dfs)
B - 棋盘问题 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & %llu Practice POJ ...
- 记录-springMVC访问web-inf下文件问题+在jsp页面导入jquery插件路径不对问题
环境:spring + springMvc + mybatis + maven 关于在springMVC环境访问web-inf目录下文件,其一有在springMVC xml文件下加 <!-- 对 ...
- apache .htaccess实现301重定向
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On #301定向 RewriteCond %{HTTP_HO ...
- php递归删除所有文件
function del_file($dir) { if (@rmdir($dir)==false && is_dir($dir)) { if ($dp = opendir($dir) ...
- 【android】在Service的onStartCommand()中调用stopself()应该注意的问题
在Service的onStartCommand()中调用stopself()后并不会立马destroy掉service,而是等onStartCommand()运行完才destroy. public c ...
- sublime 快捷键,左菜单乱码
sublime 快捷键安装 packagecontrol https://packagecontrol.io/installation#st3 import urllib.request,os,has ...
- Symfony 上传图片教程
介绍:我使用的Bundle:"vich/uploader-bundle": "^1.4"; "liip/imagine-bundle": & ...
- sin6_addr打印:string to sockaddr_in6 and sockaddr_in6 to string
函式原型: #include <arpa/inet.h> const char *inet_ntop(int af, const void *src, char *dst, socklen ...