Java第三次随笔
Java第三次随笔
这是这个学期最后一次Java的随笔,最近刚刚恢复线下教学有点不太适应,最近学到很多新的东西,我认为有必要总结一下学习成果。下面是我近期学习的内容和对题目集的理解,以及对测试点的踩坑心得。
首先是对于类图之间的联系有了更加深刻的认识,在PTA习题集的电信计费系列中,复杂的类图一度让我无从下手,因为题目集过于复杂我甚至想要放弃这些题目,详细题目可以打开以下两个链接:
- https://images.ptausercontent.com/d3c5de10-9e3f-4a4c-877f-64e76c98f1b6.pdf
- 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; } }
其余两次作业与这一次基本相当,只需要稍作添加,这里就不赘述了。
这一个月学习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的总结。

浙公网安备 33010602011771号