下面我将随机抽取一名幸运女生,XXXXX
个人在经过长久以来(约等于4小时)的奋战,终于实现了一个上课老师提问并抽奖的小程序。希望这个程序变得非常非常实用
课程的理解:在我的项目开始之前,先学习了一下UML项目类图的画法,和类与类之间的关系。类图的3个基本组件:类名、属性、方法。其中类有6种关系:泛化,实现,依赖,关联,聚合,组合。类进行封装之后才好和其他的类发生关系,所以java的封装,继承,多态必不可少。在一个java项目开始之前。我们必须要使用类图对要干的事情进行需求分析,这样在项目代码编写和具体实现过程中才不会自乱阵脚。
设计实现:
本应用针对如下的要求,为满足老师的使用需求,我提出如下的解决方案
- 考虑实现一个老师随机选学生回答问题的小程序,可随机选取学生以及奖口
- 老师很花心,需要考虑两种以上界面呈现随机的结果。比如一种用图形,一种用控制台或一种是web。
- 注意实现的类的相互关系,怎样设计类的交互更合理。
- 扩展:这个模式是不是可以有很多游戏可以实现呢?想想还可以做什么?如何在现在设计的结构基础之上,更容易扩展出其他游戏。举个例,实现并说明你所设计的结构的优越性。
关系类图:
其中筛子依赖筛盅,而筛盅的GUI调用生成新筛盅,筛盅依赖于GUI界面。sifter类用于生成筛子对象,sifterCUP将生成一个筛盅类,用于模拟生成的筛子对象放入一个盅内并摇筛子获得筛子值的类的过程。而GUI则是为了发布一个可视化的界面,方便老师上课使用。其中用到了GUI可视化界面和控制台两种交互方式,其中摇筛子和随机获得奖品的代码,可用于各种通过随机事件获得结果的小游戏或软件之上。图片和代码简单易改,容易阅读。
代码说明:
sifter类用于生成筛子对象
1 import java.util.*; 2 3 public class Sifter{ 4 public int value = 0; 5 6 public static void getValue(Sifter S){ 7 S.value = (int)(1+Math.random()*6); 8 } 9 } 10
sifterCUP将生成一个筛盅类,用于模拟生成的筛子对象放入一个盅内并摇筛子获得筛子值的类的过程。可通过其他类调用生成i个数量的筛子数组,并同时获得筛子的value值
1 import java.util.Scanner; 2 3 public class SifterCup { 4 int amount = 0; 5 int sum = 0; 6 7 8 public void howMany(){ 9 10 System.out.println("请输入想要使用筛子的数量:"); 11 Scanner sc = new Scanner(System.in); 12 int amount = sc.nextInt(); 13 Sifter[] sifter = new Sifter[amount]; 14 int[] arr = new int[2]; 15 16 for(int i = 0; i < amount; i = i+1){ 17 sifter[i] = new Sifter(); 18 sifter[i].getValue(sifter[i]); 19 System.out.println(sifter[i].value); 20 sum = sum + sifter[i].value; 21 } 22 System.out.println("最终您roll出的点数为:" + sum); 23 } 24 25 }
而GUI则是为了发布一个可视化的界面,方便老师上课使用。
1 import java.awt.EventQueue; 2 import java.awt.Image; 3 4 import javax.swing.JFrame; 5 import javax.swing.JPanel; 6 import java.awt.BorderLayout; 7 import javax.swing.JButton; 8 import java.awt.event.ActionListener; 9 import java.util.Scanner; 10 import java.awt.event.ActionEvent; 11 import javax.swing.JTextField; 12 import javax.swing.JEditorPane; 13 import java.awt.Canvas; 14 import javax.swing.JLabel; 15 import javax.swing.ImageIcon; 16 17 public class SifterGUI { 18 19 private JFrame frame; 20 21 /** 22 * Launch the application. 23 */ 24 public static void main(String[] args) { 25 EventQueue.invokeLater(new Runnable() { 26 public void run() { 27 try { 28 SifterGUI window = new SifterGUI(); 29 window.frame.setVisible(true); 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } 33 } 34 }); 35 } 36 37 38 /** 39 * Create the application. 40 */ 41 public SifterGUI() { 42 initialize(); 43 } 44 45 /** 46 * Initialize the contents of the frame.*/ 47 private void initialize() { 48 Sifter psifter = new Sifter(); 49 Sifter asifter = new Sifter(); 50 frame = new JFrame(); 51 frame.setTitle("\u5E78\u8FD0\u5973\u751F\u8F6F\u4EF6"); 52 frame.setResizable(false); 53 frame.setBounds(100, 100, 450, 300);
54 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 55 ImageIcon[] image = new ImageIcon[13]; 56 image[0] = new ImageIcon("D:\\Users\\qq\\Desktop\\0.gif"); 57 image[1] = new ImageIcon("D:\\Users\\qq\\Desktop\\1.png"); 58 image[2] = new ImageIcon("D:\\Users\\qq\\Desktop\\2.png"); 59 image[3] = new ImageIcon("D:\\Users\\qq\\Desktop\\3.png"); 60 image[4] = new ImageIcon("D:\\Users\\qq\\Desktop\\4.png"); 61 image[5] = new ImageIcon("D:\\Users\\qq\\Desktop\\5.png"); 62 image[6] = new ImageIcon("D:\\Users\\qq\\Desktop\\6.png"); 63 image[7] = new ImageIcon("D:\\Users\\qq\\Desktop\\7.jpg"); 64 image[8] = new ImageIcon("D:\\Users\\qq\\Desktop\\8.jpg"); 65 image[9] = new ImageIcon("D:\\Users\\qq\\Desktop\\9.jpg"); 66 image[10] = new ImageIcon("D:\\Users\\qq\\Desktop\\10.jpg"); 67 image[11] = new ImageIcon("D:\\Users\\qq\\Desktop\\11.jpg"); 68 image[12] = new ImageIcon("D:\\Users\\qq\\Desktop\\12.jpg"); 69 70 JPanel panel = new JPanel(); 71 frame.getContentPane().add(panel, BorderLayout.CENTER); 72 panel.setLayout(null); 73 74 JLabel[] Jsifter = new JLabel[2]; 75 76 Jsifter[0] = new JLabel(" "); 77 Jsifter[0].setIcon(new ImageIcon("D:\\Users\\qq\\Desktop\\0.gif")); 78 Jsifter[0].setBounds(68, 104, 117, 111); 79 panel.add(Jsifter[0]); 80 81 Jsifter[1] = new JLabel(" "); 82 Jsifter[1].setIcon(new ImageIcon("D:\\Users\\qq\\Desktop\\0.gif")); 83 Jsifter[1].setBounds(257, 104, 117, 111); 84 panel.add(Jsifter[1]); 85 86 JLabel pLabel = new JLabel(" "); 87 pLabel.setVisible(false); 88 pLabel.setBounds(189, 69, 255, 128); 89 panel.add(pLabel); 90 91 JButton usebutton = new JButton("\u4F7F\u7528\u9AB0\u5B50"); //抽取一名学生 92 usebutton.addActionListener(new ActionListener() { 93 public void actionPerformed(ActionEvent arg0) { 94 SifterCup cup1 = new SifterCup(); 95 Sifter[] sifter = new Sifter[2]; 96 int sum = 0; 97 98 for(int i= 0;i < 2;i++){ 99 sifter[i] = new Sifter(); 100 sifter[i].getValue(sifter[i]); 101 System.out.println(sifter[i].value); 102 sum = sum + sifter[i].value; 103 104 switch(sifter[i].value){ 105 case(1):Jsifter[i].setIcon(image[1]);break; 106 case(2):Jsifter[i].setIcon(image[2]);break; 107 case(3):Jsifter[i].setIcon(image[3]);break; 108 case(4):Jsifter[i].setIcon(image[4]);break; 109 case(5):Jsifter[i].setIcon(image[5]);break; 110 case(6):Jsifter[i].setIcon(image[6]);break; 111 } 112 } 113 System.out.println("有请: " + sum + " 号同学上台回答问题"); 114 } 115 }); 116 usebutton.setBounds(18, 225, 93, 23); 117 panel.add(usebutton); 118 119 JButton retbutton = new JButton("\u91CD\u7F6E\u9AB0\u5B50"); //重置筛子 120 retbutton.addActionListener(new ActionListener() { 121 public void actionPerformed(ActionEvent e) { 122 Jsifter[0].setIcon(image[0]); 123 Jsifter[1].setIcon(image[0]); 124 Jsifter[1].setVisible(true); 125 pLabel.setVisible(false); 126 } 127 }); 128 retbutton.setBounds(121, 225, 93, 23); 129 panel.add(retbutton); 130 131 JLabel lblNewLabel_1 = new JLabel(" "); 132 ImageIcon title = new ImageIcon("D:\\Users\\qq\\Desktop\\spin.png"); 133 title.setImage(title.getImage().getScaledInstance(300,80,Image.SCALE_DEFAULT)); 134 lblNewLabel_1.setIcon(title); 135 lblNewLabel_1.setBounds(67, 10, 307, 75); 136 panel.add(lblNewLabel_1); 137 138 /* 爸爸的爸爸叫什么?爸爸的爸爸叫子琦; 139 * 爸爸的妈妈叫什么?爸爸的妈妈叫奶奶; 140 * 爸爸的哥哥叫什么?爸爸的哥哥叫伯伯; 141 * 爸爸的弟弟叫什么?爸爸的弟弟叫叔叔; 142 * 妈妈的爸爸叫什么?妈妈的爸爸叫外公; 143 * 妈妈的妈妈叫什么?妈妈的妈妈叫外婆;*/ 144 145 JButton quebutton = new JButton("\u62BD\u53D6\u95EE\u9898"); //抽取问题 146 quebutton.addActionListener(new ActionListener() { 147 public void actionPerformed(ActionEvent e) { 148 149 Jsifter[1].setVisible(false); 150 pLabel.setVisible(true); 151 psifter.getValue(psifter); 152 switch(psifter.value){ 153 case(1):Jsifter[0].setIcon(image[1]);pLabel.setText("爸爸的爸爸叫什么?");break; 154 case(2):Jsifter[0].setIcon(image[2]);pLabel.setText("爸爸的妈妈叫什么?");break; 155 case(3):Jsifter[0].setIcon(image[3]);pLabel.setText("爸爸的哥哥叫什么?");break; 156 case(4):Jsifter[0].setIcon(image[4]);pLabel.setText("爸爸的弟弟叫什么?");break; 157 case(5):Jsifter[0].setIcon(image[5]);pLabel.setText("妈妈的爸爸叫什么?");break; 158 case(6):Jsifter[0].setIcon(image[6]);pLabel.setText("妈妈的妈妈叫什么?");break; 159 } 160 System.out.println("你选择了" + psifter.value + "号问题,请在控制台做出回答(仅限汉字):"); 161 162 } 163 }); 164 quebutton.setBounds(224, 225, 93, 23); 165 panel.add(quebutton); 166 167 JButton ansbutton = new JButton("\u83B7\u5F97\u7B54\u6848"); //获得答案 168 ansbutton.addActionListener(new ActionListener() { 169 public void actionPerformed(ActionEvent e) { 170 String award = new String(); 171 Scanner sc = new Scanner(System.in); 172 String answer = sc.next(); 173 System.out.println("您的答案为: " + answer); 174 175 //System.out.println("您放弃了这道题,请重新抽取问题!!!"); 176 177 asifter.getValue(asifter); 178 switch(asifter.value){ 179 case(1):image[7].setImage(image[7].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT)); 180 Jsifter[0].setIcon(image[7]);award = "灯管";break; 181 case(2):image[8].setImage(image[8].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT)); 182 Jsifter[0].setIcon(image[8]);award = "吊扇";break; 183 case(3):image[9].setImage(image[9].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT)); 184 Jsifter[0].setIcon(image[9]);award = "课桌";break; 185 case(4):image[10].setImage(image[10].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT)); 186 Jsifter[0].setIcon(image[10]);award = "黑板";break; 187 case(5):image[11].setImage(image[11].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT)); 188 Jsifter[0].setIcon(image[11]);award = "门";break; 189 case(6):image[12].setImage(image[12].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT)); 190 Jsifter[0].setIcon(image[12]);award = "窗";break; 191 } 192 193 if(psifter.value == 1 || answer =="子琦"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 194 else if(psifter.value == 2 || answer =="奶奶"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 195 else if(psifter.value == 3 || answer =="伯伯"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 196 else if(psifter.value == 4 || answer =="叔叔"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 197 else if(psifter.value == 5 || answer =="外公"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 198 else if(psifter.value == 6 || answer =="外婆"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 199 else{pLabel.setText("这位同学,你学艺不精啊!!!");} 200 201 202 203 /*switch(psifter.value){ 204 case(1):if(answer == "\u5B50\u7426"){ 205 pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 206 else{ 207 pLabel.setText("这位同学,你学艺不精啊!!!"); 208 }; 209 break; 210 case(2):if(answer == "\u5976\u5976"){ 211 pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 212 else{ 213 pLabel.setText("这位同学,你学艺不精啊!!!"); 214 }; 215 break; 216 case(3):if(answer == "\u4F2F\u4F2F"){ 217 pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 218 else{ 219 pLabel.setText("这位同学,你学艺不精啊!!!"); 220 }; 221 break; 222 case(4):if(answer == "\u53D4\u53D4"){ 223 pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 224 else{ 225 pLabel.setText("这位同学,你学艺不精啊!!!"); 226 }; 227 break; 228 case(5):if(answer == "\u5916\u516C"){ 229 pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 230 else{ 231 pLabel.setText("这位同学,你学艺不精啊!!!"); 232 }; 233 break; 234 case(6):if(answer == "\u5916\u5A46"){ 235 pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);} 236 else{ 237 pLabel.setText("这位同学,你学艺不精啊!!!"); 238 }; 239 break; 240 }*/ 241 } 242 }); 243 ansbutton.setBounds(327, 225, 93, 23); 244 panel.add(ansbutton); 245 246 } 247 }
人狠话不多 — —。。。接下来让我们进入测试运行环节。
测试运行:
1.首先打开我的软件开始界面是这样的。。。筛子图片是旋转的。。。。(请忽略我的标题。。。图片是可以修改的)
2.点击使用筛子按钮,便会调用howmany()方法得出两个筛子的Value值,并且在控制台中选择一位幸运观众
控制台中提示的内容为:有请 8(其为筛子value值之和) 号同学上台回答问题
3.接下来点击抽取问题选项,第一个筛子将会重新调用getValue方法,其值为题库中题号数,并在一旁的JText中显示问题。你需要在控制台中输入答案并按下回车键
控制台中显示内容为:(咳咳。。。为选到最有代表性的问题,重新抽取了很多次问题)
所以你应该输入的答案为“子琦”,然后敲下回车键:)
4.点击获得答案按钮,程序会将输入的内容和答案进行比对。如果正确将会显示提示,并使用筛子选择随机奖品。具体过程不再描述
如果错误会显示:“这位同学你学艺不精啊!!!” 并将图片换成旋转的筛子。
小结:
总算可是做完了,比我预计的时间也就短很多吧。。。。在做之前个人认为以自己的编程功底怎么也得做个一下午加一晚上。。。结果用了4小时(可能边玩游戏边编程效率会高吧— —。。。)就写好了。果然其中BUG不少,部分代码需要继续改进,以防出现死循环这样的问题,以及部分代码还存在问题,显示的图片内容不对,有待日后的修改。其软件的封装和调用做的不是太好,大量代码写进了GUI里面。。。。。。。唉,日后再说吧,尽量抽空改改,你看,这都大三了比较忙(并不)。。。日后尽量,哦不,一定减少游戏时间用于软件的测试和优化方面,不能光写完软件就算完了。(再次立下flag:这个软件一定不会太监的)