java2048 毕业设计仿2048游戏项目中的类方法及功能描述

2048游戏制作过程(Java描述):第一节、创建项目 – Ivy – End
自从关于扫雷游戏制作过程的文章发布后,有同学让我写一些关于移动开发的文章,并且建议以雷电这款游戏为例。然而考虑到该项目对于初学者来说代码量较大,所以暂且不涉及这部分,转而使用较为简单的2048游戏作为例子,可能对于初学者来说更容易上手,并且也更容易自己动手实现出来。
本项目已根据文章进度托管在GitHub上:,读者可以自行查看。
由于没有Mac,因此只能介绍关于Android平台相关的开发知识。然而进行Android开发之前,需要搭建Android开发环境,这一步比较有难度的,主要是各个软件的配置较为麻烦,使得很多初学者望而却步。目前主流的IDE有Eclipse以及Android Studio,本文将以Android Studio作为集成开发环境,对2048游戏的开发过程进行详细的介绍。
然而Android Studio的配置并不如Visual Studio一样简单,下面将简单介绍一下Android Studio集成开发环境的部署,具体的细节步骤读者可以查阅相关资料。
安装JDK,根据自己的操作系统选择合适的JDK版本,我们常用的是Windows x64版本,;
安装Andorid Studio,;
启动Android Studio,配置Gradle,该部分较为繁琐,需要自行下载对应版本的Gradle包,读者可以参考相关资料。
(可选)安装Genymotion,也可以使用Android Studio默认的模拟器,但是速度较慢,。
至此,假设读者已经配置完成了Android开发环境并且能够正常运行了。接下来,我们进行2048游戏项目的创建。首先打开Android Studio,弹出如下图所示的界面:
单击Start a new Android Studio project创建一个新的Android Studio项目,弹出如下界面:
这里需要填写三个内容:
Application name,项目名称,这里我们填写”Game2048“;
Company Domain,开发者信息,常小数点分割每一个部分,读者可以修改这部分的内容为自己的信息;
Project location,项目地址,选择一个用以保存项目文件的位置。
单击Next,进入下一步:
这里需要我们选择该项目的使用平台,我们选择默认的Phone and Tablet,其中的Minimum SDK表示所兼容的最低API版本,我们保持默认。单击Next,进入下一步:
接下来需要选择应用的初始界面,由于我们的界面需要自己开发,所以这里不需要进行修改,直接默认即可。单击Next,进入下一步:
这里需要我们对上一步默认选择的Activity进行一些属性的填写,保持默认,单击Finish,完成项目的创建,稍作等待后,项目已经新建完成:
我们首先打开Genymotion,界面如下:
单击Start按钮,启动Android模拟器,界面如下:
若一开始打开时显示为横屏模式,只需要单击右侧的旋转屏幕按钮即可切换到竖屏模式。
接下来,我们切换到Android Studio中,选择Run菜单项中的Run ‘app’,也可以直接按工具栏中的快捷按钮,弹出如下的对话框:
如果我们的Genymotion模拟器打开的话,Android Studio会自动选择它作为默认的调试设备,这里我们直接单击OK即可,接着解锁模拟器中的Android系统,稍作等待,可以看到运行的Android应用:
接下来,我们需要将它的标题栏去掉。切换到Android Studio界面,双击打开左侧的app/manifests文件夹下的AndroidManifests.xml文件,修改高亮行代码如下图所示:
接下来找到左侧的app/res/menu文件夹下的menu_main.xml,右击Delete将其删除,在弹出的对话框中勾选Safe delete (with usage search)以及Search
in comments and strings这两个复选框,如下图所示:
程序显示找到了引用项目,因为我们在主界面中调用了这个菜单,否则不会显示这个菜单。我们单击Delete Anyway:
接下来,双击打开app/java/com.ivy.end.game2048文件夹(并非com.ivy.end.game2048(androidTest))下的MainActiviy文件,将其中多余的代码(即刚才检测到调用了菜单的部分)全部删除,最终结果如下图所示:
此时,再次运行程序,即可看到这样的效果:
下一节将介绍修改App的应用图标以及名称,并且进行最基本的界面布局。&java仿2048游戏实例源码
秒后自动跳转到登录页
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
视频课程推荐
java仿2048游戏实例源码
上传时间:
技术分类:
资源评价:
(48位用户参与评价)
已被下载&897&次
java仿2048游戏实例源码,网上看到的,觉得不错上传出来,供大家一起共同分享学习。
本资料共包含以下附件:
java仿2048游戏实例源码.rar
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
相关专题推荐
本专题收录Java经典编程的实例源码,
在国内的开发语言中,java凭借这简单
本套视频教程是韩顺平老师,循序渐进
北京圣思园张龙(风中叶)老师的Java
讲述Arm嵌入式Linux系统下的C语言编程
这段视频是从尚学堂科技的教学课堂上
本套视频共78集,是由郝斌老师根据多
本视频专题共180集涵盖了C语言概述中
本视频专题共107集涵盖了Java概述、数
由传智播客毕向东老师讲解的Java基础
本专题为spring视频教程,共31集。教
本专题为C语言黑客编程系列视频教程,
本专题为韩顺平讲解的Java从入门到精
本专题为Java Web项目开发案例精粹视
SSH为struts+spring+hibernate的一个
本专题为疯狂Java李刚老师讲解的Stru
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理2048游戏的Java实现
写的比较匆忙,功能较为单一,界面丑,操作步数应该还能优化。
最终还是要写AI,但好像没那么简单,写了几个关于格局评价的函数,还得继续学习。。。
上下左右方向键操作。
import java.awt.BorderL
import java.awt.C
import java.awt.F
import java.awt.GridL
import java.awt.event.*;
import java.util.R
import javax.swing.JF
import javax.swing.JL
import javax.swing.JOptionP
import javax.swing.JP
import javax.swing.JTextF
import javax.swing.border.TitledB
public class My2048 extends JFrame {
JPanel numpanel = new JPanel();
JPanel scorepanel = new JPanel();
JLabel numlabellist[][] = new JLabel[4][4];// 数字格子
int numlist[][] = new int[4][4];// 数组格子对应数值
int blanks = 16;// 空白格子数
int score=0;//总得分
JLabel scorelabel=new JLabel();
int numlist2[][] = new int[4][4];//用于格局评价时的数组
int smoothweight=1;
int monoweight=10;
int emptyweight=27;
int maxweight=10;
public static void main(String[] args) {
new My2048().launchFrame();
public void AddNumArea() {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
numlabellist[i][j] = new JLabel();
numlist[i][j] = 0;
numlabellist[i][j].setBackground(Color.LIGHT_GRAY);
numlabellist[i][j].setBorder(new TitledBorder(""));
numlabellist[i][j].setFont(new Font("Romantic", Font.BOLD, 35));
numlabellist[i][j].setHorizontalAlignment(JTextField.CENTER);
numpanel.add(numlabellist[i][j]);
public void AddScoreLabel(){
scorelabel.setBackground(Color.MAGENTA);
scorelabel.setFont(new Font("Romantic", Font.BOLD, 35));
scorelabel.setHorizontalAlignment(JTextField.CENTER);
scorelabel.setText("score:"+Integer.toString(score));
scorepanel.add(scorelabel);
// 随机选一个空白格子
public int RandomIndex(int blanks) {
Random random = new Random(System.currentTimeMillis());
int result = random.nextInt(blanks)+1;
// 2,4随机选一个
public int RandomValue() {
Random random = new Random();
int result = random.nextInt(2);
return (result+1)*2;
//空白处产生一新值,自带refresh功能
public void NewValue() {
int newvalue = RandomValue();// 新值
int index = RandomIndex(blanks);// 新值得位置
blanks--;// 空白格子数-1
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
if (numlist[i][j] == 0)
if (index == 0) {
numlist[i][j] =
// 相应label上显示新值
numlabellist[i][j].setText(Integer.toString(newvalue));
public boolean LeftReduce() {
boolean changed=//是否有改变(移动和相加),作为后续是否产生新值得依据
boolean has0
for (int i = 0; i < 4; i++)
has0before=
for (int j = 0; j 0&&has0before)//移动方向上之前有空格,可移动,changed为true
if(numlist[i][j]==0)
has0before=
if (numlist[i][j] > 0)
if(numlist[i][j]==value)//相加放p位置
int sum=value*2;
numlist[i][j]=0;
numlist[i][p]=
changed=//相加,changed为true
if(value>0)//value放p中,当前值放value中
numlist[i][p]=
value=numlist[i][j];
numlist[i][j]=0;
if(value>0)//到最后value中可能有值
numlist[i][p]=
public boolean RightReduce() {
boolean changed=//是否有改变(移动和相加),作为后续是否产生新值得依据
boolean has0
for (int i = 0; i = 0; j--)
if(numlist[i][j]>0&&has0before)//移动方向上之前有空格,可移动,changed为true
if(numlist[i][j]==0)
has0before=
if (numlist[i][j] > 0)
if(numlist[i][j]==value)//相加放p位置
int sum=value*2;
numlist[i][j]=0;
numlist[i][p]=
changed=//相加,changed为true
if(value>0)//value放p中,当前值放value中
numlist[i][p]=
value=numlist[i][j];
numlist[i][j]=0;
if(value>0)//到最后value中可能有值
numlist[i][p]=
public boolean UpReduce() {
boolean changed=//是否有改变(移动和相加),作为后续是否产生新值得依据
boolean has0
for (int j = 0; j <4; j++)
has0before=
for (int i = 0; i 0&&has0before)//移动方向上之前有空格,可移动,changed为true
if(numlist[i][j]==0)
has0before=
if (numlist[i][j] > 0)
if(numlist[i][j]==value)//相加放p位置
int sum=value*2;
numlist[i][j]=0;
numlist[p][j]=
changed=//相加,changed为true
if(value>0)//value放p中,当前值放value中
numlist[p][j]=
value=numlist[i][j];
numlist[i][j]=0;
if(value>0)//到最后value中可能有值
numlist[p][j]=
public boolean DownReduce() {
boolean changed=//是否有改变(移动和相加),作为后续是否产生新值得依据
boolean has0
for (int j = 0; j =0; i--)
if(numlist[i][j]>0&&has0before)//移动方向上之前有空格,可移动,changed为true
if(numlist[i][j]==0)
has0before=
if (numlist[i][j] > 0)
if(numlist[i][j]==value)//相加放p位置
int sum=value*2;
numlist[i][j]=0;
numlist[p][j]=
changed=//相加,changed为true
if(value>0)//value放p中,当前值放value中
numlist[p][j]=
value=numlist[i][j];
numlist[i][j]=0;
if(value>0)//到最后value中可能有值
numlist[p][j]=
public void Refresh(){
scorelabel.setText("score:"+Integer.toString(score));
for(int i=0;i<4;i++)
for(int j=0;j0)
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
if(numlist[i][j]==numlist[i][j+1])
for(int j=0;j<4;j++)
for(int i=0;i<3;i++)
if(numlist[i][j]==numlist[i+1][j])
public void Out(){
JOptionPane.showMessageDialog(null, "游戏结束!", "2048PC版", 2);
System.exit(0);
public void PrintNumlist() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++)
System.out.print(numlist[i][j]);
System.out.print(&#39; &#39;);
System.out.println();
System.out.println("***********************");
//单调率,后期乘以monoweight(干脆方法内乘了)
public int Mononess(){
int result1=0;//从右往左递增度量
int result2=0;//从上往下递增度量
int lastvalue=0;
for(int i=0;i<4;i++)
lastvalue=0;
for(int j=0;j0)
if(lastvalue>0)
if(numlist[i][j]lastvalue)
result1--;
lastvalue=numlist[i][j];
lastvalue=0;
for(int j=0;j<4;j++)
lastvalue=0;
for(int i=0;i0)
if(lastvalue>0)
if(numlist[i][j]>lastvalue)
result2++;
if(numlist[i][j]result1)
return result2*
return result1*
//平滑率,是负数,是差的和的相反数,后期乘以smoothweight(干脆方法内乘了)
public int Smoothness(){
int result1=0;//水平方向
int result2=0;//竖直方向
int lastvalue=0;
for(int i=0;i<4;i++)
lastvalue=0;
for(int j=0;j0)
if(lastvalue>0)
result1+=Math.abs(numlist[i][j]-lastvalue);
lastvalue=numlist[i][j];
lastvalue=0;
for(int j=0;j<4;j++)
lastvalue=0;
for(int i=0;i0)
if(lastvalue>0)
result2+=Math.abs(numlist[i][j]-lastvalue);
lastvalue=numlist[i][j];
if(result2>result1)
return (0-result1)*
return (0-result2)*
//最大数,后期乘以maxweight(干脆方法内乘了)
public int Maxness(){
int max=0;
for(int i=0;i<4;i++)
for(int j=0;jmax)
max=numlist[i][j];
return max*
public int Emptyness(){
return blanks*
public void launchFrame() {
setTitle("2048PC版"); // 设置窗体标题
setBounds(700, 100, 400, 475);
setLayout(new BorderLayout());
setResizable(false); // 禁止调整窗体大小
numpanel.setLayout(new GridLayout(4, 4)); // 设置空布局
numpanel.setLocation(0,200);
AddScoreLabel();//添加计分器
AddNumArea();// 添加数字格子
getContentPane().add(scorepanel,BorderLayout.NORTH);
getContentPane().add(numpanel,BorderLayout.CENTER);
NewValue();
NewValue();
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 37)// 左键
if(LeftReduce())
Refresh();//更新blank,numlabellist
NewValue();
if (e.getKeyCode() == 39)// 右键
if(RightReduce())
Refresh();//更新blank,numlabellist
NewValue();
if (e.getKeyCode() == 38)// 上键
if(UpReduce())
Refresh();//更新blank,numlabellist
NewValue();
if (e.getKeyCode() == 40)// 上键
if(DownReduce())
Refresh();//更新blanks,numlabellist,scorelabel
NewValue();
if (e.getKeyCode() == 32)// 空格键
if(LeftReduce())
Refresh();//更新blanks,numlabellist,scorelabel
NewValue();
else if(RightReduce())
Refresh();//更新blanks,numlabellist,scorelabel
NewValue();
else if(UpReduce())
Refresh();//更新blanks,numlabellist,scorelabel
NewValue();
else if(DownReduce())
Refresh();//更新blanks,numlabellist,scorelabel
NewValue();
System.out.println(e.getKeyCode());
if(CheckOut())//检查游戏是否结束
PrintNumlist();
System.out.println("mononess:"+Integer.toString(Mononess()));
System.out.println("smoothness:"+Integer.toString(Smoothness()));
System.out.println("maxnum:"+Integer.toString(Maxness()));
System.out.println("blanks:"+Integer.toString(Emptyness()));
setVisible(true);&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
该文档贡献者很忙,什么也没留下。
&#xe602; 下载此文档
正在努力加载中...
游戏2048的JAVA源代码
下载积分:4888
内容提示:游戏2048的JAVA源代码
文档格式:DOCX|
浏览次数:2|
上传日期: 18:26:36|
文档星级:&#xe60b;&#xe612;&#xe612;&#xe612;&#xe612;
全文阅读已结束,如果下载本文需要使用
&#xe71b; 4888 积分
&#xe602;下载此文档
该用户还上传了这些文档
游戏2048的JAVA源代码
官方公共微信}

我要回帖

更多关于 java rsa2048 的文章

更多推荐

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

点击添加站长微信