Java實驗五


南昌航空大學實驗報告

2021     12     3  

 

 

課程名稱:      面向對象程序設計B            實驗名稱:     用戶圖形界面        

學號:      姓名:        同組人:                                                

指導教師評定:                                      簽名:                         

 

一、實驗目的

1、了解JavaFX的基本原理和基本組件;

2、能夠熟練應用JavaFX組件進行界面設計;

3、掌握Java的事件驅動機制、lambda表達式;

4、掌握shape形狀類的使用。

二、實驗要求

1、 根據實驗步驟中提出的要求,使用eclipse等開發工具編寫相應的Java程序;

2、 編譯、運行自己所編寫的Java程序;

3、 根據編譯與運行過程中所獲得的錯誤信息修改程序直至獲得正確的結果;

4、 記錄實驗中遇到的各類問題並以及解決辦法。

 

三、實驗步驟

1、 請修改實驗四農夫過河游戲的代碼,將用戶界面改為圖形界面,界面效果自行設計。

設計方法:主要改動的一個是Main方法,把按鈕的控制等等代碼都加到這里面,其次則是class MaterialObjectclass 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;

    }

 

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM