本次作業屬于結對程式設計項目,由我和薛鵬飛用了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);
}
}
測試運作結果截圖:
結對程式設計學習時的照片: