首页 > 技术文章 > 结对项目

liandiexueying 2015-05-17 13:45 原文

一、题目简介

    游戏规则是模仿网络上普通的连连看游戏,主要是鼠标两次点击的图片能否消去的问题。当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理。在两张想同图片所能连通的所有路径中,如果存在一条转弯点不多于两个的路径,就可以消去;如果没有,则不予处理。
    该游戏由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小程序的工作原理和使用方法。另外,还了解了许多新的知识。经过两个人的合作努力,我们对此游戏进行各种完善,从原来的数字图片改成了一些水果的图片,从没有计时功能到增加了计时功能,从没有登录界面到制作了一个登录界面,从一次次的完善中,我们收获了很多。当然该游戏并不是完美的,还有一些功能可以加强完善,这需要我们继续努力,进一步探究。

 

 

推荐阅读