结对编程——黄金点游戏
本次作业属于结对编程项目,由我和薛鹏飞用了2天时间共同完成。
开始做这个结对编程前,一开始我提议和薛鹏飞用C语言写,但是后来有看了老师对结对编程的细节要求,选择了最后刚最新学习的Java语言,C语言实现可视化界面十分困难,放弃了C语言。由于Java有很多优点,对于可视化界面编程很方便,正好薛鹏飞在eclipse里装了一个可视化编程工具——windowbulider,这样实现一个较为友好的的游戏界面就十分容易了。
有了便捷的编译环境必须考虑项目的需求分析,我的设计参考了其同学输入输出,这样对玩游戏出现很大的可预测下,薛鹏飞说不应该要在游戏输入数据时出现可预测性,将每一个输入的数据用加密输入,用*显示输出,这样保证了数据游戏乐趣,这样的游戏在心里上就刺激了游戏玩家,吸引更多的人去玩。因为我们感觉这个游戏的乐趣其实在于玩家会由上一组结果来预测其他人将输入的数并决定本次要输入多大的数(亲自试过这游戏,最后大家输入的数越来越小......),是一个心理博弈类的游戏,所以我们决定设计一个不限人数和次数的黄金点游戏。
我们设计游戏界面,作为两个普通的理工科学生,我们尽量精简游戏的界面,通过定义了一个JPasswordField作为玩家的加密输入,定义了两个按钮JButton分别添加了单击事件用作输入本次结果和总成绩,定义了一个JTextArea用来显示结果。
设计完界面后我们进行具体编码操作,首先是显示本次结果部分:定义一个字符串用正则表达式获取玩家输入的数并显示结果,定义一个double类型的数组存输入的数(方便取绝对值),经过计算找出胜利者和失败者,算出他们得分和扣分,算出既没有得分又没扣分的人员得分均显示0分。
最后是显示总分的部分:之前打算在这里一次计算出总成绩。例如:m个人在玩,1号玩家赢了一次输了2次那么得分为m-2-2分。但是之前的单击事件(显示本次结果)得到的结果没有进行保存,而要达到输出目的必须要把每次结果存放到一个容器里然后在输出,所以我们要在显示本次结果的事件里在写一些代码用来存放本次数据。首先我们想到数组但立刻就被我否决了,因为数组长度是固定的,而游戏人数我们不希望是固定的,就好像一帮人玩游戏,突然有个人走了或者有其他人想加入了,那这游戏就不能玩了?所以数组不满足要求,和数组功能类似的是arraylist,这个可以改变长度,并且把索引位置当作玩家就可以输出该玩家的结果。但薛鹏飞感觉既然是一个人对应了一个分数,那么这种映射关系还是用HashMap来存放比较好,这样一个玩家(key)对应着一个得分(value)。所以我们采用了HashMap,每轮都对里面的内容进行修改。然后在显示总分的事件里只需要打印里面的内容即可。
通过此次结对编程,加深了对合作的认识,在现在社会就是一个合作的时代,并不是一个适合特立独行的时代。要认识自己的劣势和长处,客观的认识自己,结对编程锻炼的是彼此统一的合作,必须一起努力。在这次结对编程中,特别感谢薛鹏飞同学在这次合作时的尽心尽力,在一些我出现错误分析时立刻予以纠正,同时薛鹏飞有很强的创新思想,思考问题很全面,在自学Java学习方面很刻苦,用了很短的时间就学会了一门语言,学习能力很强,希望以后能够与他多多合作。
学海无涯,必须共同努力,多与任何人去参与项目,锻炼自己的团队意识,加油,走向“源始时代”。
源代码如下:
import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.border.EmptyBorder; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JLabel; import javax.swing.LayoutStyle.ComponentPlacement; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JTextArea; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; public class dfgsd extends JFrame { private JPanel contentPane; private JTextField textField; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { dfgsd frame = new dfgsd(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public dfgsd() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); HashMap<Integer,Double> map=new HashMap<Integer,Double>(); textField = new JPasswordField(); textField.setColumns(10); JTextArea textArea = new JTextArea(); textArea.setWrapStyleWord(true); JLabel lblNewLabel = new JLabel("\u8BF7\u8F93\u5165"); JButton btnNewButton = new JButton("\u67E5\u770B\u672C\u6B21\u7ED3\u679C"); btnNewButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { int sum = 0; int length = 0; String result = textField.getText(); String[] a = result.split("\\D"); for(int i = 0;i < a.length;i++) { textArea.append(((i+1)+"输入的数为" + a[i])); textArea.append("\n"); sum =sum + Integer.parseInt(a[i]); length ++; } double b = sum/(length)*0.618; textArea.append("结果为"+b); textArea.append("\n"); double[] type = new double[a.length]; int max = 1,min = 1; for(int i = 0;i < a.length;i++) { type[i] = Double.parseDouble(a[i]); } double Min = type[0]; double Max = 0f; for(int i = 0;i < a.length;i++) { if(Max < java.lang.Math.abs(type[i]-b)) { Max = java.lang.Math.abs(type[i]-b); max = i + 1; } else if(Min > java.lang.Math.abs(type[i]-b)) { Min = java.lang.Math.abs(type[i]-b); min = i + 1; } } textArea.append("获胜者是:"+min+"输入的数为"+type[min-1]+"加"+a.length+"分"); textArea.append("\n"); textArea.append("失败者是:"+max+"输入的数为"+type[max-1]+"减2分"); textArea.append("\n"); boolean contains = map.containsKey(max); if(contains) { map.put(max, (double) (map.get(max) - 2)); }else { map.put(max, (double) - 2); } boolean contains2 = map.containsKey(min); if(contains2) { map.put(min, (double) (a.length)+map.get(min)); }else { map.put(min, (double) a.length); } } }); JButton btnNewButton_1 = new JButton("\u67E5\u770B\u6700\u7EC8\u5F97\u5206"); btnNewButton_1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { for (Integer Key : map.keySet()) { textArea.append( Key + ":\t" + map.get(Key)); textArea.append("\n"); } textArea.append("其他人均为0分,请继续努力"); } }); GroupLayout gl_contentPane = new GroupLayout(contentPane); gl_contentPane.setHorizontalGroup( gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addComponent(lblNewLabel) .addPreferredGap(ComponentPlacement.UNRELATED) .addComponent(textField, GroupLayout.PREFERRED_SIZE, 301, GroupLayout.PREFERRED_SIZE)) .addGroup(gl_contentPane.createSequentialGroup() .addGap(60) .addComponent(btnNewButton) .addGap(37) .addComponent(btnNewButton_1)) .addComponent(textArea, GroupLayout.PREFERRED_SIZE, 382, GroupLayout.PREFERRED_SIZE)) .addContainerGap(42, Short.MAX_VALUE)) ); gl_contentPane.setVerticalGroup( gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE) .addComponent(lblNewLabel) .addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE) .addComponent(btnNewButton) .addComponent(btnNewButton_1)) .addGap(2) .addComponent(textArea, GroupLayout.DEFAULT_SIZE, 206, Short.MAX_VALUE)) ); contentPane.setLayout(gl_contentPane); } }
测试运行结果截图:
结对编程学习时的照片: