結對專案

aBin_L發表於2024-09-29

一、題目簡介

    遊戲規則是模仿網路上普通的連連看遊戲,主要是滑鼠兩次點選的圖片能否消去的問題。當前,前提是點選兩張相同的圖片,若點選的是同一張圖片或者兩張不同的圖片,則不予處理。在兩張想同圖片所能連通的所有路徑中,如果存在一條轉彎點不多於兩個的路徑,就可以消去;如果沒有,則不予處理。
    該遊戲由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小程式的工作原理和使用方法。另外,還了解了許多新的知識。經過兩個人的合作努力,我們對此遊戲進行各種完善,從原來的數字圖片改成了一些水果的圖片,從沒有計時功能到增加了計時功能,從沒有登入介面到製作了一個登入介面,從一次次的完善中,我們收穫了很多。當然該遊戲並不是完美的,還有一些功能可以加強完善,這需要我們繼續努力,進一步探究。

 

 

相關文章