一、題目簡介
遊戲規則是模仿網路上普通的連連看遊戲,主要是滑鼠兩次點選的圖片能否消去的問題。當前,前提是點選兩張相同的圖片,若點選的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片所能連通的所有路徑中,如果存在一條轉彎點不多於兩個的路徑,就可以消去;如果沒有,則不予處理。
該遊戲由30張不同的圖片組成,遊戲開始將會出現30張隨機組合的圖片,在規則下點選兩張相同的圖片後圖片將會消失。圖片全部消完為遊戲成功。遊戲還將設定退出,再來一局的按鈕,並實現該功能,方便使用者進行操作。
該遊戲將有如下內容:
(1)遊戲計分功能
當消去兩個相同的圖片後分數將增加100分。
(2)退出功能
該功能有一個“退出”按鈕,當按下“退出”按鈕後,將直接退出遊戲。
(3)再來一局功能
該功能有一個“再來一局”的按鈕,當按下“再來一局”按鈕後,圖片將會重新排列,重新開始遊戲。
(4)遊戲倒數計時功能
在遊戲介面的上方有一個倒數計時的進度條,增加遊戲的難度,激發玩家的挑戰興趣。
(5)使用者登入註冊功能
在進入遊戲介面之前,將會出現使用者登入介面,如果沒有註冊的玩家在按下“註冊”按鈕後將進入註冊介面,玩家需要填寫使用者名稱,密碼,性別等資訊完成註冊,再進入登入介面,輸入使用者名稱和密碼按下“確定”後就將進入遊戲介面,開始遊戲。
連連看遊戲的設計目標為:
(1)該遊戲開始前,將設定一個使用者登入註冊介面,如果沒有註冊的玩家在按下“註冊”按鈕後將進入註冊介面,玩家需要填寫使用者名稱,密碼,性別等資訊完成註冊,再進入登入介面,輸入使用者名稱和密碼按下“確定”後就將進入遊戲介面,開始遊戲。
(2)遊戲中將有“退出”功能,選擇退出命令後程式將終止執行,關閉視窗。
還將有“再來一局”功能,選擇再來一局命令後程式將對圖片重新排列,重新開始遊戲。該遊戲還有一個時間倒數計時的進度條,提醒玩家剩餘的時間,增加遊戲的難度。在介面的頂部有計分功能,當玩家消去圖片後就會贏得相應的分數。
二、程式碼地址
https://github.com/caowenjing/lanlainkan
初冬瑞的部落格地址:
http://www.cnblogs.com/chudachuer/
三、結對分工情況
曹文靜:主要負責登陸介面,時間到的介面,進度條介面。
初冬瑞:主要負責註冊介面,執行介面,查詢圖片。
四、結對實踐過程
五、測試情況
1、使用者登入介面
此JavaScript函式的作用是檢測使用者登陸的合法性,並確認使用者輸入了合法的登入名和口令。
部分程式碼:
private void loginDialog() {
login = new JDialog();
login.setTitle("登入");
login.setLayout(new FlowLayout());
login.add(new JLabel("使用者名稱:"));
final JTextField name = new JTextField(10);
login.add(name);
login.add(new JLabel("密 碼:"));
final JPasswordField password = new JPasswordField(10);
password.setEchoChar('*');
login.add(password);
JButton confirm = new JButton("登入");
confirm.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (compareUserData(name.getText().trim(), new String(password.getPassword()))) {
login.setVisible(false);
mainFrame.setVisible(true);
Timer timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (time.isEnd()) {
System.exit(0);
}
}
});
timer.start();
} else {
JOptionPane.showMessageDialog(login, "使用者名稱或密碼錯誤!", "錯誤提示", JOptionPane.ERROR_MESSAGE);
}
}
});
login.add(confirm);
final JDialog regDialog = new JDialog(login, "註冊", true);
registerDialog(regDialog);
JButton register = new JButton("註冊");
register.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
regDialog.setVisible(true);
}
});
login.add(register);
login.setSize(400, 200);
login.setResizable(false);
login.setLocationRelativeTo(null);
login.setVisible(true);
}
private boolean compareUserData(String name, String password) {
try {
RandomAccessFile out = new RandomAccessFile("user.dat", "rw");
String fname, fpassword = null;
while (out.getFilePointer() < out.length()) {
fname = out.readUTF();
out.readUTF();
fpassword = out.readUTF();
if (fname.equals(name) && fpassword.equals(password)) return true;
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
2、時間到的介面
關鍵程式碼:
public void remove() {
firstButton.setVisible(false); // 不可見
secondButton.setVisible(false);
fraction();
pressInformation = false;
k = 0;
grid[x0][y0] = 0;
grid[x][y] = 0;
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == newlyButton) {
int grid[][] = new int[8][7];
this.grid = grid;
randomBuild();
mainFrame.setVisible(false);
pressInformation = false;
init();
}
if (e.getSource() == exitButton)
System.exit(0);
// if(e.getSource()==resetButton)
// reload();new ActionListener() {
if (e.getSource() == timer) {
if (time.isEnd()) {
timer.stop();
if (JOptionPane.showConfirmDialog(mainFrame,
"時間到了,o(︶︿︶)o \n要再來一局嗎?", "提示",
JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) {
int grid[][] = new int[8][7];
this.grid = grid;
randomBuild();
mainFrame.setVisible(false);
pressInformation = false;
init();
timer.start();
} else
System.exit(0);
}
}
for (int cols = 0; cols < 6; cols++) {
for (int rows = 0; rows < 5; rows++) {
if (e.getSource() == diamondsButton[cols][rows])
estimateEven(cols + 1, rows + 1, diamondsButton[cols][rows]);
}
}
}
3、進度條介面:
關鍵程式碼:
public void xiao() //相同的情況下能不能消去。
{
if((x0==x &&(y0==y+1||y0==y-1)) || ((x0==x+1||x0==x-1)&&(y0==y)))//判斷是否相鄰
{
remove();
}
else
{
for (j=0;j<7;j++ )
{
if (grid[x0][j]==0)//判斷第一個按鈕同行哪個按鈕為空
{
if (y>j) //如果第二個按鈕的Y座標大於空按鈕的Y座標說明第一按鈕在第二按鈕左邊
{
for (i=y-1;i>=j;i-- )//判斷第二按鈕左側直到第一按鈕中間有沒有按鈕
{
if (grid[x][i]!=0)
{
k=0;
break;
}
else{ k=1; } //K=1說明通過了第一次驗證
}
if (k==1)
{
linePassOne();
}
}
if (y<j) //如果第二個按鈕的Y座標小於空按鈕的Y座標說明第一按鈕在第二按鈕右邊
{
for (i=y+1;i<=j ;i++ )//判斷第二按鈕左側直到第一按鈕中間有沒有按鈕
{
if (grid[x][i]!=0)
{
k=0;
break;
}
else { k=1; }
}
if (k==1)
{
linePassOne();
}
}
if (y==j )
{
linePassOne();
}
}
if (k==2)
{
if (x0==x)
{
remove();
}
if (x0<x)
{
for (n=x0;n<=x-1;n++ )
{
if (grid[n][j]!=0)
{
k=0;
break;
}
if(grid[n][j]==0 && n==x-1)
{
remove();
}
}
}
if (x0>x)
{
for (n=x0;n>=x+1 ;n-- )
{
if (grid[n][j]!=0)
{
k=0;
break;
}
if(grid[n][j]==0 && n==x+1)
{
remove();
}
}
}
}
}
for (i=0;i<8;i++ )//列
{
if (grid[i][y0]==0)
{
if (x>i)
{
for (j=x-1;j>=i ;j-- )
{
if (grid[j][y]!=0)
{
k=0;
break;
}
else { k=1; }
}
if (k==1)
{
rowPassOne();
}
}
if (x<i)
{
for (j=x+1;j<=i;j++ )
{
if (grid[j][y]!=0)
{
k=0;
break;
}
else { k=1; }
}
if (k==1)
{
rowPassOne();
}
}
if (x==i)
{
rowPassOne();
}
}
if (k==2)
{
if (y0==y)
{
remove();
}
if (y0<y)
{
for (n=y0;n<=y-1 ;n++ )
{
if (grid[i][n]!=0)
{
k=0;
break;
}
if(grid[i][n]==0 && n==y-1)
{
remove();
}
}
}
if (y0>y)
{
for (n=y0;n>=y+1 ;n--)
{
if (grid[i][n]!=0)
{
k=0;
break;
}
if(grid[i][n]==0 && n==y+1)
{
remove();
}
}
}
}
}
}
}
public void linePassOne()
{
if (y0>j)//第一按鈕同行空按鈕在左邊
{
for (i=y0-1;i>=j ;i-- )//判斷第一按鈕同左側空按鈕之間有沒按鈕
{
if (grid[x0][i]!=0)
{
k=0;
break;
}
else
{ k=2; } //K=2說明通過了第二次驗證
}
}
if (y0<j)//第一按鈕同行空按鈕在與第二按鈕之間
{
for (i=y0+1;i<=j ;i++)
{
if (grid[x0][i]!=0)
{
k=0;
break;
}
else
{ k=2; }
}
}
}
public void rowPassOne()
{
if (x0>i)
{
for (j=x0-1;j>=i ;j-- )
{
if (grid[j][y0]!=0)
{
k=0;
break;
}
else
{ k=2; }
}
}
if (x0<i)
{
for (j=x0+1;j<=i ;j++ )
{
if (grid[j][y0]!=0)
{
k=0;
break;
}
else
{ k=2; }
}
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==newlyButton)
{
int grid[][] = new int[8][7];
this.grid = grid;
randomBuild();
mainFrame.setVisible(false);
pressInformation=false;
init();
}
if(e.getSource()==exitButton)
System.exit(0);
//if(e.getSource()==resetButton)
// reload();
for(int cols=0;cols<6;cols++)
{
for(int rows=0;rows < 5;rows++ )
{
if(e.getSource()==diamondsButton[cols][rows])
estimateEven(cols+1,rows+1,diamondsButton[cols][rows]);
}
}
}
4、總執行結果
測試結果:
六、心得
通過本次實驗我學會了兩個人如何合作完成一個專案,雖然在做專案的過程中我出現過錯誤時,但是我的同伴能夠及時指出我的錯誤,彌補了我的不足,同時也讓我學到了很多。在完成這個專案的過程中,我複習了並學會了圖形使用者介面的概念、AWT的基本體系結構,掌握視窗的基本原理;還有掌握幾種佈局管理器的使用方法和java的事件處理機制;瞭解Swing的基本體系結構,掌握Swing元件的使用方法;掌握java小程式的工作原理和使用方法。另外,還了解了許多新的知識。經過兩個人的合作努力,我們對此遊戲進行各種完善,從原來的數字圖片改成了一些水果的圖片,從沒有計時功能到增加了計時功能,從沒有登入介面到製作了一個登入介面,從一次次的完善中,我們收穫了很多。當然該遊戲並不是完美的,還有一些功能可以加強完善,這需要我們繼續努力,進一步探究。