Java第三次随笔

Java第三次随笔

这是这个学期最后一次Java的随笔,最近刚刚恢复线下教学有点不太适应,最近学到很多新的东西,我认为有必要总结一下学习成果。下面是我近期学习的内容和对题目集的理解,以及对测试点的踩坑心得。

首先是对于类图之间的联系有了更加深刻的认识,在PTA习题集的电信计费系列中,复杂的类图一度让我无从下手,因为题目集过于复杂我甚至想要放弃这些题目,详细题目可以打开以下两个链接:

  1. https://images.ptausercontent.com/d3c5de10-9e3f-4a4c-877f-64e76c98f1b6.pdf
  2. https://images.ptausercontent.com/825588d3-6c7b-420b-abab-13e36b4c828c.pdf

这是我第一次遇到这么长的题目,上手的时候感觉非常复杂,于是我按照类图的要去一个一个的先把类建立起来。

这三道题其实是一道题,原因是老师怕我们写不出来那么复杂的题目,于是拆成了三次题目让我们写。只是一个递进的作业,如果第一次的类建立的有问题,对接下来的作业就会有很大的影响。

在写这些题目的时候,我拓展了新的知识,比说Java中的SimpleDateFormat类,这个类是一个Java中自带的调用时间的类,通过这个类我们可以计算时间。下面附上我第一题的源码:

 

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        ArrayList<User> users= new ArrayList<>();
        ArrayList<CallRecord> callRecords = new ArrayList<>();
        ArrayList<CallChargeRule> chargeRules = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        String s;
        Date fromdate = null;
        Date todate = null;
        String str = input.nextLine();
        String[] string ;
        int n = 0;
        while (!str.equals("end")){
            if(str.matches("[u][-](0791)[0-9]{7,8}[ ][0]")){
                string = str.substring(2).split("\\s");
                for(int i=0;i<users.size();i++){
                    if(Objects.equals(users.get(i).number, string[0]))
                        n=1;
                }
                if(n==0)
                    users.add(new User(string[0]));
                n = 0;
            }
            if(str.matches("t-(\\d){11,12}\\s(\\d){10,12}\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\s((((1[6-9]|[2-9]\\d)\\d{2}).([13578]|1[02]).([1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2}).([13456789]|1[012]).([1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-2-([1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-2-29-)) (20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d")){
                string = str.substring(2).split("\\s");
                try {
                    fromdate = simpleDateFormat.parse(str.substring(29, 47));
                    todate = simpleDateFormat.parse(str.substring(48));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                for(int i=0;i< users.size();i++){
                    if(users.get(i).number.equals(string[0])){
                        if(string[1].substring(0,4).matches("0791")){
                            try {
                                users.get(i).userRecords.addCallingInCityRecords(new CallRecord(string[2]+" "+string[3],string[4]+" "+string[5]));
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            users.get(i).setUserRecords(users.get(i).userRecords);
                        }
                        else if(string[1].substring(0,4).matches("(079[023456789])|0701")){
                            try {
                                users.get(i).userRecords.addCallingInProvinceRecords(new CallRecord(string[2]+" "+string[3],string[4]+" "+string[5]));
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            users.get(i).setUserRecords(users.get(i).userRecords);
                        }
                        else{
                            try {
                                users.get(i).userRecords.addCallingInLandRecords(new CallRecord(string[2]+" "+string[3],string[4]+" "+string[5]));
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                            users.get(i).setUserRecords(users.get(i).userRecords);
                        }
                    }
                }

            }
            str = input.nextLine();
        }
        Collections.sort(users);
        for (User a:users){
            System.out.print(a.getNumber()+" ");
            System.out.print(new DecimalFormat("0.0#").format(a.calCost()));
            System.out.print(" ");
            System.out.print(new DecimalFormat("0.0#").format(a.calBalance()));
            System.out.println();
        }
    }
}
class User implements Comparable<User> {
    UserRecords userRecords = new UserRecords();
    double balance = 100;
    ChargeMode chargeMode;
    String number;
    public User(){

    }
    public User(String number) {
        this.number = number;
    }

    public double calBalance(){
        return balance-calCost()-20;
    }
    public double calCost(){
        LandPhoneInCityRule landPhoneInCityRule = new LandPhoneInCityRule();
        LandPhoneInLandRule landPhoneInlandRule = new LandPhoneInLandRule();
        LandPhoneInProvinceRule landPhoneInProvinceRule = new LandPhoneInProvinceRule();
        return landPhoneInlandRule.calCost(userRecords.getCallingInLandRecords())+landPhoneInCityRule.calCost(userRecords.getCallingInCityRecords())+landPhoneInProvinceRule.calCost(userRecords.getCallingInProvinceRecords());
    }
    public UserRecords getUserRecords(){
        return userRecords;
    }
    public void setUserRecords(UserRecords userRecords){
        this.userRecords = userRecords;
    }
    public double getBalance(){
        return balance;
    }
    public ChargeMode getChargeMode(){
        return chargeMode;
    }
    public void setChargeMode(ChargeMode chargeMode){
        this.chargeMode = chargeMode;
    }
    public String getNumber(){
        return number;
    }
    public void setNumber(String number){
        this.number = number;
    }
    public int compareTo(User o) {
        return this.getNumber().compareTo(o.getNumber());
    }

}

abstract class ChargeMode{
    ArrayList<ChargeRule> list = new ArrayList<ChargeRule>();
    public ArrayList<ChargeRule> getChargeRule(){
        return list;
    }
    public void setChargeRule(ArrayList<ChargeRule> chargeRule){
        this.list = list;
    }
    public double calCost(UserRecords userRecords){
        return 0;
    }
    public double getMonthlyRent(){
        return 20;
    }
}
class UserRecords{
    ArrayList<CallRecord> callingInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> callingInLandRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInCityRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInProvinceRecords = new ArrayList<CallRecord>();
    ArrayList<CallRecord> answerInLandRecords = new ArrayList<CallRecord>();
    ArrayList<MessageRecord> sendMessageRecord = new ArrayList<MessageRecord>();
    ArrayList<MessageRecord> receiveMessageRecord = new ArrayList<MessageRecord>();
    public void addCallingInCityRecords(CallRecord callRecord){
        callingInCityRecords.add(callRecord);
    }
    public void addCallingInProvinceRecords(CallRecord callRecord){
        callingInProvinceRecords.add(callRecord);
    }
    public void addCallingInLandRecords(CallRecord callRecord){
        callingInLandRecords.add(callRecord);
    }
    public void addAnswerInCityRecords(CallRecord callRecord){
        answerInCityRecords.add(callRecord);
    }
    public void addAnswerInProvinceRecords(CallRecord callRecord){
        answerInProvinceRecords.add(callRecord);
    }
    public void addAnswerInLandRecords(CallRecord callRecord){
        answerInLandRecords.add(callRecord);
    }
    public void addSendMessageRecord(MessageRecord sendMessageRecord){
        this.sendMessageRecord.add(sendMessageRecord);
    }
    public void addReceiveMessageRecord(MessageRecord receiveMessageRecord){
        this.receiveMessageRecord.add(receiveMessageRecord);
    }
    public ArrayList<MessageRecord> getSendMessageRecord(){
        return sendMessageRecord;
    }
    public ArrayList<MessageRecord> getReceiveMessageRecord(){
        return receiveMessageRecord;
    }
    public ArrayList<CallRecord> getCallingInCityRecords(){
        return callingInCityRecords;
    }
    public ArrayList<CallRecord> getCallingInProvinceRecords(){
        return callingInProvinceRecords;
    }
    public ArrayList<CallRecord> getCallingInLandRecords(){
        return callingInLandRecords;
    }
    public ArrayList<CallRecord> getAnswerInCityRecords(){
        return answerInCityRecords;
    }
    public ArrayList<CallRecord> getAnswerInProvinceRecords(){
        return answerInProvinceRecords;
    }
    public ArrayList<CallRecord> getAnswerInLandRecords(){
        return answerInLandRecords;
    }


}
class LandlinePhoneCharging extends ChargeMode{
    double monthlyRent = 20;

    public double calCost(UserRecords userRecords){
        return 0;
    }
    public double getMonthlyRent(){
        return monthlyRent;
    }
}
class CommunicationRecord{
    String callingNumber;
    String answerNumber;
    public String getCallingNumber(){
        return callingNumber;
    }
    public void setCallingNumber(String callingNumber){
        this.callingNumber = callingNumber;
    }
    public String getAnswerNumber(){
        return answerNumber;
    }
    public void setAnswerNumber(String answerNumber){
        this.answerNumber = answerNumber;
    }
}
class CallRecord extends ChargeRule{
    Date startTime;
    Date endTime;
    String callingAddressAreaCode;
    String AnswerAddressAreaCode;

    public CallRecord(String startTime,String endTime) throws ParseException {
        this.startTime =  new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(startTime);
        this.endTime = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(endTime);
    }

    public CallRecord() {
    }

    public Date getStartTime(){
        return startTime;
    }
    public void setStartTime(Date startTime){
        this.startTime = startTime;
    }
    public Date getEndTime(){
        return endTime;
    }
    public void setEndTime(Date endTime){
        this.endTime = endTime;
    }
    public String getCallingAddressAreaCode(){
        return callingAddressAreaCode;
    }
    public void setCallingAddressAreaCode(String callingAddressAreaCode){
        this.callingAddressAreaCode = callingAddressAreaCode;
    }

    public String getAnswerAddressAreaCode() {
        return AnswerAddressAreaCode;
    }

    public void setAnswerAddressAreaCode(String answerAddressAreaCode) {
        this.AnswerAddressAreaCode = answerAddressAreaCode;
    }
}
class MessageRecord extends ChargeRule{
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
abstract class ChargeRule{

}
abstract class CallChargeRule extends ChargeRule{
    public double calCost(ArrayList<CallRecord>callRecords){
        return 0;
    }
}
class LandPhoneInCityRule extends CallChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords){
        double cost = 0;
        double  minutes;
        for (CallRecord e: callRecords){
            minutes = (int) Math.ceil((double) (e.getEndTime().getTime()-e.getStartTime().getTime())/ (double) 60000);
            cost += 0.1*minutes;}
        return cost;
    }
}
class LandPhoneInLandRule extends CallChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords){
        double cost = 0;
        double  minutes;
        for (CallRecord e: callRecords){
            minutes = (int) Math.ceil((double) (e.getEndTime().getTime()-e.getStartTime().getTime())/ (double) 60000);
            cost += 0.6*minutes;}
        return cost;
    }
}

class LandPhoneInProvinceRule extends CallChargeRule{
    public double calCost(ArrayList<CallRecord> callRecords){
        double cost = 0;
        double  minutes;
        for (CallRecord e: callRecords){
            minutes = (int) Math.ceil((double) (e.getEndTime().getTime()-e.getStartTime().getTime())/ (double) 60000);
            cost += 0.3*minutes;}
        return cost;
    }
}
View Code

 

 

 

 

其余两次作业与这一次基本相当,只需要稍作添加,这里就不赘述了。

这一个月学习Java收获最大的还是利用Javafx来制做页面。下面简单介绍一下Javafx:

JavaFX使用场景

 C/S架构, 小游戏, 等,传统的GUI图形界面能做的, JavaFX基本都能胜任,并且还对网络支持良好, 比如WebView

 

JavaFX常见类

1. Application类

JavaFX应用程序的入口点是Application类,Application的子类是Preloader。

无论何时启动应用程序,JavaFX运行时都按顺序执行以下操作:

构造指定的Application类的实例

调用init()方法

调用start(javafx.stage.Stage)方法

等待应用程序完成,发生以下任一情况时:

该应用程序调用Platform.exit()

最后一个窗口已关闭,Platform上的implicitExit属性为true

调用stop() 方法(请注意,start方法是抽象的,必须被覆盖。 init和stop方法可以不具体的实现。)

调用Platform.exit() 是明确终止JavaFX应用程序的首选方式。直接调用System.exit(int)是一个可以接受的替代方法,但不允许Application stop() 结束JavaFx程序。

FX工具包终止或ShutdownHook之后,即在stop()方法返回或调用System.exit(int)之后,JavaFX应用程序不应尝试使用JavaFX。

通过从init()方法调用getParameters()方法,或调用init方法后的任何时间,可以使用应用程序参数。

2. Scene类

JavaFX Scene类是场景图中所有内容的容器,填充属性指定场景的背景。

应用程序必须通过设置根属性来指定场景图的根节点。如果使用组作为根,则场景图的内容将被场景的宽度和高度剪切,并且改变为场景的大小(如果用户调整舞台大小)将不会改变场景图的布局。如果一个可调整大小的节点(将“区域”或“控件”设置为根,则根的大小将跟踪场景的大小,从而根据需要将内容中继出来。场景的大小可以在应用程序构造期间初始化。如果没有指定大小,场景将根据其内容的首选大小自动计算其初始大小。如果仅指定了一个维度,则使用指定的维度来计算另一个维度,该范围涉及根的内容偏差。

depthBuffer和antiAliasing标志是条件特征。使用各自的默认值:false和SceneAntialiasing.DISABLED。

默认头灯将被添加到包含一个或多个Shape3D节点但没有光节点的场景中。该光源是位于相机位置的Color.WHITE PointLight。

必须在JavaFX应用程序线程上构建和修改场景对象。

3.  Scene的根节点Parent

它的派生类有以下:

Group,Region(子类:Axis(子类:CategoryAxis, ValueAxis), Chart(子类:PieChart, XYChart), Control(子类:Accordion, ButtonBar, ChoiceBox, ComboBoxBase, HTMLEditor, Labeled, ListView, MenuBar, Pagination, ProgressIndicator, ScrollBar, ScrollPane, Separator, Slider, Spinner, SplitPane, TableView, TabPane, TextInputControl, ToolBar, TreeTableView, TreeView), Pane(子类:AnchorPane, BorderPane, DialogPane, FlowPane, GridPane, HBox, PopupControl.CSSBridge, StackPane, TextFlow, TilePane, VBox)),WebView(子类:)

公共抽象类Parent

扩展Node在场景图中具有子节点的所有节点的基类。

该类处理所有分层场景图操作,包括添加/删除子节点,标记用于布局和渲染的分支,采摘,边界计算以及对每个脉冲执行布局传递。

  利用Javafx我们完成了农夫过河这个小游戏的界面化。下面是小游戏运行的截图:

 

 

 

 

下面附上农夫过河的源码:

 

 

package com.example.nfgh;

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:D:\\河.png");

        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:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,0,0);

                    image = new Image("file:D:\\农夫.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,0);

                }

                else

                {

                    image = new Image("file:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,0);

                    image = new Image("file:D:\\农夫.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,0,0);

                }

                break;

            case "Wolf":

                if(this.place.equals("Right"))

                {

                    image = new Image("file:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,0,2);

                    image = new Image("file:D:\\狼.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,2);

                }

                else

                {

                    image = new Image("file:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,2);

                    image = new Image("file:D:\\狼.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,0,2);

                }

                break;

            case "Sheep":

                if(this.place.equals("Right"))

                {

                    image = new Image("file:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,0,1);

                    image = new Image("file:D:\\羊.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,1);

                }

                else

                {

                    image = new Image("file:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,1);

                    image = new Image("file:D:\\羊.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,0,1);

                }

                break;

            case "Cabbage":

                if(this.place.equals("Right"))

                {

                    image = new Image("file:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,0,3);

                    image = new Image("file:D:\\白菜.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,3);

                }

                else

                {

                    image = new Image("file:D:\\空.jpg");

                    imageView = new ImageView();

                    setSize(imageView,image);

                    pane.add(imageView,2,3);

                    image = new Image("file:D:\\白菜.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:D:\\输.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:D:\\胜利.jpg");

            else

                image = new Image("file:D:\\输.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;

    }



}

  以上是我最近Java的总结。

 

posted @ 2022-06-16 17:08  给我一杯茶  阅读(125)  评论(0)    收藏  举报