个人在经过长久以来(约等于4小时)的奋战,终于实现了一个上课老师提问并抽奖的小程序。希望这个程序变得非常非常实用

课程的理解:在我的项目开始之前,先学习了一下UML项目类图的画法,和类与类之间的关系。类图的3个基本组件:类名、属性、方法。其中类有6种关系:泛化,实现,依赖,关联,聚合,组合。类进行封装之后才好和其他的类发生关系,所以java的封装,继承,多态必不可少。在一个java项目开始之前。我们必须要使用类图对要干的事情进行需求分析,这样在项目代码编写和具体实现过程中才不会自乱阵脚。

设计实现:

本应用针对如下的要求,为满足老师的使用需求,我提出如下的解决方案

  1. 考虑实现一个老师随机选学生回答问题的小程序,可随机选取学生以及奖口
  2. 老师很花心,需要考虑两种以上界面呈现随机的结果。比如一种用图形,一种用控制台或一种是web。
  3. 注意实现的类的相互关系,怎样设计类的交互更合理。
  4. 扩展:这个模式是不是可以有很多游戏可以实现呢?想想还可以做什么?如何在现在设计的结构基础之上,更容易扩展出其他游戏。举个例,实现并说明你所设计的结构的优越性。

关系类图:

其中筛子依赖筛盅,而筛盅的GUI调用生成新筛盅,筛盅依赖于GUI界面。sifter类用于生成筛子对象,sifterCUP将生成一个筛盅类,用于模拟生成的筛子对象放入一个盅内并摇筛子获得筛子值的类的过程。而GUI则是为了发布一个可视化的界面,方便老师上课使用。其中用到了GUI可视化界面和控制台两种交互方式,其中摇筛子和随机获得奖品的代码,可用于各种通过随机事件获得结果的小游戏或软件之上。图片和代码简单易改,容易阅读。

代码说明:

sifter类用于生成筛子对象

 import java.util.*;

  public class Sifter{
public int value = 0; public static void getValue(Sifter S){
S.value = (int)(1+Math.random()*6);
}
}

sifterCUP将生成一个筛盅类,用于模拟生成的筛子对象放入一个盅内并摇筛子获得筛子值的类的过程。可通过其他类调用生成i个数量的筛子数组,并同时获得筛子的value值

 import java.util.Scanner;

 public class SifterCup {
int amount = 0;
int sum = 0; public void howMany(){ System.out.println("请输入想要使用筛子的数量:");
Scanner sc = new Scanner(System.in);
int amount = sc.nextInt();
Sifter[] sifter = new Sifter[amount];
int[] arr = new int[2]; for(int i = 0; i < amount; i = i+1){
sifter[i] = new Sifter();
sifter[i].getValue(sifter[i]);
System.out.println(sifter[i].value);
sum = sum + sifter[i].value;
}
System.out.println("最终您roll出的点数为:" + sum);
} }

而GUI则是为了发布一个可视化的界面,方便老师上课使用。

 import java.awt.EventQueue;
import java.awt.Image; import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.util.Scanner;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JEditorPane;
import java.awt.Canvas;
import javax.swing.JLabel;
import javax.swing.ImageIcon; public class SifterGUI { private JFrame frame; /**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SifterGUI window = new SifterGUI();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the application.
*/
public SifterGUI() {
initialize();
} /**
* Initialize the contents of the frame.*/
private void initialize() {
   Sifter psifter = new Sifter(); Sifter asifter = new Sifter(); frame = new JFrame(); frame.setTitle("\u5E78\u8FD0\u5973\u751F\u8F6F\u4EF6"); frame.setResizable(false);
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon[] image = new ImageIcon[13];
image[0] = new ImageIcon("D:\\Users\\qq\\Desktop\\0.gif");
image[1] = new ImageIcon("D:\\Users\\qq\\Desktop\\1.png");
image[2] = new ImageIcon("D:\\Users\\qq\\Desktop\\2.png");
image[3] = new ImageIcon("D:\\Users\\qq\\Desktop\\3.png");
image[4] = new ImageIcon("D:\\Users\\qq\\Desktop\\4.png");
image[5] = new ImageIcon("D:\\Users\\qq\\Desktop\\5.png");
image[6] = new ImageIcon("D:\\Users\\qq\\Desktop\\6.png");
image[7] = new ImageIcon("D:\\Users\\qq\\Desktop\\7.jpg");
image[8] = new ImageIcon("D:\\Users\\qq\\Desktop\\8.jpg");
image[9] = new ImageIcon("D:\\Users\\qq\\Desktop\\9.jpg");
image[10] = new ImageIcon("D:\\Users\\qq\\Desktop\\10.jpg");
image[11] = new ImageIcon("D:\\Users\\qq\\Desktop\\11.jpg");
image[12] = new ImageIcon("D:\\Users\\qq\\Desktop\\12.jpg"); JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(null); JLabel[] Jsifter = new JLabel[2]; Jsifter[0] = new JLabel(" ");
Jsifter[0].setIcon(new ImageIcon("D:\\Users\\qq\\Desktop\\0.gif"));
Jsifter[0].setBounds(68, 104, 117, 111);
panel.add(Jsifter[0]); Jsifter[1] = new JLabel(" ");
Jsifter[1].setIcon(new ImageIcon("D:\\Users\\qq\\Desktop\\0.gif"));
Jsifter[1].setBounds(257, 104, 117, 111);
panel.add(Jsifter[1]); JLabel pLabel = new JLabel(" ");
pLabel.setVisible(false);
pLabel.setBounds(189, 69, 255, 128);
panel.add(pLabel); JButton usebutton = new JButton("\u4F7F\u7528\u9AB0\u5B50"); //抽取一名学生
usebutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
SifterCup cup1 = new SifterCup();
Sifter[] sifter = new Sifter[2];
int sum = 0; for(int i= 0;i < 2;i++){
sifter[i] = new Sifter();
sifter[i].getValue(sifter[i]);
System.out.println(sifter[i].value);
sum = sum + sifter[i].value; switch(sifter[i].value){
case(1):Jsifter[i].setIcon(image[1]);break;
case(2):Jsifter[i].setIcon(image[2]);break;
case(3):Jsifter[i].setIcon(image[3]);break;
case(4):Jsifter[i].setIcon(image[4]);break;
case(5):Jsifter[i].setIcon(image[5]);break;
case(6):Jsifter[i].setIcon(image[6]);break;
}
}
System.out.println("有请: " + sum + " 号同学上台回答问题");
}
});
usebutton.setBounds(18, 225, 93, 23);
panel.add(usebutton); JButton retbutton = new JButton("\u91CD\u7F6E\u9AB0\u5B50"); //重置筛子
retbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Jsifter[0].setIcon(image[0]);
Jsifter[1].setIcon(image[0]);
Jsifter[1].setVisible(true);
pLabel.setVisible(false);
}
});
retbutton.setBounds(121, 225, 93, 23);
panel.add(retbutton); JLabel lblNewLabel_1 = new JLabel(" ");
ImageIcon title = new ImageIcon("D:\\Users\\qq\\Desktop\\spin.png");
title.setImage(title.getImage().getScaledInstance(300,80,Image.SCALE_DEFAULT));
lblNewLabel_1.setIcon(title);
lblNewLabel_1.setBounds(67, 10, 307, 75);
panel.add(lblNewLabel_1); /* 爸爸的爸爸叫什么?爸爸的爸爸叫子琦;
* 爸爸的妈妈叫什么?爸爸的妈妈叫奶奶;
* 爸爸的哥哥叫什么?爸爸的哥哥叫伯伯;
* 爸爸的弟弟叫什么?爸爸的弟弟叫叔叔;
* 妈妈的爸爸叫什么?妈妈的爸爸叫外公;
* 妈妈的妈妈叫什么?妈妈的妈妈叫外婆;*/ JButton quebutton = new JButton("\u62BD\u53D6\u95EE\u9898"); //抽取问题
quebutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { Jsifter[1].setVisible(false);
pLabel.setVisible(true);
psifter.getValue(psifter);
switch(psifter.value){
case(1):Jsifter[0].setIcon(image[1]);pLabel.setText("爸爸的爸爸叫什么?");break;
case(2):Jsifter[0].setIcon(image[2]);pLabel.setText("爸爸的妈妈叫什么?");break;
case(3):Jsifter[0].setIcon(image[3]);pLabel.setText("爸爸的哥哥叫什么?");break;
case(4):Jsifter[0].setIcon(image[4]);pLabel.setText("爸爸的弟弟叫什么?");break;
case(5):Jsifter[0].setIcon(image[5]);pLabel.setText("妈妈的爸爸叫什么?");break;
case(6):Jsifter[0].setIcon(image[6]);pLabel.setText("妈妈的妈妈叫什么?");break;
}
System.out.println("你选择了" + psifter.value + "号问题,请在控制台做出回答(仅限汉字):"); }
});
quebutton.setBounds(224, 225, 93, 23);
panel.add(quebutton); JButton ansbutton = new JButton("\u83B7\u5F97\u7B54\u6848"); //获得答案
ansbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String award = new String();
Scanner sc = new Scanner(System.in);
String answer = sc.next();
System.out.println("您的答案为: " + answer); //System.out.println("您放弃了这道题,请重新抽取问题!!!"); asifter.getValue(asifter);
switch(asifter.value){
case(1):image[7].setImage(image[7].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT));
Jsifter[0].setIcon(image[7]);award = "灯管";break;
case(2):image[8].setImage(image[8].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT));
Jsifter[0].setIcon(image[8]);award = "吊扇";break;
case(3):image[9].setImage(image[9].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT));
Jsifter[0].setIcon(image[9]);award = "课桌";break;
case(4):image[10].setImage(image[10].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT));
Jsifter[0].setIcon(image[10]);award = "黑板";break;
case(5):image[11].setImage(image[11].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT));
Jsifter[0].setIcon(image[11]);award = "门";break;
case(6):image[12].setImage(image[12].getImage().getScaledInstance(135,135,Image.SCALE_DEFAULT));
Jsifter[0].setIcon(image[12]);award = "窗";break;
} if(psifter.value == 1 || answer =="子琦"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else if(psifter.value == 2 || answer =="奶奶"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else if(psifter.value == 3 || answer =="伯伯"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else if(psifter.value == 4 || answer =="叔叔"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else if(psifter.value == 5 || answer =="外公"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else if(psifter.value == 6 || answer =="外婆"){pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else{pLabel.setText("这位同学,你学艺不精啊!!!");} /*switch(psifter.value){
case(1):if(answer == "\u5B50\u7426"){
pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else{
pLabel.setText("这位同学,你学艺不精啊!!!");
};
break;
case(2):if(answer == "\u5976\u5976"){
pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else{
pLabel.setText("这位同学,你学艺不精啊!!!");
};
break;
case(3):if(answer == "\u4F2F\u4F2F"){
pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else{
pLabel.setText("这位同学,你学艺不精啊!!!");
};
break;
case(4):if(answer == "\u53D4\u53D4"){
pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else{
pLabel.setText("这位同学,你学艺不精啊!!!");
};
break;
case(5):if(answer == "\u5916\u516C"){
pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else{
pLabel.setText("这位同学,你学艺不精啊!!!");
};
break;
case(6):if(answer == "\u5916\u5A46"){
pLabel.setText("恭喜你答对了,你将获得 " + asifter.value + "号奖品: " + award);}
else{
pLabel.setText("这位同学,你学艺不精啊!!!");
};
break;
}*/
}
});
ansbutton.setBounds(327, 225, 93, 23);
panel.add(ansbutton); }
}

人狠话不多 — —。。。接下来让我们进入测试运行环节。

测试运行:

1.首先打开我的软件开始界面是这样的。。。筛子图片是旋转的。。。。(请忽略我的标题。。。图片是可以修改的)

2.点击使用筛子按钮,便会调用howmany()方法得出两个筛子的Value值,并且在控制台中选择一位幸运观众

控制台中提示的内容为:有请 8(其为筛子value值之和) 号同学上台回答问题

3.接下来点击抽取问题选项,第一个筛子将会重新调用getValue方法,其值为题库中题号数,并在一旁的JText中显示问题。你需要在控制台中输入答案并按下回车键

控制台中显示内容为:(咳咳。。。为选到最有代表性的问题,重新抽取了很多次问题)

所以你应该输入的答案为“子琦”,然后敲下回车键:)

4.点击获得答案按钮,程序会将输入的内容和答案进行比对。如果正确将会显示提示,并使用筛子选择随机奖品。具体过程不再描述

如果错误会显示:“这位同学你学艺不精啊!!!” 并将图片换成旋转的筛子。

小结:

总算可是做完了,比我预计的时间也就短很多吧。。。。在做之前个人认为以自己的编程功底怎么也得做个一下午加一晚上。。。结果用了4小时(可能边玩游戏边编程效率会高吧— —。。。)就写好了。果然其中BUG不少,部分代码需要继续改进,以防出现死循环这样的问题,以及部分代码还存在问题,显示的图片内容不对,有待日后的修改。其软件的封装和调用做的不是太好,大量代码写进了GUI里面。。。。。。。唉,日后再说吧,尽量抽空改改,你看,这都大三了比较忙(并不)。。。日后尽量,哦不,一定减少游戏时间用于软件的测试和优化方面,不能光写完软件就算完了。(再次立下flag:这个软件一定不会太监的)

下面我将随机抽取一名幸运女生,XXXXX的更多相关文章

  1. Java利用数组随机抽取幸运观众

    编写程序,事先将所有观众姓名输入数组,然后获得数组元素的总数量,最后在数组元素中随机抽取元素的下标,根据抽取的下标获得幸运观众的姓名. 思路如下: 定义输入框的按键事件,使用KeyEvent类的get ...

  2. PHP中如何在数组中随机抽取n个数据的值 - array_rand()?

    PHP中如何在数组中随机抽取n个数据的值? 最佳答案 array_rand() 在你想从数组中取出一个或多个随机的单元时相当有用.它接受 input 作为输入数组和一个可选的参数 num_req,指明 ...

  3. sql 随机抽取几条数据的方法 推荐

    传说用这个语句管用:select top 5 * from tablename order by newid() 我放到sql的查询分析器里去执行果然管用,随机抽取5条信息,不停的换,结果我应用到程序 ...

  4. 原!!mysql,几十万条数据中随机抽取1万以内的数据

    想了几种方法: 1.将所有符合条件的对象集合都查出来,在代码里做随机. 2.先查出所有符合条件的id,再代码随机需要抽查数量的id,再 到数据库 中 in. 3.利用order by rand() l ...

  5. php 数组 高效随机抽取指定条记录的算法

    php使用数组array_rand()函数进行高效随机抽取指定条数的记录,可以随机抽取数据库中的记录,适合进行随机展示和抽奖程序. 该算法主要是利用php的array_rand()函数,下面看一下ar ...

  6. 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)

    从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...

  7. 【Python代码】随机抽取文件名列表NameList中的Name作为训练集

    #!/usr/bin/env python #coding=utf-8 #随机抽取一部分图片作为测试集 import random NameList=[]#存储所有图片名字 ''' NameListP ...

  8. Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入以及随机抽取一条记录

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入 entity 对应表中字段,如不对应,在xml中起别名 map ...

  9. TODO:从数据库中随机抽取一条记录

    TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...

随机推荐

  1. 清除clusternode

    Import-Module FailoverClusters then clear-clusternode

  2. BZOJ1901 Dynamic Rankings|带修主席树

    题目链接:戳我 其实我并不会做,于是看了题解 我们都知道主席树是利用前缀和记录历史版本来搞区间K大的一种数据结构.不过一般的主席树只能搞定静态区间第K大.如果带修怎么办呢? 想一下...单点修改+区间 ...

  3. 【程序】必看干货:Photon多人游戏开发教程

    PUN介绍 http://vibrantlink.com/ 入门 Photon Unity Networking(首字母缩写PUN)是一个Unity多人游戏插件包.它提供了身份验证选项.匹配,以及快速 ...

  4. C# combobox手动赋值

    DataTable dt = new DataTable(); dt.Columns.Add("REPAIR_VALUE"); dt.Columns.Add("REPAI ...

  5. [转] 迁移 VMware 虚拟机到 KVM

    迁移 VMware 虚拟机到 KVM 如何迁移 VMware 上的 Windows 及 Linux 虚拟机到基于 KVM 的虚拟机 目前 x86 平台上最流行的虚拟化软件是 VMware 公司的系列产 ...

  6. python3入门之赋值语句介绍

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍赋值语句,以及几种特殊的赋值.下面附有之前的文章: python3入门之print,import,input介绍 python入门之字 ...

  7. 01Trie树 CF923C Perfect Security

    CF923C Perfect Security 上下各n个数,求一种排列p,使上面的数i异或pi成为新的数i,求方案另字典序最小,输出该结果 01Trie树. 记录每个节点经过多少次. 每一次查询的时 ...

  8. linux命令行添加图形化界面

    安装一个图形化的包即可!! yum update grub2-common yum install fwupdate-efi yum groupinstall "GNOME Desktop& ...

  9. 记新人从 excel 文件中读取字典数据踩的一个坑

    原本是打算今天分享一下最近学习接口自动化的心得体会,然而在我写模板的时候,却被一个坑拦我大半天,心得体会不得不 延期再分享了.在我无数次调试无数次看log,终于发现并解决这个问题了.下面记录一下踩的坑 ...

  10. Bi-shoe and Phi-shoe(欧拉筛)

    Bamboo Pole-vault is a massively popular sport in Xzhiland. And Master Phi-shoe is a very popular co ...