阶段性项目实训_第1页
阶段性项目实训_第2页
阶段性项目实训_第3页
阶段性项目实训_第4页
阶段性项目实训_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 阶段性项目实训4 学院:电子与信息工程学院 班级:计软1102 学号:1405110228 姓名:张松1 需求分析 2048是一款简单的休闲益智的小游戏,这一款游戏老少皆宜,面向休闲化,时间片化,这一个游戏可以随时开始,随时结束,充分利用用户的闲散时间。这款游戏的优点是没有其他游戏繁琐的操作,只需要控制上下左右四个按键,虽然操作简单,但是想要通关却不是一件容易的事,这需要用户的智慧、耐心。二2048游戏规则: 游戏规则很简单,每次可以选择上下左右其中一个方向去移动,每移动一次,所有的数字方块都会往移动的方向靠拢外,系统也会在空白的地方随机出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。

2、系统给予的数字方块是2,玩家要想办法在这小小的25格范围中凑出“2048”,甚至“4096”、“8192”这个数字方块就算胜利了。三游戏心得:1、最大数尽可能放在角落。2、数字按顺序紧邻排列。3、首先满足最大数和次大数在的那一列/行是满的。4、时刻注意活动较大数(32以上)旁边要有相近的数。5、以大数所在的一行为主要移动方向6、不要急于“清理桌面”。4 程序框架 2048游戏代码 Block类 My2048类 setValue() getValue()setColor()addBlock() appearBlock() judgeAppear()upBlock() downBlock() ri

3、ghtBlock()leftBlock() over()5 设计思想: 在设计这个游戏时,首先定义了一个Block类,在这个类中定义了块的值value,还设置了set和get的借口setValue和getValue方法,定义了setColor方法来为“2”“4”“8”“16”“32”“64”“128”“256”“512”“1024”“2048”“4096”这些值设置不同的颜色来区分它们。然后定义了My2048类,在这个类中,首先定义一个panel和block,然后设置页面布局,设计一个5*5的框架,将block添加到panel中去,并且设置一个键盘监听 this.addKeyListener(

4、this),利用switch来枚举键盘监听会出现的情况,然后根据监听到的操作来调用不同的方法实现程序。六代码实现:Block.Java(1)getValue()方法,从block块中获取block的值。 public int getValue() return value;(2)setValue()方法,为block设置参数。public void setValue(int value) this.value = value;String text = String.valueOf(value);if (value != 0)setText(text);elsesetText();setCol

5、or();(3)setColor方法,根据block中不同的参数设置相应的颜色。public void setColor() if (this.value = 0)setBackground(Color.gray);else if (this.value = 2)setBackground(new Color(238, 228, 218);else if (this.value = 4)setBackground(new Color(238, 224, 198);else if (this.value = 8)setBackground(new Color(243, 177, 116);els

6、e if (this.value = 16)setBackground(new Color(243, 177, 116);else if (this.value = 32)setBackground(new Color(248, 149, 90);else if (this.value = 64)setBackground(new Color(249, 94, 50);else if (this.value = 128)setBackground(new Color(239, 207, 108);else if (this.value = 256)setBackground(new Color

7、(239, 207, 99);else if (this.value = 512)setBackground(new Color(239, 203, 82);else if (this.value = 1024)setBackground(new Color(239, 199, 57);else if (this.value = 2048)setBackground(new Color(239, 195, 41);else if (this.value = 4096)setBackground(new Color(255, 60, 57); My2048.java(1)addBlock()方法

8、,负责将block中的参数添加到panel,并设置中间位置public void addBlock() for (int i = 0; i 25; i+) blocki = new Block(); blocki.setHorizontalAlignment(JLabel.CENTER);/设置文本的水平对齐方式 blocki.setOpaque(true);/设置控件不透明 panel.add(blocki); (2)appearBlock()方法,生成一个随机数,Math.random()表示的是0.0-1.0,用这个数乘以25,来表示block随机出现在panel中public void

9、 appearBlock() /随机出现块 while (numFlag) int index = (int) (Math.random() * 25); if (blockindex.getValue() = 0) blockindex.setValue(2); break; (3)judgeAppear()方法,用来统计所有的block的值是否为0,如果不为0,则sum加1,当sum等于25时,就表示所有block都已满,游戏结束。public void judgeAppear() int sum = 0; for (int i = 0; i 25; i+) if (blocki.getV

10、alue() != 0) sum+; if (sum = 25) numFlag = false; (4) upBlock()方法,当用户点击向上按键时,程序调用upBlock()方法,对Block中的数据进行编辑,在这个方法中,需要将所有的block中的值向上移动,当相邻两个值相等时,就要将这两个值相加,然后将之放在上面一个block中,这个算法的实现方法是:先定义一个数组,将第一行的数进行for循环,然后遍历列,将每一个非0的block参数放入数组中,然后在数组中查看相邻两个值相等的数相加,放入下表较小的数组中,都处理完后,将数组中的数值按从上往下的顺序放入block中,这样就实现了向上移

11、动。public void upBlock() /点击键盘up键调用的方法 for (int j = 0; j 5; j+) int temp = new int5; int number = 0; for (int i = j; i =j + 20; i = i + 5) if (blocki.getValue() != 0) tempnumber = blocki.getValue(); number = number + 1; /* if(number!=0) for (int i = 0; i number; i+) System.out.print(tempi); else Syst

12、em.out.print(kong); System.out.print(n);*/ for (int i = 0; i number-1;) if (tempi = tempi + 1) tempi = tempi + tempi + 1; tempi + 1 = 0; i = i + 2; else i = i + 1; int k = 0; for (int h = 0; h 4; h+) if (temph != 0) tempk = temph; if (h != k) temph = 0; k = k + 1; for (int i = j,h=0; i =j + 20; i =

13、i + 5,h=h+1) blocki.setValue(temph); 图片对照:按向上键之前界面在这两幅图片中,我们能够很清楚的发现,第五行的数据全都向上移动了,而且在第五列中4和4相同,在向上移动后,这两个数相加,并且将值放在了第一行,第五列。按向上键后的界面(5)downBlock()方法,当用户点击向下按键时,程序调用downBlock()方法,在这个方法中,需要将所有的block中的值向上移动,当相邻两个值相等时,就要将这两个值相加,然后将之放在下面一个block中,这个算法的实现方法是:先定义一个数组,将第一行的数进行for循环,然后遍历列,将每一个非0的block参数放入数组中

14、,然后在数组中查看相邻两个值相等的数相加,放入下表较小的数组中,都处理完后,将数组中的数值按从下往上的顺序放入block中,这样就实现了向下移动。public void downBlock() /点击键盘down键调用的方法 for (int j = 20; j =j - 20; i = i - 5) if (blocki.getValue() != 0) tempnumber = blocki.getValue(); number = number + 1; /* if(number!=0) for (int i = 0; i number; i+) System.out.print(tem

15、pi); else System.out.print(kong); System.out.print(n);*/ for (int i = 0; i number-1;) if (tempi = tempi + 1) tempi = tempi + tempi + 1; tempi + 1 = 0; i = i + 2; else i = i + 1; int k = 0; for (int h = 0; h =j - 20; i = i - 5,h=h+1) blocki.setValue(temph); 图片对照:按向下键之前界面:按向下键之后界面(6)rightBlock()方法,当用户

16、点击向右按键时,程序调用rightBlock()方法,在这个方法中,需要将所有的block中的值向右移动,当相邻两个值相等时,就要将这两个值相加,然后将之放在下面一个block中,这个算法的实现方法是:先定义一个数组,将第一行的数进行for循环,然后遍历列,将每一个非0的block参数放入数组中,然后在数组中查看相邻两个值相等的数相加,放入下表较小的数组中,都处理完后,将数组中的数值按从右往左的顺序放入block中,这样就实现了向右移动。public void rightBlock() /点击键盘right键调用的方法 for (int j = 4; j =j - 4; i-) if (blo

17、cki.getValue() != 0) tempnumber = blocki.getValue(); number = number + 1; /* if(number!=0) for (int i = 0; i number; i+) System.out.print(tempi); else System.out.print(kong); System.out.print(n);*/ for (int i = 0; i number-1;) if (tempi = tempi + 1) tempi = tempi + tempi + 1; tempi + 1 = 0; i = i +

18、2; else i = i + 1; int k = 0; for (int h = 0; h =j-4; i-,h=h+1) blocki.setValue(temph); 图片对照:按向右键之前界面 按向右键之后界面(7)leftBlock()方法,当用户点击向左按键时,程序调用leftBlock()方法,在这个方法中,需要将所有的block中的值向左移动,当相邻两个值相等时,就要将这两个值相加,然后将之放在下面一个block中,这个算法的实现方法是:先定义一个数组,将第一行的数进行for循环,然后遍历列,将每一个非0的block参数放入数组中,然后在数组中查看相邻两个值相等的数相加,放入

19、下表较小的数组中,都处理完后,将数组中的数值按从左往右的顺序放入block中,这样就实现了向左移动。public void leftBlock() /点击键盘left键调用的方法 for (int j = 0; j =20; j=j+5) int temp = new int5; int number = 0; for (int i = j; i =j + 4; i+) if (blocki.getValue() != 0) tempnumber = blocki.getValue(); number = number + 1; /* if(number!=0) for (int i = 0;

20、 i number; i+) System.out.print(tempi); else System.out.print(kong); System.out.print(n); System.out.println(number);*/ for (int i = 0; i number-1;) if (tempi = tempi + 1) tempi = tempi + tempi + 1; tempi + 1 = 0; i = i + 2; else i = i + 1; int k = 0; for (int h = 0; h 4; h+) if (temph != 0) tempk =

21、 temph; if (h != k) temph = 0; k = k + 1; for (int i = j,h=0; i =j+4; i+,h=h+1) blocki.setValue(temph); 图片对照:按向左键之前界面按向左键之后界面 (8)keyPressed(KeyEvent e),在这个方法中通过switch来区分不同的监听结果,判断按下的是什么键,并且调用不同的方法来进行不同的操作。public void keyPressed(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_UP:/判断按下的点击否是UP键 upB

22、lock(); judgeAppear(); appearBlock(); over(); break; case KeyEvent.VK_DOWN:/判断按下的点击否是down键 downBlock(); judgeAppear(); appearBlock(); over(); break; case KeyEvent.VK_LEFT:/判断按下的点击否是left键 leftBlock(); judgeAppear(); appearBlock(); over(); break; case KeyEvent.VK_RIGHT:/判断按下的点击否是right键 rightBlock(); j

23、udgeAppear(); appearBlock(); over(); break; (9)over()方法中,判断numFlag的值,来决定是否结束,将特定的block中设置相应的字母,来表示GAME OVERpublic void over() /判断游戏结束 if (!numFlag ) block5.setText(G); block6.setText(A); block7.setText(M); block8.setText(E); block11.setText(O); block12.setText(V); block13.setText(E); block14.setText(R); block11.addMouseListen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论