南昌航空大學實驗報告
2021 年 12 月 3 日
課程名稱: 面向對象程序設計B 實驗名稱: 用戶圖形界面
學號: 姓名: 同組人:
指導教師評定: 簽名:
一、實驗目的
1、了解JavaFX的基本原理和基本組件;
2、能夠熟練應用JavaFX組件進行界面設計;
3、掌握Java的事件驅動機制、lambda表達式;
4、掌握shape形狀類的使用。
二、實驗要求
1、 根據實驗步驟中提出的要求,使用eclipse等開發工具編寫相應的Java程序;
2、 編譯、運行自己所編寫的Java程序;
3、 根據編譯與運行過程中所獲得的錯誤信息修改程序直至獲得正確的結果;
4、 記錄實驗中遇到的各類問題並以及解決辦法。
三、實驗步驟
1、 請修改實驗四農夫過河游戲的代碼,將用戶界面改為圖形界面,界面效果自行設計。
設計方法:主要改動的一個是Main方法,把按鈕的控制等等代碼都加到這里面,其次則是class MaterialObject,class Game,主要改動也是因為添加了按鈕,剩下的都與實驗四的代碼差不多,舉個例子如下所示:
和
2、 請畫出修改后的類圖,並說明在界面中使用了哪些技巧以達到較好地界面效果。
四、實驗結果
開始:
若失敗:
若是成功:
五、實驗小結
通過這次學會了Javafx的使用,實話說,感覺這里蠻難的,里面好多方法的使用都要去學習,去琢磨,通過查閱資料,瀏覽他人優質的代碼去學習,去改進,整個實驗進行的很曲折,功能也有些不完善,但是總體而言還是收獲很大的,javafx里面的按鈕事件驅動機制、lambda表達式等等,還有很多值得去學習。
六、附錄
package jxceshi;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.HashSet;
public class Main extends Application {
GridPane pane = new GridPane();
Game user = new Game();
@Override
public void start(Stage stage) {
pane.setAlignment(Pos.CENTER);
pane.setPadding(new Insets(5,2,2,2));
pane.setHgap(3.5);
pane.setVgap(3.5);
//加入圖片效果
Image image = new Image("file:F:\\圖片\\河.jpg");
ImageView imageView = new ImageView();
imageView.setImage(image);
imageView.setFitHeight(410.5);
imageView.setFitWidth(110);
pane.add(imageView,1,0,1,4);
//加入按鍵
Button bt = new Button("農夫獨自過河");
bt.setMinSize(110,30);
ButtonEvents handle = new ButtonEvents(1);
bt.setOnAction(handle);
pane.add(bt,0,4);
bt = new Button("農夫帶狼過河");
bt.setMinSize(110,30);
handle = new ButtonEvents(2);
bt.setOnAction(handle);
pane.add(bt,1,4);
bt = new Button("農夫帶羊過河");
bt.setMinSize(110,30);
handle = new ButtonEvents(3);
bt.setOnAction(handle);
pane.add(bt,0,5);
bt = new Button("農夫帶菜過河");
bt.setMinSize(110,30);
handle = new ButtonEvents(4);
bt.setOnAction(handle);
pane.add(bt,1,5);
/*bt = new Button("退出游戲");
bt.setMinSize(110,63.5);
handle = new ButtonEvents(0);
bt.setOnAction(handle);
pane.add(bt,2,4,1,2);*/
pane=user.play(pane,-1);
Scene scene = new Scene(pane);
stage.setTitle("農夫過河");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
class ButtonEvents implements EventHandler<ActionEvent> {
int flag;
ButtonEvents(int i)
{
this.flag=i;
}
@Override
public void handle(ActionEvent event) {
if(flag==0)
System.exit(0);
else
pane=user.play(pane,flag);
}
}
}
abstract class MaterialObject
{
String type;
String place;
boolean isExit;
MaterialObject()
{
this.place = "Left";
isExit = true;
}
void diedOut()
{
this.isExit=false;
}
boolean isExit()
{
return this.isExit;
}
void showStatus(GridPane pane)
{
Image image;
ImageView imageView;
switch(this.type)
{
case "Farmer":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,0);
image = new Image("file:F:\\圖片\\農夫.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,0);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,0);
image = new Image("file:F:\\圖片\\農夫.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,0);
}
break;
case "Wolf":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,2);
image = new Image("file:F:\\圖片\\狼.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,2);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,2);
image = new Image("file:F:\\圖片\\狼.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,2);
}
break;
case "Sheep":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,1);
image = new Image("file:F:\\圖片\\羊.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,1);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,1);
image = new Image("file:F:\\圖片\\羊.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,1);
}
break;
case "Cabbage":
if(this.place.equals("Right"))
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,3);
image = new Image("file:F:\\圖片\\白菜.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,3);
}
else
{
image = new Image("file:F:\\空.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,2,3);
image = new Image("file:F:\\圖片\\白菜.jpg");
imageView = new ImageView();
setSize(imageView,image);
pane.add(imageView,0,3);
}
break;
}
}
void setSize(ImageView imageView,Image image)
{
imageView.setImage(image);
imageView.setFitHeight(100);
imageView.setFitWidth(110);
}
}
class Animal extends MaterialObject
{
HashSet<String> recipe = new HashSet<String>();
boolean eat(MaterialObject object,MaterialObject farmer)
{
if(canBeEat(object,farmer))
{
object.diedOut();
return true;
}
else
return false;
}
void addedToRecipe(MaterialObject object)
{
this.recipe.add(object.type);
}
boolean isFood(MaterialObject object)
{
if(recipe.contains(object.type))
return true;
else
return false;
}
boolean canBeEat(MaterialObject object,MaterialObject farmer)
{
if(isFood(object)&&object.place.equals(this.place)&&!farmer.place.equals(this.place))
return true;
else
return false;
}
}
class Person extends MaterialObject
{
}
class Plant extends MaterialObject
{
}
abstract class AbstractTransport
{
String place;
int capacity;
AbstractTransport()
{
this.place="Left";
this.capacity=2;
}
ArrayList<MaterialObject> goodses = new ArrayList<MaterialObject>();
void moveTo()
{
if(this.place.equals("Left"))
{
this.place="";
this.place="Right";
}
else
{
this.place="";
this.place="Left";
}
}
}
class Boat extends AbstractTransport
{
void crossRiver()
{
int i;
for(i=0;i<goodses.size();i++)
{
if(goodses.get(i).place.equals("Left"))
{
goodses.get(i).place="";
goodses.get(i).place="Right";
}
else
{
goodses.get(i).place="";
goodses.get(i).place="Left";
}
}
moveTo();
}
void board(MaterialObject object)
{
goodses.add(object);
capacity--;
}
void disembark()
{
goodses.clear();;
capacity=2;
}
}
abstract class AbstractGame
{
GameOverRule gameOverRule=new GameOverRule();
GameSuccessRule gameSuccessRule=new GameSuccessRule();
GameData gameData=new GameData();
abstract GridPane play(GridPane pane,int choice);
}
class Game extends AbstractGame
{
GameUI UI = new GameUI();
CrossRiverRule rule = new CrossRiverRule();
int over=0;
GridPane play(GridPane pane,int choice)
{
switch(choice)
{
case 1:
gameData.boat.board(gameData.farmer);
gameData.boat.crossRiver();
gameData.boat.disembark();
break;
case 2:
if(rule.hasCross(gameData.wolf, gameData.boat))
{
gameData.boat.board(gameData.farmer);
gameData.boat.board(gameData.wolf);
gameData.boat.crossRiver();
gameData.boat.disembark();
}
break;
case 3:
if(rule.hasCross(gameData.sheep, gameData.boat))
{
gameData.boat.board(gameData.farmer);
gameData.boat.board(gameData.sheep);
gameData.boat.crossRiver();
gameData.boat.disembark();
}
break;
case 4:
if(rule.hasCross(gameData.cabbage, gameData.boat))
{
gameData.boat.board(gameData.farmer);
gameData.boat.board(gameData.cabbage);
gameData.boat.crossRiver();
gameData.boat.disembark();
}
break;
case 0:
over=1;
break;
}
pane=UI.showStatus(gameData,pane);
Image image;
ImageView imageView;
if(over==1)
{
image = new Image("file:F:\\圖片\\輸.jpg");
imageView = new ImageView();
imageView.setImage(image);
imageView.setFitHeight(410.5);
imageView.setFitWidth(337);
pane.add(imageView,0,0,3,4);
}
if(gameOverRule.judge(gameData))
{
pane.getChildren().clear();
if(gameSuccessRule.judge(gameData))
image = new Image("file:F:\\圖片\\勝利.jpg");
else
image = new Image("file:F:\\圖片\\輸.jpg");
imageView = new ImageView();
imageView.setImage(image);
imageView.setFitHeight(417.5);
imageView.setFitWidth(337);
pane.add(imageView,0,0,3,4);
}
return pane;
}
}
class GameUI
{
GridPane showStatus(GameData gameData,GridPane pane)
{
gameData.farmer.showStatus(pane);
gameData.wolf.showStatus(pane);
gameData.sheep.showStatus(pane);
gameData.cabbage.showStatus(pane);
return pane;
}
}
class GameData
{
MaterialObject farmer = new Person();
Animal wolf = new Animal();
Animal sheep = new Animal();
MaterialObject cabbage = new Plant();
Boat boat = new Boat();
public GameData()
{
farmer.type="Farmer";
wolf.type="Wolf";
sheep.type="Sheep";
cabbage.type="Cabbage";
wolf.addedToRecipe(sheep);
sheep.addedToRecipe(cabbage);
}
}
abstract class AbstractRule
{
abstract boolean judge(GameData gameData);
}
class CrossRiverRule extends AbstractRule
{
boolean hasCross(MaterialObject object,Boat boat)
{
if(!object.place.equals(boat.place))
return false;
else
return true;
}
@Override
boolean judge(GameData gameData) {
if(gameData.farmer.place.equals("Right")&&gameData.wolf.place.equals("Right")&&gameData.sheep.place.equals("Right")&&gameData.cabbage.place.equals("Right"))
return true;
else
return false;
}
}
class ObjectExitRule extends AbstractRule
{
@Override
boolean judge(GameData gameData) {
if(gameData.wolf.eat(gameData.sheep, gameData.farmer)||gameData.sheep.eat(gameData.cabbage, gameData.farmer))
return false;
else
return true;
}
}
class GameOverRule extends AbstractRule
{
GameSuccessRule win = new GameSuccessRule();
ObjectExitRule live = new ObjectExitRule();
@Override
boolean judge(GameData gameData) {
if(win.judge(gameData)||!live.judge(gameData))
return true;
else
return false;
}
}
class GameSuccessRule extends AbstractRule {
CrossRiverRule cross = new CrossRiverRule();
ObjectExitRule live = new ObjectExitRule();
@Override
boolean judge(GameData gameData) {
if (cross.judge(gameData) && live.judge(gameData))
return true;
else
return false;
}
}