这个系列是对javaSE课程代码的回顾,所有Demo都是亲自动手实现的,并做了小小的change,为了方便自己理解和后期复习,代码里加了大量的注释。现对所有知识点的代码进行复习整理,进一步理解、完善代码,对注释进行补充。其中重要的知识点会单独说明,但主要以代码为主。
说明:博客是对学习内容的巩固,很多注释是为了自己理解,所以不会很专业。
------------------------------------------------------游戏模拟------------------------------------------------
package cn.tjpu.javase05.lol.Player; /** * 实现一个游戏 * 要求: *在LOL游戏中,游戏中的用户应该用一个类来进行描述,比如,有以下属性信息: *玩家的游戏账号(比如: "小丸子") 玩家所在的对局ID(比如: "艾欧尼亚-1001") 玩家所使用的英雄角色(比如: 易大师或者阿狸或蘑菇....) 玩家所装配的装备(装备应该可以是多个,比如"无尽之刃"、"狂徒铠甲"等) 玩家助攻数 玩家击杀人头数 玩家斩杀小兵数 玩家的本局游戏实时得分(游戏得分=助攻数*10+击杀人头数*20+小兵数*2+装备件数*5) 玩家的历史累计得分 玩家的英雄等级:[20,40)-->1级 [40,60)-->2级 [60,)-->3级 *写这个类的核心思想: 有些属性,可以简单赋值 ,有些属性,不能简单赋值,需要经过很复杂的内部逻辑处理之后才赋值 *所以通常应该把属性全部修饰成私有的,然后暴露出get和set之类方法来让使用这个类的人去操作对象上的数据 *好处:写这个类的人,可以把内部数据处理逻辑封装起来,增加了类的内聚性,增加了数据逻辑的安全性,同时,降低了使用者的复杂度 */ import java.util.ArrayList; public class Player { // 玩家属性,设置成私有防止外部直接调用 private String account; private String missionId; private String heroName; //装备不止一个 private ArrayList<String> equipments = new ArrayList<String>(); private int attack; private int kills; private int killedSoliders; private int missionScore; private int amountScore; private int heroLeval; // 设置玩家账号的方法 public void setAccount(String account) { this.account = account; } // 设置对局id的方法 public void setMissionId(String missionId) { this.missionId = missionId; } // 设置玩家使用英雄角色的方法 public void setHeroName(String heroName) { this.heroName = heroName; } //设置历史总分的方法 public void setAmountScore(int amountScore) { this.amountScore = amountScore; } // 增加装备的方法 public void addEquipment(String equipment) { //equipments是一个list this.equipments.add(equipment); // 每增加一件装备本局实时得分+5分,实时得分只能根据其他因素计算得打,不能由玩家自己设置 this.missionScore += 5;//本局实时得分还包括其他因素,所以累加 // 每增加一件装备历史累计得分+5分 this.amountScore += 5; // 更新用户等级 this.setHeroLeval(); } // 增加助攻数的方法 public void addAttack() { this.attack++; // 每增加一次助攻本局实时得分+10分 this.missionScore += 10; // 每增加一次助攻历史累计得分+10分 this.amountScore += 10; // 更新用户等级 this.setHeroLeval(); } // 增加击杀人头数的方法 public void addKills() { this.kills++; // 每击杀一个人头本局实时得分+20分 this.missionScore += 20; // 每杀一个人头历史累计得分+20分 this.amountScore += 20; // 更新用户等级 this.setHeroLeval();//得分变了用户等级就要更新,且该功能封装在类里,玩家不能更改 } // 增加杀小兵的方法 public void addKilledSoliders() { this.killedSoliders++; // 每杀一个小兵本局实时得分+2分 this.missionScore += 2; // 每杀杀一个小兵历史累计得分+2分 this.amountScore += 2; // 更新用户等级 this.setHeroLeval(); } // 设置玩家本局英雄等级,根据实时得分计算玩家等级 private void setHeroLeval() { if (this.missionScore > 20 && this.missionScore <= 40) { this.heroLeval = 1; } if (this.missionScore > 40 && this.missionScore <= 60) { this.heroLeval = 2; } if (this.missionScore > 60) { this.heroLeval = 3; } } // 为了让外部文件调用该类内的私有属性,需通过公有方法来得到值 public String getAccount() { return account; } public String getMissionId() { return missionId; } public String getHeroName() { return heroName; } public ArrayList<String> getEquipments() { return equipments; } public int getAttack() { return attack; } public int getKills() { return kills; } public int getKilledSoliders() { return killedSoliders; } public int getMissionScore() { return missionScore; } public int getAmountScore() { return amountScore; } public int getHeroLeval() { return heroLeval; } }
package cn.tjpu.javase05.lol.Player; /** * 游戏测试类 */ public class PlayerTest { public static void main(String[] args) { // 创建一个玩家并初始化(给属性赋值) Player player1 = new Player(); player1.setAccount("醪糟小丸子"); player1.setMissionId("艾欧尼亚-1001"); player1.setHeroName("阿狸"); player1.setAmountScore(1000);// 历史得分 /* * 使用该对象的一些功能,计算等级 */ // 购买装备 player1.addEquipment("狂徒铠甲"); // 击杀人头 // player1.addKills(); // 助攻 player1.addAttack(); // 增加装备 player1.addEquipment("无尽之刃"); // 射杀小兵 player1.addKilledSoliders(); // 打印玩家本局实施得分,历史总分,英雄等级 System.out.println("本局实时得分" + player1.getMissionScore()); System.out.println("历史总分" + player1.getAmountScore()); System.out.println("本局英雄等级" + player1.getHeroLeval()); System.out.println("------------------------------------------"); /* * 根据规则,功能方法使用的越多,等级就会上升 */ // 购买装备 player1.addEquipment("狂徒铠甲"); player1.addEquipment("无尽之刃"); // 击杀人头 player1.addKills(); player1.addKills(); player1.addKills(); // 助攻 player1.addAttack(); player1.addAttack(); player1.addAttack(); // 增加装备 player1.addEquipment("狂徒铠甲"); // 射杀小兵 player1.addKilledSoliders(); player1.addKilledSoliders(); player1.addKilledSoliders(); // 打印玩家本局实施得分,历史总分,英雄等级 System.out.println("本局实时得分" + player1.getMissionScore()); System.out.println("历史总分" + player1.getAmountScore()); System.out.println("本局英雄等级" + player1.getHeroLeval()); } }
package cn.tjpu.javase05.shop; /** * 商品类 */ public class Product { private String PId; private String PName; private float price; private int Number; public Product() { } //可以用带参构造函数给实例化出来的对象一次性赋值 public Product(String PId, String PName, float price, int Number) { this.PId = PId; this.PName = PName; this.Number = Number; this.price = price; } //得到某个属性的值 public String getPId() { return PId; } //单独为某个属性赋值,单独修改某个属性 public void setPId(String pId) { PId = pId; } public String getPName() { return PName; } public void setPName(String pName) { PName = pName; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public int getNumber() { return Number; } public void setNumber(int number) { Number = number; } // toString是一个用来把对象内部数据拼装成字符串的方法(可按照自己的需要修改) public String toString() { return this.getPId() + "," + this.getPName() + "," + this.getPrice() + "," + this.getNumber(); } }
---------------------------------------------------售货系统模拟----------------------------------------------
package cn.tjpu.javase05.shop; /** * 商品类 */ public class Product { private String PId; private String PName; private float price; private int Number; public Product() { } //可以用带参构造函数给实例化出来的对象一次性赋值 public Product(String PId, String PName, float price, int Number) { this.PId = PId; this.PName = PName; this.Number = Number; this.price = price; } //得到某个属性的值 public String getPId() { return PId; } //单独为某个属性赋值,单独修改某个属性 public void setPId(String pId) { PId = pId; } public String getPName() { return PName; } public void setPName(String pName) { PName = pName; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public int getNumber() { return Number; } public void setNumber(int number) { Number = number; } // toString是一个用来把对象内部数据拼装成字符串的方法(可按照自己的需要修改) public String toString() { return this.getPId() + "," + this.getPName() + "," + this.getPrice() + "," + this.getNumber(); } }
package cn.tjpu.javase05.shop; /** * 商品管理类 * 1.封装所有商品数据 * 2.在该类中创建操作商品数据的方法 * 商品列表及其方法 */ import java.util.ArrayList; public class ProductMange { // 创建一个用来存放商品的列表,私有变量,只能通过公有方法来往里面填数据取数据 private ArrayList<Product> prdts = new ArrayList<>(); // 通过公有方法往商品列表里加商品 public void addProduct(Product product) { this.prdts.add(product); } // 取列表中所有商品的方法 public ArrayList<Product> getPrds() { return this.prdts; } // 通过给定商品名取商品列表中的商品数据的所有信息 public Product getProductByName(String name) { // 遍历list中的所有商品,找到商品名与传入参数一致的那一个 for (int i = 0; i < prdts.size(); i++) { if (prdts.get(i).getPName().equals(name)) { return prdts.get(i);// 找到的第i个商品 } } return null; } // 打印所有商品信息 public void showProduct() { for (int i = 0; i < prdts.size(); i++) { System.out.println("商品信息:" + prdts.get(i)); } } }
package cn.tjpu.javase05.shop; /** * 造商品信息的类 */ public class CreatProducts { //创建一个给商品对象赋值的方法 public static void Creat(ProductMange prodts) { //造商品数据(无参构造) Product prodt1=new Product(); prodt1.setPId("001"); prodt1.setPName("牛奶"); prodt1.setPrice(5.5f); prodt1.setNumber(0); Product prodt2=new Product(); prodt2.setPId("002"); prodt2.setPName("面包"); prodt2.setPrice(8.5f); prodt2.setNumber(0); //有参构造 Product prodt3=new Product("003","火腿",1.5f,0); Product prodt4=new Product("004","巧克力",7.5f,0); Product prodt5=new Product("005","可乐",3.5f,0); //在商品列表中添加商品 prodts.addProduct(prodt1); prodts.addProduct(prodt2); prodts.addProduct(prodt3); prodts.addProduct(prodt4); prodts.addProduct(prodt5); } }
package cn.tjpu.javase05.shop; /** * 购物车管理类 */ import java.util.ArrayList; public class CartMange { // 创建一个购物车列表,用来装用户加入购物车的商品,私有静态变量,只能公有静态方法使用 private static ArrayList<Product> car = new ArrayList<>(); // 往购物车中加商品(公有静态方法),接收用户输入的字符串如:面包:3,可乐:2,火腿肠:4 public static void addPrdtsToCart(String prdts, ProductMange prdtMg) { // 切割字符串(String prdts:用户从终端输入的字符串) String[] slipt = prdts.split(","); for (int i = 0; i < slipt.length; i++) { String[] prdtsAndNum = slipt[i].split(":"); // 把从终端拿到的字符串都拆开后,就是一个个具体的值,因此要实例化一个商品,然后把这些值赋给对象 Product p = new Product(); p.setPName(prdtsAndNum[0]); p.setNumber(Integer.parseInt(prdtsAndNum[1])); /* // 补全商品信息 * // 方法1:利用的商品管理器中的数据 ArrayList<Product> // ProductMange prdtMg:商品管理类的一个对象 prodts = prdtMg.getPrds(); // 调用方法,取出列表中所有商品 for (int j = 0; j < prodts.size(); j++) { if (prodts.get(j).getPName().equals(prdtsAndNum[0])) { p.setPId(prodts.get(j).getPId()); p.setPrice(prodts.get(j).getPrice()); } } */ // 方法2:直接调用产品管理类的方法 Product pbn = prdtMg.getProductByName(prdtsAndNum[0]); p.setPId(pbn.getPId()); p.setPrice(pbn.getPrice()); // 将商品数据添加到购物车list car.add(p); } } // 打印购物车商品信息 public static void showCar() { for (int i = 0; i < car.size(); i++) { System.out.println(car.get(i)); } } }
package cn.tjpu.javase05.shop; /** * 自动售货系统的程序入口 */ import java.util.Scanner; public class ShopMenu { public static void main(String[] args) { // 创建ProductMange类对象,才可以调用里面的方法——>产品管理器 ProductMange PrdtsMange = new ProductMange(); // 利用工具方法为商品池添加商品数据 CreatProducts.Creat(PrdtsMange); // 创建一个CartMange类的实例对象——>购物车管理器 CartMange cartMange = new CartMange(); // 和顾客的交互界面 System.out.println("欢迎来到小丸子商店!请选择菜单!"); System.out.println("1.浏览商品|2.购物|3.查看购物车|4.修改购物车|5.提交订单|6.付款|7.退出"); // 接收顾客的输入 Scanner scanner = new Scanner(System.in); // 用循环可以让顾客不断的选择菜单 boolean flag = true; while (flag) { String option = scanner.nextLine(); switch (option) { case "1": // 调用显示信息的方法 PrdtsMange.showProduct(); break; // 购物就是把用户输入的商品和数量放入购物车 case "2": System.out.println("请输入您要购买的商品和数量。如:面包:3,可乐:2"); String prdtsAndNum = scanner.nextLine(); CartMange.addPrdtsToCart(prdtsAndNum, PrdtsMange); break; case "3": CartMange.showCar(); break; case "4": System.out.println("修改购物车ing..."); break; case "5": System.out.println("提交订单ing..."); break; case "6": System.out.println("付款ing..."); break; case "7": flag = false; break; default: System.out.println("没有该选项,重新选择"); } } } }