Java作業實踐(一)魔板遊戲
課題:魔板遊戲
一、課設要求
1.基本功能
(1)遊戲規則
一個3×3的魔板,有一個格子是空的,其他格子內隨機放置1-8共8個編號的方塊,通過單擊任意一個與空格子相鄰的方塊可以把該方塊移入空格子,不斷的移動方塊,直到方塊一行一行的按數字順序排好。
(2)程式功能
三個基本功能:方塊移動(鍵盤滑鼠操作皆可)、遊戲控制(改變遊戲狀態)、遊戲計時。
(3)程式介面
根據遊戲的三種狀態有三種介面
2.擴充套件功能(必須通過選單命令實現,前兩個是必須完成的功能,後兩個是選做的功能)
難度設定(更改方塊的行列數),放在設定選單下
魔板設定(更改方塊的顯示效果,顯示為拼圖),放在設定選單下
背景音樂設定(背景音樂開關和音樂選擇),放在設定選單下
玩家排行榜(根據遊戲完成時間生成,用資料庫或檔案儲存),放在檔案選單下,退出命令之前
- 課設內容分析——總體設計部分
- 各個類的功能說明
PuzzleGame.java 主類,負責建立魔板遊戲的主視窗
PuzzlePad.java 用於建立魔板遊戲的方塊及其移動
Handleimage.java 將一個影象分解成多個部分並隨即排列
Handlemove.java 用於控制滑鼠來移動方塊
VerifySuccess.java 用於檢測是否按照順序排列
People.java 表示成績和名字
Record.java 記錄名字和成績到相應的檔案中
Block.java 表示方塊
Point.java 表示方塊的位置
- 各個類的成員變數
(1)PuzzleGame類成員變數
Bar 用來新增選單
GradeMenu 選擇級別選單
modeMenu 選擇模式選單
resultMenu 檢視英雄榜選單
ChoiceImage 選擇影象
OneGrade 初級
TwoGrade 高階
NewImage 選擇一幅新影象
digitPlay 數字玩法
imagePlay 影象玩法
- PuzzlePad類成員變數
Point 確定模組中的方塊位置
Block 表示模組中的方塊
Distance 確定物件之間的距離
Handmove 控制滑鼠點選方塊
HandleImage 影象分成若干個小影象
VerifySuccess 驗證是否排序成功
- HandImage類成員變數
ImageWidth/Height 用來儲存影象的寬與高
Tool 用來獲取Image物件
- HandleMove類變數成員
Setpoint 用於移動block物件
SetVerifySuccess 用於檢驗物件是否按要求排列完畢
InitSpendTime 將SpendTime的值設定為0
ActionPerformed 顯示使用者當前用時
- VerifySuccess類成員變數
Point Point型別的二維陣列
Object Object陣列,其單元可以存放任何變數
- Record類變數成員
Time 使用者用時
YourName 使用者用來輸入名字的文字框
Enter和Cancel enter可以用來儲存成績,cancel放棄成績
GradeFile 級別檔案
- People類變數成員
Tie 使用者用時
Name 使用者姓名
- Block類成員變數
Point 確定block物件在魔板中的位置
Object 確定block物件上所顯示數字或影象
- Point類成員變數
X Y 表示容器的兩個座標
Haveblock block物件在point物件上的資料是否正確
- 各個類的方法
(1)PuzzleGame類方法
PuzzleGame 完成程式的初始化功能
Main()程式執行的入口方法
- PuzzlePad類方法
PuzzlePad 負責建立PuzzlePad物件
GetHandMove 返回其中的GetHandMove物件
Image 設定Image物件
GetGrade 返回Grade
SetIsDigitplay 將魔板設定為數字玩法
SetIsImageplay 將魔板設定為影象玩法
PaintComponent 對照圖
- HandImage類方法
HandImage 負責完成HandImage物件的初始化
GetImages 將那些分解完的小圖片放在Image陣列中
- HandleMove類方法
HandleMove 建立HandleMove物件
SetPoint 將模板容器中的point物件傳遞給該類中物件
InitSpendTime 將spendtime值設定為0
Mousepressed 執行滑鼠左鍵物件,根據規則移動Block物件
ActionPerformed 顯示使用者當前的用時
- VerifySuccess類方法
HandleMove 建立HandleMove物件
SetPoint 將模板容器中的point物件傳遞給該類中物件
SetPoint 將模板容器中的Interger陣列的引用傳遞給該物件中的Point
IsSuccess 判斷程式是否按正確順序排列
- Record類方法
Record 用來創造Record物件
File 當用戶成功是彈出Rcord對話方塊,將呼叫SetGradeFile方法將級別檔案傳遞給Record對話方塊gradefile
SetTime 將記錄的用時傳遞給Record對話方塊gradeFile
- People類方法
GetTime 返回 time
GetName 返回 name
- Block類方法
SetAtPoint 設定自己所在的點
GetAtPoint 返回自己所在的點
SetObject 設定自己的成員Object
PaintComponent 繪製Image物件
- Point類方法
Point 建立Point物件
IsHaveBlock 如果當前Point物件上有Block物件返回ture
GetX() GetY() 返回X軸座標和Y座標
SetBlock 將引數指定的Block物件放在當前Point物件上
GetBlock 返回當前Point物件上的Block物件
四、 課設成果
- 初始介面
- 遊戲模式選擇(數字與影象)
(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(