2048游戏的棋牌游戏回放功能实现用command可以实现吗

西西软件园多重安全检测下载网站、值得信赖的软件下载站!
→ 2048高级技巧、2048游戏几种烦人情况的解决办法
6.0 安卓版
类型:休闲益智大小:5.6M语言:中文 评分:3.8
这是一款非常有趣的益智游戏,可能有些小伙伴对游戏的具体规则还不是很清楚,话说小编为了搞清规则被折磨个半死啊,相信你玩过这款游戏后只会有一个想法,欲罢不能!真的是一款让你又爱又恨的游戏,太折磨人了!为什么有人能轻松地打破2048有人只能在512和1024附近挣扎呢?游戏方法和策略问题啊!看着微博人人朋友圈上挣扎的大家,动动君决定在这里给大家提供一点技巧(只有高级技巧部分事附截图的)。首先,请明确一下你处在以下哪个阶段:1.256及以下――请遵循基本原则自己再多玩几次。2.512,偶尔1024――请从初级技巧开始看。3.通常是+………偶尔能通关――请直接看技巧攻略。2048高级技巧主要探讨几种烦人情况的解决办法:情况一:角落被占据。实际游戏中常常出现这种情况:玩得好好的结果一不小心或者迫不得已放弃了一下阵地,结果角落被较小的数占据了。(下图1,的左上角本来是512。)有的朋友可能会试图把最大数挪回角落,(如果方块很少,而且没有次大数的话,这个方法还是很好用的~),但如果格子已经比较满了,这种方法虽然也能行得通,但是为了实现这种挪动,用来“垫脚”的方块往往会变得混乱不堪,不利于游戏继续进行。所以这里我们要采取另一种做法。解决办法:――转移阵地。往次大数的方向连锁合并。除了挪动,还可以通过合并生成大数。为了使过程更简单迅速地完成,选择向次大数的方向进行合并。如上图2所示,我们设法在右上角处生成一个256,然后连续右移,让1024在右上角生成。这样子不仅又保证了最大数在角落,而且由于这种有计划的生成是和原本的游戏进程相同的,所以保证了整体局势的。(上面的最终图3没有开天窗,而且数字顺序和活动性都很好。)情况二:开天窗有时候由于大数行被迫移动等原因,会有很小的数夹杂在大数行中,这个问题不及时解决将有可能直接导致游戏失败。这里根据开天窗的情况不同,采取两种解决方案。解决办法①:合并封锁行方块。(适用于周围数不大的情况)。如下图1,一个2被困在3个16中间。这里我们选择将A方块变成32与B方块合并,同时实现C方块与D方块的合并,从而将数字2释放出来。对于释放出来的数字,增加到16的大小显得非常轻松。解决办法②:转移方向。(适用于周围数较大的情况)。这个的思路事实上和小的数是差不多的,合并周围的方块来释放小数字,只是大的数字合并之后飘荡在外不利于游戏进行,所以选择在边框生成新的数,将大数行转置过来。(顺便注意最终图右边那个16,违背了初级技巧的第3条,所以这局虽然把调出来了,结果还是扑街了= =)情况三:竖着走?横着走?游戏中经常遇到纵向和横向都可以合并的情况,这种时候应该怎么选择呢?在数字较小的时候我们没有特定计划,按照初级技巧的第2条执行,当数字较大的时候,就要进一步分情况来决定了。(以下表述时一律假设大数行为水平方向的。)方法①:竖着走。竖着走适用于要生成的数不能进一步合并时。如上图1的情况,生成的64不能直接进行下一步合并,只能放置,由于第二行的32有更多的机会变成64,所以第一个机会来的时候,我们先考虑角落的32,向上移动生成64,即竖着走。方法②:横着走横着走适用于要生成的数要进行下一步合并时。如上图2的情况,考虑到我们接下来生成的64要和另一个64合并成128,然后再合并成256,这将在大数行形成两个空缺,使得两个小的数塞在里面,不利于游戏继续。此时选择横着走,使得角落的32能够停留在原位,生成256的时候顺势左移,大数行只会放入一个活动性良好的数字2,可以很容易地对其合并扩大。牢记初级技巧,特殊情况理智分析解决,就可以达到比较高的通关率了~可能有些基础的原则没有很好地概括出来,大家自己玩一玩好好感受一下吧!网上好像有AI通关版,所以其实这个是有完全的技巧的,大家可以自己尝试概括。动动君自己也不能保证100%通关,所以目前总结出来的技巧肯定也有很多不到位的地方。欢迎探讨和指正~祝没通关的大家早日打破2048~通关过的大家胜率大增~2048游戏高分攻略技巧:  2048攻略一:有耐心是2048游戏得高分的先决条件之一  2048攻略二:最大数尽可能放在角落  2048攻略三:数字按顺序紧邻排列  2048攻略四:首先满足最大数和次大数在的那一列/行是满的  2048攻略五:注意活动较大数(32以上)旁边要有相近的数  2048攻略六:以大数所在的一行为主要移动方向  2048攻略七:心态平和  2048攻略八:确定主次方向  2048攻略九:时刻注意活动较大数(32以上)旁边要有相近的数  2048攻略十:不要急于“清理桌面”  需要注意的是,为了保持最大数在角落,所有最大数可能移动的方向都不能再操作了,比如选择了左上角,那么就不能向右和向下移动其他的方块,这样操作的灵活性会相对减少,难度就会增加。  这时,建议玩家除了选定一个角以外,再固定一条边,将大的数字放这条边上,这样就可以朝三个方向移动,比如选定左上角,填满最大数右边的所有方块,就可以朝上,左,右三个方向移动了。技巧攻略:1.最大数尽可能放在角落。2.数字按顺序紧邻排列。初级技巧总结起来是以下几条:1.首先满足最大数和次大数在的那一列/行是满的。2.确定主次方向。3.时刻注意活动较大数(32以上)旁边要有相近的数。4.不要急于“清理桌面”。
数字手机游戏下载大全西西软件园为大家带来了大量的数字类游戏,各种款式的趣味数字游戏或者相对枯燥单调,考验大家大脑运算能力的高难度数字游戏都有哦,想玩就来找找看吧!数字手游排行榜2016集合了各种好玩的数字类手游,我们将在游戏中领略到操作和计算的完美融合,同时也必须学会应对各种彩色、旋转、障碍物和时间限制的干扰!喜欢就来西西软件园免费下载!...
04-25 / 5.6M
推荐理由:&#游戏原始版玩起来很简单,游戏开始,在4x4的棋盘上有两个数字,通过方向键移动它们。每次移动,
04-01 / 418KB
推荐理由:2048朝代版玩法和2048数字版一样,可以选择上下左右其中一个方向去滑动,不同的是将数字变成了中国自夏开始
10-23 / 2.1M
推荐理由:2048传奇是一款休闲益智小游戏,4x4的棋盘上有两个数字,通过手指滑动操纵数字移动。每次移动,棋盘上都会增
04-02 / 4.1M
推荐理由:最近2048火的一B呀!但这个游戏有一个特点就是一步走错满盘皆输啊,2048悔棋版就不要担心下错不能反悔的问题
04-03 / 3.5M
推荐理由:2048这款游戏一伙,众多带有中国特色的山寨制作就直接往外冒,但是不可否认,这些游戏玩起来蛮有意思,呵呵
04-16 / 2.8M
推荐理由:超级耐玩上瘾游戏2048相信大家都有所耳闻,气势汹汹如长虹之势,一下冲进了我们的游戏世界。2048加强版游戏
2048游戏是最近特别多人玩的一款游戏,有手机版和网页版两个版本。但是基本操作都一样,通过方向键操作,数字相同的话会合并。如果得到一个格子的数字达到2048就算获胜。西西本页提供2048游戏下载大全官方介绍:2048NumberPuzzleOriginals是比较流行的一款数字游戏。最早出现于github,是作者基于《1024》和《小3传奇》的玩法开发的。随后2048便出现各种版本,走各大平台。2048游戏哪个版本好玩?2048游戏现在出现了越来越多的版本...
04-25 / 5.6M
推荐理由:&#游戏原始版玩起来很简单,游戏开始,在4x4的棋盘上有两个数字,通过方向键移动它们。每次移动,
04-01 / 418KB
推荐理由:2048朝代版玩法和2048数字版一样,可以选择上下左右其中一个方向去滑动,不同的是将数字变成了中国自夏开始
04-16 / 2.8M
推荐理由:超级耐玩上瘾游戏2048相信大家都有所耳闻,气势汹汹如长虹之势,一下冲进了我们的游戏世界。2048加强版游戏
04-02 / 4.1M
推荐理由:最近2048火的一B呀!但这个游戏有一个特点就是一步走错满盘皆输啊,2048悔棋版就不要担心下错不能反悔的问题
04-03 / 3.5M
推荐理由:2048这款游戏一伙,众多带有中国特色的山寨制作就直接往外冒,但是不可否认,这些游戏玩起来蛮有意思,呵呵
05-19 / 10.1M
推荐理由:2048的又一版本,这个版本我玩着有点晕,超难啊有没有。41432分,一个2048一个1024,两组128和256,最后失败
05-0804-2804-2404-0304-0204-0201-1301-1301-1301-12
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载资料图鉴:教程速查:
当前位置:
2048游戏在我的世界实现教程 在游戏中玩游戏
小编:3F时间: 09:46
  2048游戏在我的世界实现教程 在游戏中玩游戏。那下面给大家分享的则是我的世界中事项2048小游戏的教程哦~那不知道怎么在command_block下的思路与实现中制作2048的玩家不妨进来看看下面的教程吧!希望对大家有所帮助。
  游戏园我的世界官方群: 或 &欢迎各路喜爱我的世界的小伙伴们加入讨论!
  玩服务器的小伙伴们可以加入:&群一起联机玩游戏哦!
  如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址:
  如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击&&&&&&进行投稿哦~&有奖品哦~
密码:hegn
  2048在command_block下的思路与实现
  &说明&
  建议版本:1.9.4以上
  开发版本:1.9.4
  本作品只完成了2048一个方向的移动合并,其余三个方向均未动工,但是其余三个方向的移动合并方式与已完成的一个方向完全相同,如果有谁再问为什么没有做完的直接打脸(* ̄︶ ̄)y,本作品旨在演示原理。
  &基本操作方法&
  棕色羊毛的踏板开始新一轮游戏
  四边上的踏板代表向四个方向移动数字(虽然只完成了一个方向)
分享到:更多
类型:休闲娱乐平台:PC,iOS,安卓
游戏大礼包手游开测表
剑与家园光棍节脱单礼包烈焰龙城激活码魔法王座大电影上线礼包古剑绝学撩妹礼包剑与家园狂欢节装扮礼包光明大陆万圣节糖果礼包
11-03公测11-02内测10-31内测10-26内测10-26公测10-2410-19内测09-29公测09-2809-27公测
攻略推荐本月最新
手游排行网游单机利用C语言实现2048小游戏的方法
投稿:daisy
字体:[ ] 类型:转载 时间:
2048是比较流行的一款数字游戏,相信对大家来说都不陌生,这篇文章给大家分享了利用C语言实现2048小游戏的方法,对大家学习理解C语言具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的。
了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作:
&&& 1、将所有数字向一个方向移动至中间没有空位
&&& 2、将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上
另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录。
同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示。
首先的问题就是光标键的输入。光标键属于功能键,使用常规的scanf当然是无法进行读取的,而使用更加接近硬件的getch()进行以字节为单位的标准输入。当使用getch()函数进行标准输入时,如果用户输入了一个功能键,例如光标键、Home、PgUp、PgDn、End之类的键,getch()将能够读取得到两个字符。当遇到功能键输入的时候,可以编写一个检测程序以获取对应按键的数据:
#include&stdio.h&
int main(){
printf("%d\n",getch());
随后运行这个数据提取程序,程序将按照一个字节一行,以整型的格式输出getch得到的数据。这里我查询到2048需要用到的四个按键↑↓←→对应的两个字节为:
然后就是游戏的主要的代码
#include&stdio.h&
//标准输入输出
#include&stdlib.h&
//基本工具函数
#define bool int
//C里边没有布尔类型,就自己造
#define true 1
//bool的两种值
#define false 0
int MAP[4][4]= {0};
//地图,默认0认为是空位
typedef enum {
//定义一个方向类型的枚举变量
void printMap();
//绘制图形
Direction getNextDirection(); //从键盘读入下一个用户操作
bool canMove(Direction direction); //判断是否可以进行指定方向的操作
void doAction();
//游戏事件
void move(Direction direction);
//移动数字
void putNew();
//放入一个新的数字
int main() {
Direction nextS
srand(time(0));
//游戏开始默认放两个数字
printMap();
//打印格子
while(1) {
if(!canMove(UP)&&!canMove(LEFT)&&!canMove(DOWN)&&!canMove(RIGHT)) //任意方向都不能移动,那么终止游戏
nextStep=getNextDirection();
//获取下一个用户操作
if(nextStep==UNKNOW)
//如果不知道用户按了个什么键或者用户胡乱按的,那么进入新的循环
if(!canMove(nextStep)) //如果下一步不可继续操作,进入新的循环
system("cls");
//对于Windows来说,执行命令行命令cls清屏
doAction(nextStep);
//执行操作
//放新的数字
printMap();
//打印格子
printf("You Died!");
//提示游戏结束
//等待游戏结束
void printMap() {
printf("*-------*-------*-------*-------*\n");
for(i=0; i&4; i++) {
printf("|");
for(j=0; j&4; j++) {
MAP[i][j]?printf("%d",MAP[i][j]):printf(" ");
printf("\t|");
printf("\n");
printf("*-------*-------*-------*-------*\n");
void doAction(Direction direction){
int i,j,k;
* 为了方便处理问题,将每个方向的运动操作简化为三步
* 1.将数字归并到一个方向
* 2.处理相同数字可消,并将消掉的数据定为0
* 3.再次将数字归并到一个方向
//1.移动数字,取消数字之间的空位
move(direction);
//2.按照方向处理相同数字
switch(direction){
//按列枚举
for(i=0;i&4;i++){
//对于每一行的每一个元素
for(j=0;j&3;j++){
//如果元素非零,并且当前和下一个相同,当前的翻倍,下一个置零
if(MAP[j][i]&&MAP[j][i]==MAP[j+1][i]){
MAP[j][i]+=MAP[j+1][i];
MAP[j+1][i]=0;
case LEFT://同上
for(i=0;i&4;i++)
for(j=0;j&3;j++)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1]){
MAP[i][j]+=MAP[i][j+1];
MAP[i][j+1]=0;
case DOWN://同上
for(i=0;i&4;i++)
for(j=3;j&0;j--)
if(MAP[j][i]&&MAP[j][i]==MAP[j-1][i]){
MAP[j][i]+=MAP[j-1][i];
MAP[j-1][i]=0;
case RIGHT://同上
for(i=0;i&4;i++)
for(j=3;j&0;j--)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j-1]){
MAP[i][j]+=MAP[i][j-1];
MAP[i][j-1]=0;
//3.移动数字,取消因为上一步置零过程中新产生的空位
move(direction);
void move(Direction direction) { //移动数字
int i,j,k;
switch(direction) {
//按列枚举
for(i=0;i&4;i++)
//对于每一行的每一个元素
for(j=0;j&4;j++)
//如果非零,那么应当取消当前位置,后边元素向前移动
if(!MAP[j][i]){
for(k=j;k&3;k++){
MAP[k][i]=MAP[k+1][i];
//新产生的空位置零
MAP[k][i]=0;
case LEFT://同上
for(i=0;i&4;i++)
for(j=0;j&4;j++)
if(!MAP[i][j]){
for(k=j;k&3;k++){
MAP[i][k]=MAP[i][k+1];
MAP[i][k]=0;
case DOWN://同上
for(i=0;i&4;i++)
for(j=3;j&=0;j--)
if(!MAP[j][i]){
for(k=j;k&0;k--){
MAP[k][i]=MAP[k-1][i];
MAP[k][i]=0;
case RIGHT://同上
for(i=0;i&4;i++)
for(j=3;j&=0;j--)
if(!MAP[i][j]){
for(k=j;k&0;k--){
MAP[i][k]=MAP[i][k-1];
MAP[i][k]=0;
bool canMove(Direction direction) { //判断是否可以进行指定方向的操作
switch(direction) {
//依次检查每一列
for(i=0;i&4;i++){
//首先排除在远端的一串空位,直接将j指向第一个非零元素
for(j=3;j&=0;j--)
if(MAP[j][i])
//j&0代表这一列并非全部为0
//依次检查每一个剩余元素,遇见空位直接返回true
for(;j&=0;j--)
if(!MAP[j][i])
//依次检查相邻的元素是否存在相同的非零数字
for(j=3;j&0;j--)
if(MAP[j][i]&&MAP[j][i]==MAP[j-1][i])
case DOWN://同上
for(i=0;i&4;i++){
for(j=0;j&4;j++)
if(MAP[j][i])
for(;j&4;j++)
if(!MAP[j][i])
for(j=0;j&3;j++)
if(MAP[j][i]&&MAP[j][i]==MAP[j+1][i])
case LEFT://同上
for(i=0; i&4; i++){
for(j=3;j&=0;j--)
if(MAP[i][j])
for(;j&=0;j--)
if(!MAP[i][j])
for(j=0;j&3;j++)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1])
case RIGHT://同上
for(i=0; i&4; i++){
for(j=0;j&4;j++)
if(MAP[i][j])
for(;j&4;j++)
if(!MAP[i][j])
for(j=0;j&3;j++){
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1])
//当允许条件都被检查过后,返回不可执行的结果
Direction getNextDirection() {
//第一个字节必须是224,否则判定输入的不是功能键
if(getch()!=224) return UNKNOW;
//根据第二字节对应出来用户的操作
switch(getch()) {
return UP;
return DOWN;
return LEFT;
return RIGHT;
return UNKNOW;
void putNew(){
//为了方便操作,临时存储一下所有空闲格子的指针,这样可以用一个线性的内存随机访问实现对所有空位中任一空位的随机访问.
int* boxes[16]={NULL};
//用来临时保存目标格子的地址
//统计一共有多少个有效空格
int count=0;
//统计空位,发现空位即保存地址并累加计数器
for(i=0;i&4;i++)
for(j=0;j&4;j++)
if(!MAP[i][j]){
boxes[count]=&MAP[i][j];
if(count){
//如果有空位,那么对这一位进行随机赋值操作,对于每一位可能性是相同的
target=boxes[rand()%count];
//50%可能出现2 50% 可能出现4
*target=rand()%2?2:4;
以上就是这篇文章的全部内容了,小编认为像俄罗斯方块、2048这些稍微偏算法的小游戏是程序员必写的几个小程序。希望这篇文章对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具游戏2048——那些年我们追过的脸萌 - 推酷
游戏2048——那些年我们追过的脸萌
这是一款意外蹿红的小游戏,简单、益智,符合当代年轻人的气息,无须学习复杂的规则便可以得心
应手,并且愈玩愈烈。简单介绍后,接下来就分析一下该游戏的界面实现和功能实现。
在界面的实现方面,我们需要考虑会用到哪些API类,分别如下:
布局:FlowLayout,BorderLayout;组件:JFrame,JPanel,JButton,JTextField;绘图:Graphics
,Color,Image;事件接口:KeyListener,KeyEvent,ActionListener,ActionEvent;组件大小:
Dimension;菜单:JMenuBar,JMenu,JMenuItem。首先,我们需要创建一个窗体,并且设置大小、题
目、位置、可见等。然后整个界面应采用边框布局,分别是北边、南边和中间,而北边面板应采用流
式布局来安排得分和最高分。北边面板需添加两个文本框以显示分数,并设置成不可更改的形式。南
边面板添加一个开始按钮使得游戏失败后还可以继续玩。中间面板需要一个四乘四的格子,我采用画
矩形的方法,先画一个背景深粉色矩形,再在上面通过画笔类用双层循环画出16个小矩形,然后需要
在格子上绘制图片,我们采用Image抽象类来添加并显示图片。接着我们可以添加一个简单的菜单以及
子菜单。最后我们需要在事件源文本框、按钮、中间面板分别添加监听器,使得可以监听动作的发生
和键盘的按下或释放。这样子一个2048游戏界面就大概实现了。顺便为自己提些注意事项:第一,界
面Game2048类继承了JPanel类,所以在写北边和南边面板方法的时候应该将JFrame作为参数。ps:其
实我还是没懂为什么要继承JPanel类,有没有大神回复一下;第二,JTextField应该定义为全局变量
,以便在设置分数的时候可以传递参数到功能实现的类里边;第三,创建画笔对象应该在窗体可见之
后;第四,由于游戏主界面是表格形式,所以图片的存放应该设置为二维数组;第五,绘制画图板的
时候,应该调用父类的paint()方法;第六,为了让键盘监听中间面板得以更好的实现,应该将文本框
及按钮的焦点设置为false。
import java.awt.BorderL
import java.awt.C
import java.awt.D
import java.awt.F
import java.awt.FontM
import java.awt.G
import java.awt.GridL
import java.awt.I
import java.awt.LayoutM
import java.awt.R
import java.awt.S
import java.awt.image.ImageO
import java.text.AttributedCharacterI
import java.util.R
import javax.swing.ImageI
import javax.swing.JB
import javax.swing.JF
import javax.swing.JM
import javax.swing.JMenuB
import javax.swing.JMenuI
import javax.swing.JP
import javax.swing.JS
import javax.swing.JTextF
public class Game2048 extends JPanel {
int array[][]=new int[4][4];
private Random rand=new Random();
private JTextField jte=new JTextField(&得分:&);
private JTextField jte1=new JTextField(&最高分:&);
private JButton jbu=new JButton(&START&);
private boolean flag=
public static void main(String[] args) {
Game2048 game =new Game2048();
game.initUI();
public void initUI(){
JFrame jf=new JFrame();
jf.setTitle(&那些年我们追过的脸萌&);
jf.setSize(435, 560);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setLayout(new BorderLayout());
initNorth(jf);
initSouth(jf);
initMenu(jf);
this.setBackground(Color.WHITE);
jf.add(this,BorderLayout.CENTER);
jf.setVisible(true);
this.setFocusable(true);
Graphics g=this.getGraphics();
GameListener lis=new GameListener(this,g,array,jte,jte1);
this.addKeyListener(lis);
jbu.addActionListener(lis);
private void drawBackground(Graphics g){
g.setColor(new Color(255,155,255));
g.fillRoundRect(5, 5,410,410, 15, 15);
g.setColor(new Color(255,181,255));
for(int i=0;i&4;i++)
for(int j=0;j&4;j++)
g.fillRoundRect(15+j*100,15+i*100,90,90, 15, 15);
private void drawRC(){
int name1=(rand.nextInt(2)+1)*2;
int name2=(rand.nextInt(2)+1)*2;
int r1=rand.nextInt(4);
int c1=rand.nextInt(4);
int r2=rand.nextInt(4);
int c2=rand.nextInt(4);
while(r1==r2&&c1==c2){
r2=rand.nextInt(4);
c2=rand.nextInt(4);
array[r1][c1]=name1;
array[r2][c2]=name2;
System.out.println(r1 + &
System.out.println(r2 + &
private void drawImage(Graphics g){
for(int r=0;r&4;r++){
for(int c=0;c&4;c++){
if(array[r][c]!=0){
Image image=new ImageIcon(this.getClass().getResource(array[r][c]+&.jpg&)).getImage();
g.drawImage(image,15+c*100, 15+r*100,90,90, null);
public void paint(Graphics g){
super.paint(g);
drawBackground(g);
drawImage(g);
public void setFlag(boolean flag){
this.flag=
public void initNorth(JFrame jf){
JPanel jpanel=new JPanel();
jpanel.setBackground(new Color(255,155,255));
jte.setPreferredSize(new Dimension(100, 30));
jte.setEditable(false);
jpanel.add(jte);
jte.setFocusable(false);
jte1.setPreferredSize(new Dimension(100, 30));
jte1.setEditable(false);
jpanel.add(jte1);
jte1.setFocusable(false);
jf.add(jpanel,BorderLayout.NORTH);
public void initSouth(JFrame jf){
JPanel jpanel=new JPanel();
jpanel.setBackground(new Color(255,155,255));
jpanel.add(jbu);
jbu.setFocusable(false);
jf.add(jpanel,BorderLayout.SOUTH);
public void initMenu(JFrame jf){
JMenuBar jme=new JMenuBar();
String [] array={&文件&,&编辑&,&查看&,&帮助&};
String [][] arrayItem={{&新建&,&打开&,&保存&},{&撤销&,&重复&,&剪切&},{&工具箱&,&颜料盒&},{&帮助主题&,&关于2048&}};
for (int i=0;i&array.i++){
JMenu jm=new JMenu(array[i]);
for(int j=0;j&arrayItem[i].j++){
if(!arrayItem[i][j].equals(&&)){
JMenuItem jmenu=new JMenuItem(arrayItem[i][j]);
jm.add(jmenu);}
JSeparator separ = new JSeparator();
jme.add(separ);
jme.add(jm);
jf.setJMenuBar(jme);
在功能的实现方面,我们需要考虑事件的监听及游戏实现的算法。事件里的事件源是你的动作发生所
在的组件上,事件监听器的添加方法是add**Listener(**Listener l),事件处理类是接口的子类,因
为接口不能创建对象,并且要实现事件处理类的所有方法,其中需要重写动作监听方法,从而获取开
始按钮信息并设置开始,以及设置分数、显示分数情况。根据简单的游戏规则,也就是1、开始时随机
出现两个分数为2或4的图片2、按下键盘的上下左右键所有的图片随之移动,并且碰到相邻且相同的图
片可以相加形成相应分数的图片,判断如果有相加或者移动就再随机生成一张分数为2或4的图片3、相
加后要设置分数的改变4、判断如果出现分数为2048的图片则跳出文本框提示玩家已经胜利了5、判断
如果所有格子都已经满了,且相邻的所有格子都无法相加,则跳出文本框提示玩家已经输了,可以重
新开始。移动和相加部分是该游戏的精髓,所以进简单分析一下:如果是先移动再相加就会出现一个
问题,就是相加完之后还需要再移动一次,才能保证上下左右键正常工作,所以我们采取先相加再移
动的策略。先判断当前格子是否不为0,如果不为0则判断是否相同再相加,不过这会出现一个问题,
就是相邻的格子为0,但是再下一个格子与之相同,所以应该先判断相邻是否为空,如果为空则循环继
续,如果不为空则判断是否相同,如果相同便可以相加,如果不同则跳出循环;然后是移动问题,移
动主要根据上下左右键,通过循环判断相应的下一个格子是否为空,如果是空的格子则可以移动,也
就是交换格子的内容。最后再提几个注意点:第一,应该写一个构造函数,从而可以传递界面的一些
参数;第二,可以设置标志位boolean flag = false来判断是否有移动或者相加情况,从而选择是否
继续执行一些方法;第三,判断是否失败的方法中,需要判断两种情况,也就是格子是否都满了和是
否不能再移动了,第一种情况中可以通过循环判断每个格子是否都不为0,然后再用一个计数器来累积
判断次数,如果有16次也就是符合情况了,第二种情况中可以判断左上角的9个格子中与右边及下面相
邻的格子是否有相同的,再判断第四列与下面相邻的格子中是否有相同的和第四行中与下面相邻的格
子中是否有相同的,同样给一个计数器,如果最总计数结果为0次,则已经不能再移动,如果两种情况
同时成立,则输了(这是顾大神教我的)。
import java.awt.G
import java.awt.I
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.KeyE
import java.awt.event.KeyL
import java.awt.event.MouseE
import java.awt.event.MouseL
import java.util.R
import javax.swing.ImageI
import javax.swing.JOptionP
import javax.swing.JTextF
public class GameListener implements KeyListener, ActionListener {
private int[][]
private Game2048
private boolean flag =
private JTextField jte,jte1;
public int count=0;
private int max_
private Random rand = new Random();
public GameListener(Game2048 a, Graphics g, int[][] array, JTextField jte,JTextField jte1) {
this.array =
this.jte =
this.jte1 = jte1;
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(&START&)) { // e.getSource()返回的是一个对象(事件源)
jte.setText(&得分:&+count);
public void start() {
for (int i = 0; i & 4; i++) {
for (int j = 0; j & 4; j++) {
array[i][j] = 0;
a.setFlag(true);
a.paint(g);
public void keyTyped(KeyEvent e) {
public void keyPressed(KeyEvent e) {
private void randomAC() {
Random rand = new Random();
int name = (rand.nextInt(2) + 1) * 2;
int r = rand.nextInt(4);
int c = rand.nextInt(4);
while (array[r][c] != 0) {
r = rand.nextInt(4);
c = rand.nextInt(4);
array[r][c] =
public void stop(){
for (int i = 0; i & 4; i++) {
for (int j = 0; j & 4; j++) {
if(array[i][j]!=0){
for(int r=0;r&3;r++){
for(int c=0;c&3;c++){
if(array[r][c]==array[r][c+1]&&array[r][c]!=0){
if(array[r][c]==array[r+1][c]&&array[r][c]!=0){
for(int r=0;r&3;r++){
if(array[r][3]==array[r+1][3]&&array[r][3]!=0) {
for(int c=0;c&3;c++){
if(array[3][c]==array[3][c+1]&&array[3][c]!=0){
if(t==16&&p==0){
JOptionPane.showMessageDialog(a, &您输了&);
if(count&max_score){
max_score=
jte1.setText(&最高分&+max_score);
}else if(count&max_score){
for (int r = 0; r & 4; r++) {
for (int c = 0; c & 4; c++) {
array[r][c] = 0;
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
switch (keyCode) {
case 37:// 左键
relLeft();
if (flag) {
for (int i = 0; i & 4; i++) {
for (int j = 0; j & 4; j++) {
if(array[i][j]!=0){
if(t!=16){
randomAC();
a.repaint();
jte.setText(&得分:&+count);
case 38:// 上键
if (flag) {
for (int i = 0; i & 4; i++) {
for (int j = 0; j & 4; j++) {
if(array[i][j]!=0){
if(b!=16){
randomAC();
a.repaint();
jte.setText(&得分:&+count);
case 39:// 右键
relRight();
if (flag) {
for (int i = 0; i & 4; i++) {
for (int j = 0; j & 4; j++) {
if(array[i][j]!=0){
if(p!=16){
randomAC();
a.repaint();
jte.setText(&得分:&+count);
case 40:// 下键
relDown();
if (flag) {
for (int i = 0; i & 4; i++) {
for (int j = 0; j & 4; j++) {
if(array[i][j]!=0){
if(q!=16){
randomAC();
a.repaint();
jte.setText(&得分:&+count);
if(count==2048){
JOptionPane.showMessageDialog(a, &您的分数达到2048,您赢了&);
public void relLeft() {
for (int r = 0; r & 4; r++) {
for (int c = 0; c & 4; c++) {
if (array[r][c] != 0) {
for (int c1 = c + 1; c1 & 4; c1++) {
if (array[r][c1] == 0) {
} else if (array[r][c] == array[r][c1]) {
array[r][c] += array[r][c1];
array[r][c1] = 0;
count+=array[r][c];
} else if (array[r][c] != array[r][c1]) {
for (int r = 0; r & 4; r++) {
for (int c = 0; c & 4; c++) {
if (array[r][c] == 0) {
for (int c1 = c + 1; c1 & 4; c1++) {
if (array[r][c1] != 0) {
array[r][c] = array[r][c1];
array[r][c1] = 0;
public void relRight() {
for (int r = 0; r & 4; r++) {
for (int c = 3; c &=0; c--) {
if (array[r][c] != 0) {
for (int c1 = c - 1; c1 &=0; c1--) {
if (array[r][c1] == 0) {
} else if (array[r][c] == array[r][c1]) {
array[r][c] += array[r][c1];
array[r][c1] = 0;
count+=array[r][c];
} else if (array[r][c] != array[r][c1]) {
for (int r = 3; r &= 0; r--) {
for (int c = 3; c &= 0; c--) {
if (array[r][c] == 0) {
for (int c1 = c - 1; c1 &= 0; c1--) {
if (array[r][c1] != 0) {
array[r][c] = array[r][c1];
array[r][c1] = 0;
public void relDown() {
for (int c = 0; c &4; c++) {
for (int r = 3; r &=0; r--) {
if (array[r][c] != 0) {
for (int r1 = r - 1; r1 &=0; r1--) {
if (array[r1][c] == 0) {
} else if (array[r][c] == array[r1][c]) {
array[r][c] += array[r1][c];
array[r1][c] = 0;
count+=array[r][c];
} else if (array[r][c] != array[r1][c]) {
for (int c = 3; c &= 0; c--) {
for (int r = 3; r &= 0; r--) {
if (array[r][c] == 0) {
for (int r1 = r - 1; r1 &= 0; r1--) {
if (array[r1][c] != 0) {
array[r][c] = array[r1][c];
array[r1][c] = 0;
public void relUp() {
for (int c = 0; c &4; c++) {
for (int r = 0; r &4; r++) {
if (array[r][c] != 0) {
for (int r1 = r + 1; r1 &4; r1++) {
if (array[r1][c] == 0) {
} else if (array[r][c] == array[r1][c]) {
array[r][c] += array[r1][c];
array[r1][c] = 0;
count+=array[r][c];
} else if (array[r][c] != array[r1][c]) {
for (int c = 0; c & 4; c++) {
for (int r = 0; r & 4; r++) {
if (array[r][c] == 0) {
for (int r1 = r + 1; r1 & 4; r1++) {
if (array[r1][c] != 0) {
array[r][c] = array[r1][c];
array[r1][c] = 0;
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 如何实现棋牌回放功能 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信