1. 程式人生 > >Java作業實踐(一)魔板遊戲

Java作業實踐(一)魔板遊戲

課題:魔板遊戲

一、課設要求

1.基本功能

(1)遊戲規則

一個3×3的魔板,有一個格子是空的,其他格子內隨機放置1-8共8個編號的方塊,通過單擊任意一個與空格子相鄰的方塊可以把該方塊移入空格子,不斷的移動方塊,直到方塊一行一行的按數字順序排好。

(2)程式功能

三個基本功能:方塊移動(鍵盤滑鼠操作皆可)、遊戲控制(改變遊戲狀態)、遊戲計時。

(3)程式介面

根據遊戲的三種狀態有三種介面

2.擴充套件功能(必須通過選單命令實現,前兩個是必須完成的功能,後兩個是選做的功能)

難度設定(更改方塊的行列數),放在設定選單下

魔板設定(更改方塊的顯示效果,顯示為拼圖),放在設定選單下

背景音樂設定(背景音樂開關和音樂選擇),放在設定選單下

玩家排行榜(根據遊戲完成時間生成,用資料庫或檔案儲存),放在檔案選單下,退出命令之前

  • 課設內容分析——總體設計部分
  1. 各個類的功能說明

PuzzleGame.java  主類,負責建立魔板遊戲的主視窗

PuzzlePad.java   用於建立魔板遊戲的方塊及其移動

Handleimage.java  將一個影象分解成多個部分並隨即排列

Handlemove.java    用於控制滑鼠來移動方塊

VerifySuccess.java 用於檢測是否按照順序排列

People.java        表示成績和名字

Record.java        記錄名字和成績到相應的檔案中

Block.java         表示方塊

Point.java         表示方塊的位置

  1. 各個類的成員變數                                                                                                                                             

(1)PuzzleGame類成員變數

Bar                 用來新增選單

GradeMenu           選擇級別選單

modeMenu            選擇模式選單

resultMenu          檢視英雄榜選單

ChoiceImage         選擇影象

OneGrade            初級

TwoGrade            高階

NewImage            選擇一幅新影象

digitPlay           數字玩法

imagePlay           影象玩法

  1. PuzzlePad類成員變數

Point               確定模組中的方塊位置

Block               表示模組中的方塊

Distance            確定物件之間的距離

Handmove            控制滑鼠點選方塊

HandleImage         影象分成若干個小影象

VerifySuccess       驗證是否排序成功

  1. HandImage類成員變數

ImageWidth/Height   用來儲存影象的寬與高

Tool                用來獲取Image物件

  1. HandleMove類變數成員

Setpoint            用於移動block物件

SetVerifySuccess    用於檢驗物件是否按要求排列完畢

InitSpendTime       將SpendTime的值設定為0

ActionPerformed     顯示使用者當前用時

  1. VerifySuccess類成員變數

Point               Point型別的二維陣列

Object              Object陣列,其單元可以存放任何變數

  1. Record類變數成員

Time                使用者用時

YourName            使用者用來輸入名字的文字框

Enter和Cancel      enter可以用來儲存成績,cancel放棄成績

GradeFile           級別檔案

  1. People類變數成員

Tie                使用者用時

Name                使用者姓名

  1. Block類成員變數

Point               確定block物件在魔板中的位置

Object              確定block物件上所顯示數字或影象

  1. Point類成員變數

X Y                 表示容器的兩個座標

Haveblock           block物件在point物件上的資料是否正確

  1. 各個類的方法

(1)PuzzleGame類方法

PuzzleGame          完成程式的初始化功能

Main()程式執行的入口方法

  1. PuzzlePad類方法

PuzzlePad           負責建立PuzzlePad物件

GetHandMove         返回其中的GetHandMove物件

Image               設定Image物件

GetGrade            返回Grade

SetIsDigitplay      將魔板設定為數字玩法

SetIsImageplay      將魔板設定為影象玩法

PaintComponent      對照圖   

  1. HandImage類方法

HandImage           負責完成HandImage物件的初始化

GetImages           將那些分解完的小圖片放在Image陣列中

  1. HandleMove類方法

HandleMove          建立HandleMove物件

SetPoint            將模板容器中的point物件傳遞給該類中物件

InitSpendTime       將spendtime值設定為0

Mousepressed        執行滑鼠左鍵物件,根據規則移動Block物件

ActionPerformed     顯示使用者當前的用時

  1. VerifySuccess類方法

HandleMove          建立HandleMove物件

SetPoint            將模板容器中的point物件傳遞給該類中物件

SetPoint            將模板容器中的Interger陣列的引用傳遞給該物件中的Point

IsSuccess           判斷程式是否按正確順序排列

  1. Record類方法

Record              用來創造Record物件

File            當用戶成功是彈出Rcord對話方塊,將呼叫SetGradeFile方法將級別檔案傳遞給Record對話方塊gradefile

SetTime              將記錄的用時傳遞給Record對話方塊gradeFile

  1. People類方法

GetTime               返回 time

GetName               返回 name

  1. Block類方法

SetAtPoint          設定自己所在的點

GetAtPoint          返回自己所在的點

SetObject           設定自己的成員Object

PaintComponent      繪製Image物件

  1. Point類方法

Point               建立Point物件

IsHaveBlock         如果當前Point物件上有Block物件返回ture

GetX() GetY()       返回X軸座標和Y座標

SetBlock            將引數指定的Block物件放在當前Point物件上

GetBlock            返回當前Point物件上的Block物件

四、 課設成果

  1. 初始介面

  1. 遊戲模式選擇(數字與影象)

(1)數字

  1. 影象

  1. 使用者計時

  1. 遊戲難度選擇

  1. 成功介面

  1. 排行榜

附錄:

程式碼如下:

PuzzleGame

package mobanyouxi;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.io.*;

import javax.swing.filechooser.*;

public class PuzzleGame extends JFrame implements ActionListener{

    PuzzlePad puzzlePad;

    JMenuBar bar;

    JMenu gradeMenu,choiceImage,resultMenu,modeMenu;///////////

    JMenuItem oneGrade,twoGrade,newImage,defaultImage;

    JMenuItem oneGradeResult,twoGradeResult;////////

    File fileOneGrade,fileTwoGrade,gradeFile;//////////

    JMenuItem digitPlay,imagePlay;

    ButtonGroup group=null;

   // Record record=null;

    ShowRecordDialog showDiolag=null;///////////

    JButton startButton;

    JButton refreshButton;

    Image image;

    Toolkit tool;

    public PuzzleGame(){

     fileOneGrade=new File("初級魔板遊戲排行榜.txt");//////////

        fileTwoGrade=new File("高階魔板遊戲排行榜.txt");//////////

        tool=getToolkit();

        bar=new JMenuBar();

        modeMenu=new JMenu("選擇玩法");

        digitPlay=new JMenuItem("數字玩法");

        imagePlay=new JMenuItem("影象玩法");

        modeMenu.add(digitPlay);

        modeMenu.add(imagePlay);

        gradeMenu=new JMenu("選擇級別");

        oneGrade=new JMenuItem("初級");

        twoGrade=new JMenuItem("高階");

        gradeMenu.add(oneGrade);

        gradeMenu.add(twoGrade);

        choiceImage=new JMenu("選擇影象");

        newImage=new JMenuItem("選擇一幅新影象");

        defaultImage=new JMenuItem("使用預設影象");

        choiceImage.add(newImage);

        choiceImage.add(defaultImage);

        resultMenu=new JMenu("檢視英雄榜");/////////////

        oneGradeResult=new JMenuItem("初級英雄榜"); /////////////

        twoGradeResult=new JMenuItem("高階英雄榜");////////////////

        resultMenu.add(oneGradeResult);///////////

        resultMenu.add(twoGradeResult);//////////////

        bar.add(modeMenu);

        bar.add(gradeMenu);

        bar.add(choiceImage);

        bar.add(resultMenu);

       /////////

        setJMenuBar(bar);

        oneGrade.addActionListener(this);///////////

        twoGrade.addActionListener(this);//////////

        newImage.addActionListener(this);

        defaultImage.addActionListener(this);

        oneGradeResult.addActionListener(this);/////

        twoGradeResult.addActionListener(this);/////

        digitPlay.addActionListener(this);

        imagePlay.addActionListener(this);

        startButton=new JButton("重新整理數字");

        startButton.addActionListener(this);

        refreshButton=new JButton("重新整理圖片");

        refreshButton.addActionListener(this);

        puzzlePad=new PuzzlePad();               

        add(puzzlePad,BorderLayout.CENTER);

        JPanel pNorth=new JPanel();

        pNorth.add(startButton);

        pNorth.add(refreshButton);

        add(pNorth,BorderLayout.NORTH);

        add(puzzlePad.getHandleMove(),BorderLayout.SOUTH);

      validate();

      setVisible(true);

      setBounds(250,50,650,650);

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      try{

            image=tool.createImage(new File("dog.jpg").toURI().toURL());

            puzzlePad.setImage(image);

        }

        catch(Exception exp){}

     // imageName=new String[imageNumber];

      //for(int i=0;i<imageName.length;i++){

     //   imageName[i]=new String("car"+i+".jpg");

     // }

     // m=5;

      //n=6;

     // gradeFile=fileOneGrade;

      //memoryArea.initBlock(m,n,imageName,gradeFile);

     // add(memoryArea,BorderLayout.CENTER);

     // record=new Record();

//      showRead=new ShowRecord();

      if(!fileOneGrade.exists()){   /////                      

         try { fileOneGrade.createNewFile();/////

         }/////

         catch(IOException exp){}/////

      }

      if(!fileTwoGrade.exists()){     ////                    

          try { fileTwoGrade.createNewFile();////

         }

         catch(IOException exp){}/////

      }

       showDiolag=new ShowRecordDialog();/////

}

  public void actionPerformed(ActionEvent e){

       if(e.getSource()==startButton){

        puzzlePad.setIsDigitPlay();          

       }

       else if(e.getSource()==refreshButton) {

        puzzlePad.setImage(image);

           puzzlePad.setIsImagePlay();

       }

       else if(e.getSource()==digitPlay){

                puzzlePad.setIsDigitPlay();

           }

           else if(e.getSource()==imagePlay){

              puzzlePad.setImage(image);

              puzzlePad.setIsImagePlay();

           }

       else if(e.getSource()==oneGrade){

           puzzlePad.setGrade(1);

       }

       else if(e.getSource()==twoGrade){

           puzzlePad.setGrade(2);

       }

       else if(e.getSource()==newImage){

          FileNameExtensionFilter filter = new FileNameExtensionFilter(

          "JPG & GIF Images", "jpg", "gif");

           JFileChooser chooser=new JFileChooser();

           chooser.setFileFilter(filter);

           int state=chooser.showOpenDialog(null);

           File file=chooser.getSelectedFile();

           if(file!=null&&state==JFileChooser.APPROVE_OPTION){

              try{

               image=tool.createImage(file.toURI().toURL());

               puzzlePad.setImage(image);

              }

              catch(Exception exp){}  

           }

      }

      else if(e.getSource()==defaultImage){

          try{

                image=tool.createImage(new File("dog.jpg").toURI().toURL());

                puzzlePad.setImage(image);

              }

          catch(Exception exp){}  

     }

     if(e.getSource()==oneGradeResult){////

          showDiolag.setGradeFile(fileOneGrade);////

          showDiolag.showRecord();////

          showDiolag.setVisible(true);////

      }////

      if(e.getSource()==twoGradeResult){/////

          showDiolag.setGradeFile(fileTwoGrade);/////

          showDiolag.showRecord();/////

          showDiolag.setVisible(true);////

      }//用來生成英雄榜txt文件/////

   }

  public  static void main(String args[]){

      new PuzzleGame();

  }  

}

PuzzlePad

package mobanyouxi;

import javax.swing.*;

import java.io.*;

import java.util.*;

import java.awt.*;

public class PuzzlePad extends JPanel{

     Point [][] point;

     Block [][] block;

     int distance=100,grade=1,m=3,n=3;////

     HandleMove handleMove;

     HandleImage handleImage;

     VerifySuccess verifySuccess;

     Image image;

     boolean isDigitPlay;

     //Record record;

     public PuzzlePad(){

         setBackground(Color.gray);

         setLayout(null);

         handleMove=new HandleMove();

         handleMove.initSpendTime();

         handleImage=new HandleImage();

         verifySuccess=new VerifySuccess();

        // record=new Record();

         handleMove.setVerifySuccess(verifySuccess);

     }

     public HandleMove getHandleMove(){

        return handleMove;

     }

     public void setImage(Image image){

        this.image=image;

     }

     public void setGrade(int grade){

         this.grade=grade;

         handleMove.grade=grade;////

         if(grade==1){

            m=3;

            n=3;

         }

         else if(grade==2){

            m=4;

            n=4;

         }

     }

     public int getGrade(){

         return grade;

     }

     private void needInit(){

         handleMove.initSpendTime();

         removeAll();

         point=new Point[m][n];

         block=new Block[m][n];

         int Hspace=distance,Vspace=distance;

         for(int i=0;i<m;i++){

            for(int j=0;j<n;j++){

               point[i][j]=new Point(Hspace,Vspace);

               Hspace=Hspace+distance;

            }

            Hspace=distance;

            Vspace=Vspace+distance;

         }

         handleMove.setPoint(