版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Java语言程序设计课程设计题 目 2048游戏的设计与实现 学 院 数信学院 专 业 计算机科学与技术 班 级 计科121 学 号 201259225131 学生姓名 郑帅兵 指导教师 赵利平 编写日期 2014-7-8 目 录1.需求分析32.系统运行环境33.功能需求描述34.总体设计35.程序模块设计36.总结3一、 需求分析2048是比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于1024和小3传奇的玩法开发而成的新型数字游戏1 。随后2048便出现各种版本,走各大平台。由Ketchapp公司移植到IOS的版
2、本最为火热,现在约有1000万下载,其名字跟原版一模一样。衍生版中最 出名的是2048六边形版本,先后在全球81个国家中的board game中排进了前200。安卓版非常火爆的有挑战2048,其2.0.0版以后还加入了双人对战。其次比较特别的有2048中国朝代版。更有 2048自定义版,可以自己定义文字和图片。2048是IOS中流行的一款。本课程设计通过设计与开发JVM平台上的2048游戏,进一步掌握所学Java课程的知识,体验Java的跨平台性,同时将Java设计方面的知识拓展应用二、 系统运行环境1、硬件环境:2、软件环境:操作系统:WindowsXP/Windows7 软件:集成开发环境
3、Eclipse 三、 功能需求描述1、图形用户界面:2048的最大特点就是玩家对图形界面里的数字进行操作,也就是是玩家与游戏的互动2、当前分数SCORE与最高分数的显示:在我们设计的2048游戏中当前分数取了页面内所有数字相加的值为分数,对玩家玩游戏的进展有直接性、客观性的展现;同时,最高分数取了以往玩家退出游戏时所保存分数的最高分3、数字颜色:游戏中数字的颜色以2为首项的等比数列变化,即2、4、8、16、32、64、128、256、512、1024、2048.对应的数字卡片变色4、游戏的退出:游戏退出时,我们采用弹出对话框的确认玩家是否真的要退出游戏,当然这样做更符合游戏人性化设计的观念。功
4、能图如下:四、 总体设计简要设计流程:程序结构说明:/重新开始,若是初次运行游戏,则从文件中读入最高分void restart()/控制方法public void keyPressed(KeyEvent e)/绘图方法public void paint(Graphics g)/判断是否已经失败,若失败则返回true,否则返回falsepublic boolean judgeFail()/向下滑动,若各列均没有方块相消或移动,则返回false,否则返回true;public void moveDown()/向左滑动,若各行均没有方块相消或移动,则返回false,否则返回true;public v
5、oid moveLeft()/向右滑动,若各行均没有方块相消或移动,则返回false,否则返回true;public void moveRight()/向上滑动,若各行均没有方块相消或移动,则返回false,否则返回true; Public void moveUp()/在游戏区空闲处随机生成2或4public void generateRandom2or4()五、 程序模块设计源码如下:Main类:import javax.swing.JFrame;public class Main public static void main(String args)JFrame frame=new Ja
6、va2048();frame.setTitle("Java2048");frame.setSize(455,610);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );frame.setVisible(true);Java2048类:import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import javax.swing.*;public clas
7、s Java2048 extends JFrame implements KeyListenerprivate static final long serialVersionUID = 1L;Color background = new Color(190, 173, 160);/ 背景色Color foreground = new Color(204, 192, 178);/ 前景色Color wordColor = new Color(232, 216, 203);/ 单词色Font wordFont = new Font("微软雅黑", Font.PLAIN, 20)
8、;/ 单词字体Font numberFont = new Font("微软雅黑", Font.BOLD, 40);/ 数字字体Random random=new Random();/随机数发生器int array;/游戏用2维数组/逐行或逐列处理数组,第一个参数为实际数字,第二个为判断值,用来判断是否应该消除相同的数字intprocess=new int 42;int score;/分数,初始化为零int highestScore;/游戏中最高分int highestScore2=0;/文件中最高分int biggestNumber=0;boolean ifGenerate
9、2or4;int rd=new int16;/生成随机2或4的位置private Graphics gBuffer;/构造方法public Java2048()addKeyListener(this);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)if(JOptionPane.showConfirmDialog(null, "确定退出?", "提示", JOptionPane.YES_NO_OPTION)=JOptionPane.YES_NO_OP
10、TION)if(highestScore>highestScore2)/若在本次游戏中破了纪录,则更新文件中的最高分highestScore2=highestScore;File file=new File("Java2048beta1.txt");BufferedWriter bw;trybw=new BufferedWriter(new FileWriter(file);bw.write(String.valueOf(highestScore2),0,String.valueOf(highestScore2).length();bw.close();catch(E
11、xception e1)JOptionPane.showMessageDialog(null,"找不到同目录下Java2048beta1.txt文件或文件已损坏!", "提示", JOptionPane.INFORMATION_MESSAGE);System.exit(0); );restart();void restart()/重新开始/若是初次运行游戏,则从文件中读入最高分if(highestScore=0)File file=new File("Java2048beta1.txt");BufferedReader br;tryb
12、r=new BufferedReader(new FileReader(file);highestScore2=Integer.valueOf(br.readLine();br.close();catch(Exception e)JOptionPane.showMessageDialog(this,"找不到同目录下Java2048beta1.txt文件或文件已损坏!", "提示", JOptionPane.INFORMATION_MESSAGE);System.exit(0);highestScore=highestScore2;array=new in
13、t44;/清空游戏用2维数组score=0;/重置分数为零biggestNumber=0;/重置最大数字为零/在游戏区随机生成两个2或4generateRandom2or4();generateRandom2or4();/绘图方法public void paint(Graphics g) gBuffer=g;gBuffer.setColor(background);gBuffer.drawRoundRect(30, 40, 185, 90, 20, 20);/ 画分数显示区gBuffer.fillRoundRect(30, 40, 185, 90, 20, 20);gBuffer.drawRo
14、undRect(245, 40, 185, 90, 20, 20);/ 画最高分显示区gBuffer.fillRoundRect(245, 40, 185, 90, 20, 20);gBuffer.drawRoundRect(0, 150, 454, 460, 10, 10);/ 画主游戏区gBuffer.fillRoundRect(0, 150, 454, 460, 10, 10);gBuffer.setFont(wordFont);gBuffer.setColor(wordColor);gBuffer.drawString("SCORE", 90, 70);/ 画SCO
15、REgBuffer.drawString("BEST", 315, 70); / 画BESTgBuffer.setFont(numberFont);gBuffer.setColor(Color.white);if(score<10)gBuffer.drawString(String.valueOf(score), 110, 115);/画分数数字else if(score<100)gBuffer.drawString(String.valueOf(score), 100, 115);/画分数数字else if(score<1000)gBuffer.draw
16、String(String.valueOf(score), 85, 115);/画分数数字else if(score<10000)gBuffer.drawString(String.valueOf(score), 73, 115);/画分数数字else if(score<100000)gBuffer.drawString(String.valueOf(score), 60, 115);/画分数数字else if(score<1000000)gBuffer.drawString(String.valueOf(score), 50, 115);/画分数数字elsegBuffer.
17、drawString(String.valueOf(score), 37, 115);/画分数数字if(highestScore<10)gBuffer.drawString(String.valueOf(highestScore), 325, 115);/画分数数字else if(highestScore<100)gBuffer.drawString(String.valueOf(highestScore), 315, 115);/画分数数字else if(highestScore<1000) gBuffer.drawString(String.valueOf(highest
18、Score), 300, 115);/画分数数字else if(highestScore<10000)gBuffer.drawString(String.valueOf(highestScore), 288, 115);/画分数数字else if(highestScore<100000)gBuffer.drawString(String.valueOf(highestScore), 275, 115);/画分数数字else if(highestScore<1000000)gBuffer.drawString(String.valueOf(highestScore), 265,
19、 115);/画分数数字elsegBuffer.drawString(String.valueOf(highestScore), 252, 115);/画分数数字gBuffer.setColor(foreground);for (int i = 0; i < 4; i+) for (int j = 0; j < 4; j+) gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10); gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100,
20、 10, 10);for(int i=0;i<4;i+)for(int j=0;j<4;j+)switch (arrayij) case 2: gBuffer.setColor(new Color(238, 228, 218);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(122, 113, 104);
21、 gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 50);gBuffer.drawString("2", 45 + j * 112, 230 + i * 113);break;case 4: gBuffer.setColor(new Color(236, 224, 200);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 10
22、0, 100, 10, 10);gBuffer.setColor(new Color(119, 110, 103);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 50);gBuffer.drawString("4", 45 + j * 112, 230 + i * 113);break;case 8: gBuffer.setColor(new Color(242, 177, 121);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10,
23、10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(250, 248, 235);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 50);gBuffer.drawString("8", 45 + j * 112, 230 + i * 113); break;case 16: gBuffer.setColor(new Color(245, 149, 101);gBuffe
24、r.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(252, 244, 242);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 45);gBuffer.drawString("16", 33 + j * 112, 230 + i * 111); bre
25、ak;case 32: gBuffer.setColor(new Color(245, 124, 95);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(255, 241, 249);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 45);gBuffer.d
26、rawString("32", 33 + j * 112, 230 + i * 111);break;case 64: gBuffer.setColor(new Color(246, 93, 59);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(247, 249, 235);gBuffer.se
27、tFont(new Font("微软雅黑", Font.BOLD, 45);gBuffer.drawString("64", 33 + j * 112, 230 + i * 111);break;case 128: gBuffer.setColor(new Color(237, 206, 113);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100,
28、10, 10);gBuffer.setColor(new Color(248, 246, 255);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 40);gBuffer.drawString("128", 23 + j * 112, 228 + i * 111);break;case 256: gBuffer.setColor(new Color(237, 204, 97);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);g
29、Buffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(245, 244, 249);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 40);gBuffer.drawString("256", 23 + j * 112, 228 + i * 111);break;case 512: gBuffer.setColor(new Color(235, 201, 78);gBuffer.dr
30、awRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(255, 241, 248);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 40);gBuffer.drawString("512", 23 + j * 112, 228 +i * 111);break;ca
31、se 1024: gBuffer.setColor(new Color(237, 197, 63);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(240, 246, 244);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 35);gBuffer.draw
32、String("1024", 17 + j * 112, 225 + i * 113);break;case 2048: gBuffer.setColor(new Color(238, 194, 46);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(250, 249, 255);gBuffer.
33、setFont(new Font("微软雅黑", Font.BOLD, 35);gBuffer.drawString("2048", 17 + j * 112, 225 + i * 113);break;case 4096: gBuffer.setColor(new Color(242, 193, 28);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 1
34、00, 10, 10);gBuffer.setColor(new Color(248, 246, 255);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 35);gBuffer.drawString("4096", 17 + j * 112, 225 + i * 113);break;case 8192: gBuffer.setColor(new Color(236, 173, 57);gBuffer.drawRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10,
35、 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.setColor(new Color(248, 246, 255);gBuffer.setFont(new Font("微软雅黑", Font.BOLD, 35);gBuffer.drawString("8192", 17 + j * 112, 225 + i * 113);break;default: gBuffer.setColor(foreground);gBuffer.drawRoun
36、dRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);gBuffer.fillRoundRect(10 + j * 112, 160 + i * 112, 100, 100, 10, 10);public void keyPressed(KeyEvent e) if(e.getKeyCode()=KeyEvent.VK_UP)moveUp();else if(e.getKeyCode()=KeyEvent.VK_DOWN)moveDown();else if(e.getKeyCode()=KeyEvent.VK_LEFT)moveLeft()
37、;else if(e.getKeyCode()=KeyEvent.VK_RIGHT)moveRight();if(biggestNumber>1024)switch(biggestNumber)case 2048:if(JOptionPane.showConfirmDialog(this, "挑战2048成功!n是否继续挑战?", "提示", JOptionPane.YES_NO_OPTION)=JOptionPane.YES_OPTION)biggestNumber+;/防止2048重复判断elserestart();repaint();brea
38、k;case 4096:if(JOptionPane.showConfirmDialog(this, "挑战4096成功!n是否继续挑战?", "提示", JOptionPane.YES_NO_OPTION)=JOptionPane.YES_OPTION)biggestNumber+;/防止4096重复判断elserestart();repaint();break;case 8192:if(JOptionPane.showConfirmDialog(this, "挑战8192成功!n是否继续挑战?", "提示",
39、JOptionPane.YES_NO_OPTION)=JOptionPane.YES_OPTION)biggestNumber+;/防止8192重复判断elserestart();repaint();break;default:;if(judgeFail()JOptionPane.showMessageDialog(this,"挑战失败!", "提示", JOptionPane.INFORMATION_MESSAGE);restart();repaint();Overridepublic void keyReleased(KeyEvent e) Over
40、ridepublic void keyTyped(KeyEvent e) /判断是否已经失败,若失败则返回true,否则返回falsepublic boolean judgeFail()for(int j=0;j<4;j+)for(int i=0;i<4;i+)processi0=arrayij;processi1=1;for(int i=1;i<4;i+)int k=i;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=process
41、k0)return false;elsebreak;for(int j=0;j<4;j+)for(int i=3;i>-1;i-)process3-i0=arrayij;process3-i1=1;for(int i=1;i<4;i+)int k=i;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=processk0)return false;elsebreak;for(int i=0;i<4;i+)for(int j=0;j&
42、lt;4;j+)processj0=arrayij;processj1=1;for(int l=1;l<4;l+)int k=l;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=processk0)return false;elsebreak;for(int i=0;i<4;i+)for(int j=3;j>-1;j-)process3-j0=arrayij;process3-j1=1;for(int l=1;l<4;l+)in
43、t k=l;while(k>0)if(processk0=0)return false;else if(processk-10=0)return false;else if(processk-10=processk0)return false;elsebreak;for(int i=0;i<4;i+)for(int j=0;j<4;j+)if(arrayij=0)return false;return true;public void moveUp()ifGenerate2or4=false;for(int j=0;j<4;j+)for(int i=0;i<4;i
44、+)processi0=arrayij;processi1=1;processProcess();for(int i=0;i<4;i+)arrayij=processi0;if(ifGenerate2or4)generateRandom2or4();repaint();/向下滑动,若各列均没有方块相消或移动,则返回false,否则返回true;public void moveDown()ifGenerate2or4=false;for(int j=0;j<4;j+)for(int i=3;i>-1;i-)process3-i0=arrayij;process3-i1=1;pr
45、ocessProcess();for(int i=3;i>-1;i-)arrayij=process3-i0;if(ifGenerate2or4)generateRandom2or4();repaint();/向左滑动,若各行均没有方块相消或移动,则返回false,否则返回true;public void moveLeft()ifGenerate2or4=false;for(int i=0;i<4;i+)for(int j=0;j<4;j+)processj0=arrayij;processj1=1;processProcess();for(int j=0;j<4;j+)arrayij=processj0;if(ifGenerate2or4)generateRandom2or4();repaint();/向右滑动,若各行均没有方块相消或移动,则返
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 溧河乡卫生院抗菌药物静脉输液培训考试
- 药用高分子材料智慧树知到答案2024年德州学院
- 5高中数学新教材课堂导学案(直线方程的点斜式与斜截式一般式)
- 江苏省连云港海宁中学2024-2025学年九年级上学期第一次月考数学试题
- 伴热设备行业相关投资计划提议范本
- COD自动在线监测仪行业相关投资计划提议
- 工程造价相关行业投资方案
- 无碱玻璃基片行业相关投资计划提议
- 江苏省盐城市滨海县初中教育集团2023-2024学年部编版九年级上学期12月份月考历史试卷
- 胶印机噪声控制与环保降噪技术
- 医药产品经理成长手册
- 新版六年级音乐上册ppt课件3《波斯市场》-人音版
- 《致云雀》(教学课件)高一语文统编版必修上册
- 检验科应急预案范文(4篇)
- 森林消防服务投标方案(完整技术标)
- 2023年公路水运工程施工企业安全生产管理人员考试试卷(附答案)
- 产品工艺规程编制及管理规程
- 员工入职登记表-模板实用文档
- 文体部部长竞选演讲稿9篇
- 2023-2023CSSCI来源期刊影响因子及分类
- 四年级下册综合实践活动说课稿-环保袋 全国通用
评论
0/150
提交评论