基于Java的2048小游戏设计
基于Java的2048小游戏设计的源代码
基于Java的2048小游戏设计的课程设计报告
package 小游戏;
import javax.sound.sampled.;
import javax.swing.;
import java.io.; import java.awt.;
import java.awt.event.;
import java.util.;
public class My2048Game extends JFrame{
//定义自己的面板
MyPanel mp=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
My2048Game m2048=new My2048Game();
m2048.setFocusable(true);//( 设 置 ) 该 对 象 的 焦 点 , 不 能 用 请 求 焦 点 对 象名.requestFocus();
}
//构造函数
public My2048Game()
{
mp=new MyPanel(); this.add(mp);
//注册鼠标监听
this.addMouseListener(mp);
//注册键盘监听
this.addKeyListener(mp);
this.setTitle(“2048 游 戏 “);
this.setLocation(400, 30);
this.setSize(500, 800);
this.setResizable(false);// 禁止调整窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class MyPanel extends JPanel implements MouseListener,KeyListener,ActionListener// 动作监听器 一般用于监听按钮或者菜单的点击事件
{
private static final long serialVersionUID = 1L;
private int x1=0,y1=0;// 按下鼠标左键的位置坐标
private int x2=0,y2=0;// 释放鼠标左键的位置坐标
private int option=0;// 记录鼠标移动的方向
//定义组件
private JButton jb1;// 声音图标的按钮
private static boolean jb1_flag=true;// 用于控制声音开关的一个标志
private boolean jb1_flag2=true;//
public static boolean isJb1_flag() {
return jb1_flag;}
public static void setJb1_flag(boolean jb1_flag) {
MyPanel.jb1_flag = jb1_flag;}
private JPanel scoresPane; // 分数面板
private JPanel mainPane; // 游 戏 主 面 板
private JLabel labelMaxScores; // " 最高分 " 标签
private JLabel m2048;// 显 示 2048
private JLabel labelScores; // 当前 “得分 “标签
private JLabel tips;// 提示操作标签
private JLabel currentScores; private JLabel textScores;
private JLabel[][] texts; // 创建文本框二维数组
private int[][] temp1 = new int [4][4]; // 记录上一步的状态
private int[][] temp2 = new int [4][4]; // 记录当前的状态
private int times = 16;// 记录剩余空方块数目
private int scores = 0;// 记录分数
private int maxscores=0;// 最高分
private int temp1scores = 0;
private int temp2scores = 0;
private int p1, p2, p3, p4;// 用于判断游戏是否失败
private int biaoji = 1; // 标记能否移动
Font font = new Font(””, Font.BOLD, 14); // 设置字体类型和大小(标签字体的设置)
Font font2 = new Font(””, Font.BOLD, 30); // 主面板的数字字体的设置
Random random = new Random();
// 构 造 函 数
public MyPanel(){
super();//调用父类的构造方法
//在构造函数中创建组件
this.setLayout(null);// 设置空布局
this.setBackground(new Color(2,150,220));// 设置该 MyPanel 类的背景颜色
scoresPane=new JPanel();//创建分数显示面板
scoresPane.setBackground(new Color(5,150,220));// 设置分数面板的背景颜色
scoresPane.setBounds(0,0,482,100);//设置该面板显示的位置和长宽
scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.yellow));// 设置该面板的边框
this.add(scoresPane);//将分数面板加载到 MyPanel 面板上
scoresPane.setLayout(null);// 设置得分面板的布局为空
m2048=new JLabel(“2048”);// 创建标签
m2048.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.yellow));
m2048.setFont(new Font(" 宋体 “, Font.BOLD, 45));// 设置字体类型和大小
m2048.setBounds(0,0,120,100);
scoresPane.add(m2048);
currentScores = new JLabel();// 当前得分标签
currentScores.setText(“SCORE
”+String.valueOf(scores)+”");
currentScores.setFont(new Font(" 宋体 “, Font.BOLD, 30));// 设置字体类型和大小
currentScores.setBorder(BorderFactory.createMatteBorder(0,0, 0, 1, Color.yellow));
currentScores.setBounds(240,0, 140, 100);// 设置最高分标签的位置尺寸
scoresPane.add(currentScores);// 将最高分标签添加到得分容器中
//从文件取得最高分的数据
Recorder.getRecording();
maxscores=Recorder.getMaxscores_2048();
labelMaxScores = new JLabel(“BEST
”+String.valueOf(maxscores)+”");// 最高得分标签
labelMaxScores.setFont(new Font(" 宋 体 ", Font.BOLD, 30));// 设置字体类型和大小
labelMaxScores.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.yellow));
labelMaxScores.setBounds(380, 0, 120, 100); scoresPane.add(labelMaxScores);// 将得分标签添加到分数面板中
jb1=new JButton(new ImageIcon(“src/ 声音图标 .jpg”));
jb1.setBounds(433,120,45,30);
this.add(jb1);
//注册按钮监听
jb1.setActionCommand(“shengyin”);
jb1.addActionListener(this);
mainPane = new JPanel();// 创建游戏主面板
mainPane.setBounds(18, 150, 460, 460);// 设置主面板位置尺寸mainPane.setBackground(new Color(40,190,240));
mainPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.yellow));
this.add(mainPane);
mainPane.setLayout(null);// 设置空布局
texts = new JLabel[4][4];// 创建文本框二维数组
bw.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();}}}}
//播放声音的类
class AePlayWave extends Thread
{
private static String filename;
File soundFile=new File(filename);
AudioInputStream audioInputStream=null;
try {
audioInputStream=AudioSystem.getAudioInputStream(soundFile);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return ;
}
AudioFormat format=audioInputStream.getFormat(); SourceDataLine auline=null;
DataLine.Info info=new DataLine.Info(SourceDataLine.class, format);
try {
auline=(SourceDataLine)AudioSystem.getLine(info); auline.open();
} catch (Exception e) {
// TODO: handle exception e.printStackTrace();
return ;
}
biaoji = 0;
for (int j = 0; j < 4; j++) { a = 5;
for (int k = 0; k < 5; k++) {
for (int i = 2; i >= 0; i–) {
auline.start();
int nBytesRead=0; byte[]abData=new byte[1024]; try {
while(nBytesRead!=-1){
nBytesRead=audioInputStream.read(abData); if(MyPanel.isJb1_flag()){
if(nBytesRead>=0){
auline.write(abData,0,nBytesRead);}}
else{
while(!MyPanel.isJb1_flag());}}
} catch (Exception e) {
// TODO: handle exception e.printStackTrace();
return ;}
finally
auline.drain(); auline.close();}
}
}
str = texts[i][j].getText();
基于Java的2048小游戏设计
基于Java的2048小游戏设计的课程设计报告
一、背景
最近以来,移动手游越来越成为当下游戏产业中重要的一环,市场也在加大对这一产业的投入,涌现出了愤怒的小鸟,水果忍者,2048等诸多优秀的手游,然而任何一款手游能够风靡,主要还是依靠其简单的操作性,因此本次java课设我选择其中的典型2048PC版作为本次课设的课题。2048游戏规则很简单,玩家每次可以选择上下左右其中一个方向去移动,每移动一次, 所有的数字方块都会往移动的方向靠拢外,系统也会在空白的地方随机出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的 16 格范围中凑出“ 2048”这个数字方块。
二、系统需求分析
1.需求分析
现代社会对休闲小游戏的需求是:提高游戏的操作可行性,降低游戏的操作难度,降低游戏的上手难度,降低游戏的竞争需求,对使用设备的要求趋于简单化和多样化,游戏界面更加人性化,功能更加贴合使用。
(1)界面
一款的好的游戏其界面必须友好,简洁已经成为当今UI设计的主流,简单易上手才能得到玩家的青睐。
(2)功能需求
能够显示游戏的当前得得分,并记录游戏的最高分并显示,当在次打开游戏时,能够显示最高分;在游戏进行的过程中循环播放音乐,并能够关闭音乐或者打开音乐;游戏的主界面上,相同的数字要显示相同的颜色。游戏结束要有相应的提示。游戏的主要目的是通过上下左右移动来将相邻相同的数字相加,通过不断地累加最终加到2048。
(3)操作性需求
游戏的体验是衡量一款游戏的关键,本游戏可通过键盘w,s,a,d以及方向键来控制方块的移动,还可以通过在游戏的主面板中向上下左右拖动鼠标。
2.功能设计
(1)图形用户界面:2048 的最大特点就是玩家对图形界面里的数字进行操作,也就是是玩家与游戏的互动。
(2)当前分数SCORE与最高分数的显示:在我们设计的2048 游戏中当前分数取了页面内所有数字相加的值为分数,对玩家玩游戏的进展有直接性、客观性的展现;同时,最高分数取了以往玩家退出游戏时所保存分数的最高分。
(3)数字颜色:游戏中数字的颜色以2 为首项的等比数列变化,即2、4、8、16、32、64、128、256、512、1024、2048…对应的数字卡片变色。
(4)游戏的退出:游戏退出时,我们采用弹出对话框的确认玩家是否真的要退出游戏,当然这样做更符合游戏人性化设计的观念。
三、系统总体设计
1.程序设计思路
图1 整个程序设计思路
2.流程图
图2 程序流程图
3.程序运行效果设计
当我们点击运行时,每次出现的界面都不想同,数字2与4都是随机出现。
图3 程序运行效果图
四、系统详细设计与实现
1.界面的整体布局
分别构建mainPane,scoresPane两大模块放入游戏窗体,其中scoresPane 包含2048字样的提示,当前得分和最高分,当得分超过最高分时,将得分存入工程文件夹下的myRecording.txt,覆盖最高分,同时在最高分显示最myRecording.txt的内容。
通过Create方法随机产生2号方块或者4号方块,通过setColor方法设置每个数字代表的方块颜色(如:图四)。
图4 每个方块的颜色代表不同的数字
2.方法模块
方法1:设置标签颜色,每次随机产生2或4和数字合并之后就要调用该方法来设置标签的颜色
方法2:在随机位置产生一个2号或4号方块的方法,同时该方法也用于判断游戏是否结束。
方法3:从文件中读取记录,同时也要将新的数据保存到文件中。读取文件需要解决的问题是,当程序首次运行的时候,文件不存在,这时不仅不能从文件中读数据,还要创建相应的文件。创建文件之后,接下来在运行程序就能读取到数据,文件读取结束要将文件关闭。
图5 游戏运行截图
五、总结
在设计2048小游戏时,我也遇到了许多问题
问题一:将所有图片移动你按键的方向到问题
解决方法:你往什么方向按方向键,就从你按键的方向作为第一个一行一行或者一列一列的遍历,有扫到的第一个图片的与遍历的起始位置交换数组的数据,第二个图片就与第二个交换位置,以此类推下去就能做到图片都往一个方向的移动。
问题二:在运行代码时出现错误
解决方法:在中加入
问题三:每次按下方向键会要随机出现一张2或者4的图片,此图片会对已有的图片的位置进行覆盖的问题
解决方法:利用递归的方法来判断你随机的位置上是否已有图片,如若有侧继续随机,如果没有则在此位置画出图片。
参考文献
[1]java语言程序设计基础篇[M].机械工业出版社 .2011.3
[2]黄晓东.Java课程设计案例精编[M].北京:中国水利水电出版社,2007.5
[3]Java信息管理系统开发实例导航 [M].北京:人民邮电出版社.2009.4
[4]刘洪峰,陈江波.网络开发技术大全[M].人民邮电出版社,2005
[5]刘彦君,金飞虎.JavaEE 开发技术与案例教程.北京:人民邮电出版社,2014.2
[6]巴顿(Paaton,R).软件测试(第二版).北京:机械工业出版社.2006
[7]黄晓东.Java 课程设计案例精编(第二版).北京:中国水利水电出版社,2007
课程设计总结:
通过此次课程设计,使我更加扎实的掌握了有关Java设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩。
Java课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。