2048java课程设计报告_软件工程——Java版2048游戏学习报告

2048游戏学习报告

姓名:王浩

专业:计算机科学与技术

年级:15级4班

学号:201510411420

目录

一. 前言                                             3

二. 对游戏的简要分析                        3

1. 游戏的定位分析                             3

2. 游戏的构造分析及对应代码            3

3.游戏操作分析及其代码 5

3游戏结束及代码 12

三. 运行结果                                      13

五.自我总结                                       13

一. 前言

这学期开设了软件工程这门课程,但是由于自己的能力有限,未能在团队项目中做出足够的贡献,于是上网找了一个2048代码,对其进行分析、解读、学习。因为本人对2048游戏还是比较喜欢的,所以选择了该游戏作为本次学习报告的学习对象。

二. 对游戏的简要分析

1. 游戏的定位分析

2048游戏是一款主要应用在移动端的游戏,所以需要提高游戏的操作可行性,降低游戏的操作难度,降低游戏的上手难度,对使用设备的要求趋于简单化和多样化,游戏界面更加人性化,功能更加贴合使用。

2. 游戏的构造分析及对应代码

首先要设置标题——“2048”、窗口的大小以及窗口的起始位置,然后设定背景的颜色、label字体。详细代码如下:

import javax.swing.*;

import java.awt.*;

public class Block extends JLabel

{

private int value;

public Block()

{

value = 0;//初始化值为0

setFont(new Font("font", Font.PLAIN, 40));//设定字体

setBackground(Color.gray);//设定初始颜色为灰色

}

public int getValue()//获取值

{

return value;

}

public void setValue(int value)

{

this.value = value;

String text = String.valueOf(value);

if (value != 0)

setText(text);

else

setText("");//如果值为0则不显示

setColor();

}

public void setColor()//根据值的不同设定不同的背景颜色、label字体

{

switch (value)

{

case 0:

setBackground(Color.gray);

break;

case 2:

setBackground(new Color(238, 228, 218));

break;

case 4:

setBackground(new Color(238, 224, 198));

break;

case 8:

setBackground(new Color(243, 177, 116));

break;

case 16:

setBackground(new Color(243, 177, 116));

break;

case 32:

setBackground(new Color(248, 149, 90));

break;

case 64:

setBackground(new Color(249, 94, 50));

break;

case 128:

setBackground(new Color(239, 207, 108));

break;

case 256:

setBackground(new Color(239, 207, 99));

break;

case 512:

setBackground(new Color(239, 203, 82));

break;

case 1024:

setBackground(new Color(239, 199, 57));

break;

case 2048:

setBackground(new Color(239, 195, 41));

break;

case 4096:

setBackground(new Color(255, 60, 57));

break;

}

}

}

3.游戏操作分析及其代码

基本的操作包括上下左右四个方向的移动,移动之后进行判断,若是相同的分数块则分数相加生成新的分数块,若不同则该操作无效,不发生改变。详细代码如下:

import java.awt.event.*;

import javax.swing.*;

public class Operation implements KeyListener

{

Block[] block;//用于储存16个数据

JPanel panel;

public boolean up,down,left,right;

int moveFlag;//用于累计移动的次数

boolean numFlag;//用于判断是否还能加入新的数字

public Operation(JFrame frame)

{

this.panel = (JPanel)frame.getContentPane();//构造出panel

block = new Block[16];//构造出长度为16的数组

numFlag = true;//初始化

moveFlag = 0;

up=true;down=true;left=true;right=true;

addBlock();

for (int i = 0; i < 2; i++)

appearBlock();

frame.addKeyListener(this);

}

private void addBlock()

{

for (int i = 0; i < 16; i++) //往panel里加入block

{

block[i] = new Block();

block[i].setHorizontalAlignment(JLabel.CENTER);// 不透明的标签

block[i].setOpaque(true);

panel.add(block[i]);

}

}

public void appearBlock()

{

while (numFlag) //当还能加入随机的一个新的值得时候

{

int index = (int) (Math.random() * 16);//取一个0到15的随机整数,这个数作为随机加入盘中的2或4的位置

if (block[index].getValue() == 0)//如果这个数所在的block数组中值为0,即在为空的时候,加入一个2或4的数字

{

if (Math.random() < 0.5)

{

block[index].setValue(2);

}

else

{

block[index].setValue(4);

}

break;//跳出while

}

}

}

public void judgeAppear() //统计block数组中是否含有值为0的元素,若没有,则numFlag变为false

{

int sum = 0;

for (int i = 0; i < 16; i++)

{

if (block[i].getValue() != 0)

{

sum++;

}

}

if (sum == 16)

numFlag = false;

}

public int Find(int i,int j,int a,int b)

{

while(i=a)

{

if(block[i].getValue()!=0)

{

return i;

}

i=i+j;

}

return -1;

}

public void upBlock()

{

int i=0,j=0;int t=0;int valueJ=0;int valueI=0;int index=0;

for(i=0;i<4;i++)

{

index=i;

for(j=i+4;j<16;j+=4)

{

valueJ=0; valueI=0;

if(block[index].getValue()==0)

{

t=Find(index,4,0,16);

if(t!=-1)

{

block[index].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueI=block[index].getValue();

if(block[j].getValue()==0)

{

t=Find(j,4,0,16);

if(t!=-1)

{

block[j].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueJ=block[j].getValue();

if(valueI==valueJ&&valueI!=0&&valueJ!=0)

{

block[index].setValue(valueI+valueJ);

block[j].setValue(0);

numFlag = true;

}

index=j;

}

}

}

public void downBlock() {

int i=0,j=0;int t=0;int valueJ=0;int valueI=0;int index=0;

for(i=12;i<16;i++)

{

index=i;

for(j=i-4;j>=0;j-=4)

{

valueJ=0; valueI=0;

if(block[index].getValue()==0)

{

t=Find(index,-4,0,16);

if(t!=-1)

{

block[index].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueI=block[index].getValue();

if(block[j].getValue()==0)

{

t=Find(j,-4,0,16);

if(t!=-1)

{

block[j].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueJ=block[j].getValue();

if(valueI==valueJ&&valueI!=0&&valueJ!=0)

{

block[index].setValue(valueI+valueJ);

block[j].setValue(0);

numFlag = true;

}

index=j;

}

}

}

public void rightBlock()

{

int i=0,j=0;int t=0;int valueJ=0;int valueI=0;int index=0;

for(i=3;i<16;i+=4)

{

index=i;

for(j=i-1;j>i-4;j--)

{

valueJ=0; valueI=0;

if(block[index].getValue()==0)

{

t=Find(index,-1,i-3,index+1);

if(t!=-1)

{

block[index].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueI=block[index].getValue();

if(block[j].getValue()==0)

{

t=Find(j,-1,i-3,j+1);

if(t!=-1)

{

block[j].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueJ=block[j].getValue();

if(valueI==valueJ&&valueI!=0&&valueJ!=0)

{

block[index].setValue(valueI+valueJ);

block[j].setValue(0);

numFlag = true;

}

index=j;

}

}

}

public void leftBlock()

{

int i=0,j=0;int t=0;int valueJ=0;int valueI=0;int index=0;

for(i=0;i<16;i+=4)

{

index=i;

for(j=i+1;j

{

valueJ=0; valueI=0;

if(block[index].getValue()==0)

{

t=Find(index,1,index,i+4);

if(t!=-1)

{

block[index].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueI=block[index].getValue();

if(block[j].getValue()==0)

{

t=Find(j,1,j,i+4);

if(t!=-1)

{

block[j].setValue(block[t].getValue());

block[t].setValue(0);

}

else

{

break;

}

}

valueJ=block[j].getValue();

if(valueI==valueJ&&valueI!=0&&valueJ!=0)

{

block[index].setValue(valueI+valueJ);

block[j].setValue(0);

numFlag = true;

}

index=j;

}

}

}

}

3游戏结束及代码

当窗口被填满且无下一步操作可以进行时,游戏结束并显示“GAMEOVER”。详细代码如下:

public void over()

{

if (numFlag ==false&& up==false&&down==false&&left==false&&right==false) //当不能添加元素,并且不可移动的步数超过36就输了,输了的时候在盘中央显示GAMEOVER

{

block[4].setText("G");

block[5].setText("A");

block[6].setText("M");

block[7].setText("E");

block[8].setText("O");

block[9].setText("V");

block[10].setText("E");

block[11].setText("R");

block[11].addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e){reStart();}});

}

}

三. 运行结果

五.自我总结

通过本次对2048游戏分析、学习收获了很多。比如在学习新知识之前首先要明确自己的兴趣所在,然后进行相关的学习,在学习的过程中要制定相应的学习计划。制定学习计划的时候要切合自身实际,每天按照学习计划严格要求自己。要多利用网络解决遇到的问题,对每天遇到的问题进行记录总结,定期对这些记录进行回看、学习,确保自己掌握这些知识。学习结束之后要进行相对应的编程,以便进一步掌握所学知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java android rsa加密解密_Android RSA数据加密与Java服务端RSA私钥解密出错问题

1. 出错描述&#xff1a;服务RSA解密抛出javax.crypto.BadPaddingException: Decryption error2.出错原因&#xff1a;Android系统使用的虚拟机(dalvik)跟SUN标准JDK是有所区别的&#xff0c;其中他们默认的RSA实现就不同。即Android端用Cipher.getInstance("RSA")方…

java ee 值范围_【转载】JAVAEE之内置对象和属性范围

内置对象和属性范围​ 四种属性范围​ 九个内置对象1.内置对象如果说想要使用一个对象&#xff0c;必须new 出来&#xff0c;但是在我们的jsp操作中&#xff0c;发现我们使用过的out,request对象没有进行实例化&#xff0c;类似于这样的对象&#xff0c;我们叫做jsp的内置对象&…

java线程池案例_使用Executors 和 ThreadPoolExecutor实现Java线程池案例

并发主题使用Executors 和 ThreadPoolExecutor实现Java线程池案例首先需要一个工作线程&#xff1a;package com.journaldev.threadpool;public class WorkerThread implements Runnable {private String command;public WorkerThread(String s){this.commands;}Overridepublic…

getordefault java_Java map.getOrDefault()方法的用法详解

Map.getOrDefault(Object key, V defaultValue)方法的作用是&#xff1a;当Map集合中有这个key时&#xff0c;就使用这个key值&#xff1b;如果没有就使用默认值defaultValue。代码示例如下&#xff1a;HashMap map new HashMap<>();map.put("name", "co…

java 复合_【福利】java新手做的复合型计算器!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼先前用那个代码不走样说要审核,我这里不用那个来发代码import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.JTextField;import java.awt.GridLayout;import javax.sw…

python模块如何导入解释器_无法从嵌入式解释器导入内置模块(仅限Windows)

这个问题看起来可能是一个重复的问题但我认为我的问题是不同的。我正在从一个MSVC编译的C应用程序运行Python 3.4解释器&#xff0c;并且我尝试使用PTVSD模块来调试更容易。到目前为止&#xff0c;我已经能够连接到Python Ipter&#xff0c;我从命令行开始&#xff0c;没有问题…

java方法的传递方式_JAVA基础--方法传参

JAVA基础--方法传参为啥拿这个当话题&#xff1f;在初学者阶段&#xff0c;许多童鞋都对方法传参比较迷茫&#xff0c;知其然不知其所以然。一.先说说参数传递的几个术语&#xff1a;值调用(call by vale):表示方法接收的是调用者传递的值。引用调用(call by reference):表示方…

java web spark_spark-微型的Java Web框架 Spark Framework

导读热词Spark是一个微型的Java Web框架&#xff0c;它的灵感来自于Sinatra&#xff0c;它的目的是让你以最小的代价创建出一个Java Web应用。Implement CORS in Spark -spark中如何处理跨域资源共享问题代码如下&#xff1a;// Enables CORS on requests. This method is an i…

java udp 协议_网络协议 - UDP 协议详解

网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛&#xff0c;所以也有必要对UDP协议进行详解。pdai UDP概述UDP(User Datagram Protocol)即用户数据报协议&#xff0c;在网络中它与TCP协议一样用于处理数据包&#xff0c;是一种无连接的协议。在OSI模型中&#xff0c;在第…

java 8 foreach_Java 8 forEach Stream()与旧版forEach循环

我正在尝试使用Spring的示例代码.部分代码如下所示&#xff1b;private List points;long timeTakeninMilis System.currentTimeMillis();public List getPoints() {return points;}public void setPoints(List points) {this.points points;}public void drawJava8() {point…

java list 超出范围_java-列索引超出范围:2,列数1

我有这个表&#xff1a;学生CREATE TABLE IF NOT EXISTS Klas_student(Student varchar(7) REFERENCES studenten (Studentenummer) ON DELETE CASCADE NOT NULL,Klas text NOT NULL REFERENCES Klas (Naam_id) ON DELETE CASCADE NOT NULL);在此表格中,我想添加值,我使用prepa…

java 写入指定路径文件_java对指定目录下文件读写操作介绍 | 学步园

最近因为项目的国际化的需要&#xff0c;需要对整个项目的100来个插件做国际化&#xff0c;这是一件痛苦的事情&#xff0c;因为纯体力劳动。为了省点工作量&#xff0c;想着能不能写个程序批处理了&#xff0c;减少点工作量&#xff0c;于是就有了下面的代码。1.读取指定的(.j…

点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能

最近在开发浏览器碰到这么一个需求&#xff1a;点击地址栏的时候&#xff0c;需要全选并调出键盘&#xff0c;再次点击就取消全选显示光标。点击屏幕除地址栏其他位置时&#xff0c;键盘隐藏&#xff0c;隐藏光标。大部分浏览器都是这样的逻辑&#xff0c;这样可以提高用户体验…

java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

RSA的应用RSA是一种非对称加密算法。现在&#xff0c;很多登陆表单的密码的都采用RSA加密&#xff0c;例如京东中的登陆使用公钥对密码进行加密java使用RSA加密方式实现数据加密解密&#xff0c;需要首先产生私钥和公钥测试代码public static void main(String args[]){try {RS…

java线程卡住排查_基于 Java 线程栈 排查问题

除日志外&#xff0c;还有没有别的方式跟踪线上服务问题呢&#xff1f;或者&#xff0c;跟踪并排除日志里无法发现的问题&#xff1f;方法当然是有的&#xff0c;就是通过现场快照定位并发现问题。我们所说的现场&#xff0c;主要指这两方面&#xff1a;Java 线程栈。线程栈是J…

java实验二答案天津商业大学_天津商业大学信息安全实验一

天津商业大学信息安全实验一 1《信息安全技术》实 验 报 告 书实验名称&#xff1a; 实验一Internet应用风险专 业&#xff1a; 电子商务班 级&#xff1a; 1203班姓 名&#xff1a; 代常发学 号&#xff1a; 20124934指导老师&#xff1a; 丁雷信息工程学院2015 年 5 月2目 录…

java前端的日期插件_几个前端时间插件总结

几个前端时间插件总结总结一下几款时间插件&#xff0c;分别是- [ ] jeDate 手册http://www.jemui.com/jedate/- [ ] bootstrap-datetimepicker 下载地址- [ ] My97DatePicker 下载地址- [ ] jQuery UI 插件Datepicker下载地址并没有哪款完全超越另外一款&#xff0c;主要还是看…

t3s java_关于JAVA的this关键字

网上对this的描述很朦胧&#xff0c;有的说this表示的是当前对象自己&#xff0c;有的说this是当前对象的引用。可是自己写了如下的测试代码&#xff0c;产生了几个问题&#xff1a;1 public class T3AboutThis {23 public static void main(String[] args) {4 new…

Java插件自动保存浏览器书签_多浏览器书签同步插件EverSync

有时上网时会遇到浏览器不能正常显示的问题。(比如我的火狐浏览器无法正确显示微信公众号管理后台&#xff0c;在chrome上可以正常显示)&#xff0c;所以我的电脑里安装了chrome和firefox两个浏览器。但是时间长了&#xff0c;会出现两个浏览器上书签不同步的问题。原来自己的解…

java连接并操作redis_java 使用 jedis 连接 redis 并进行简单操作

packagetest;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importorg.junit.Test;importredis.RedisUtil;importredis.clients.jedis.Jedis;public classRedisTest {private RedisUtil redisUtil newRedisUtil();//字符串操作…