Java 游戏账号出租系统项目(超详细注解)

Java 游戏账号出租系统项目


一级目录为包、二级目录为类 注解详细
debug调试更清晰


AccountRentApp(main)

package accountrentsystem;
import accountrentsystem.domain.Account;
import accountrentsystem.view.AccountView;

public class AccountRentApp {
    public static void main(String[] args) {
        new AccountView().mainMenu();
    }
}

domain(包)

Account.java

package accountrentsystem.domain;
//纯粹用来存放信息的一个类
public class Account {
    //ID  号主  电话  地址  小时费  状态(为出租/已出租)
    private int id;
    private String name;
    private Long number;
    private String address;
    private int rent;
    private String state;
    //构造器、setter、getter

    public Account(int id, String name, Long number, String address, int rent, String state) {
        this.id = id;
        this.name = name;
        this.number = number;
        this.address = address;
        this.rent = rent;
        this.state = state;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getNumber() {
        return number;
    }
    public void setNumber(Long number) {
        this.number = number;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public int getRent() {
        return rent;
    }
    public void setRent(int rent) {
        this.rent = rent;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    //为了方便输出信息、重写一下toString
    @Override
    public String toString() {
        return   id +
                "\t" + name +
                "\t" + number +
                "\t" + address +
                "\t" + rent +
                "\t\t" + state ;
    }
}

service(包)

AccountService

package accountrentsystem.service;
import accountrentsystem.domain.Account;//需要导入其他类才能使用类当中的数据类型
import accountrentsystem.utils.Utility;

public class AccountService {
    private  Account[] accounts;//创建一个Account数据类型
    private int idcounter = 3;
    private int accountNumbers = 3;//我可以先初始化一个用户信息,统计我当前有多少个信息
//此数据类型的赋值也是通过构造器传入
    public AccountService(int size){//构造器
        accounts = new Account[size];//当创建数组的时候指定大小
        //Account[] accounts = new Account[size];一次性初始化,因为要使用构造器决定数组大小所以拆分开来
        accounts[0] = new Account(1,"小牛马",137180120L,"北京",20,"已出租");
        accounts[1] = new Account(2,"小大马",137180120L,"上海",28,"未出租");
        accounts[2] = new Account(3,"中牛马",137180120L,"南京",23,"已出租");
    }
    public  boolean add(Account newAccount){//检测数组满了没有
        if(accountNumbers == accounts.length){
            return false;
        }else {
            accounts[accountNumbers++] = newAccount;//外面填的信息拿进来,写出这步纯寄吧天才
           // accountNumbers++;
           // idcounter++;//id在新增信息的时候默认是0,不需要手动输入。
            //排序还需要再定义方法比较麻烦、这里采用的是id自增长。只需要一个变量每次新增都++。
            //最后newAccount本身就是Account可以调用构造器来设置它的编号。缺点就是不能像排序一样乱序输入内容。
            newAccount.setId(++idcounter);
            return true;
        }
    }

    public boolean delete(int deleteId){//第几个、下标-1
        int index = -1;
     for(int i = 0; i < accountNumbers; i++){//说过accountNumbers是统计有几个信息
         if((deleteId) == accounts[i].getId()){
               index = i;
            /* accounts[i] = null;
             System.out.println("该数组删除完成");
             原本打算直接在里面删除数组、但是万一遍历完数组没有找到的话就还需要一个for循环之外的操作来返回false*/
         }
     }
       if(index == -1){
           return false;
       }//这里存在一个难点、如果你直接拿index去把数组置空null也可以。
        //问题在于你删除之后、比方3个信息,你删除掉中间的信息之后,编号3不回去补位到编号2。
        //所以这里我们采用直接覆盖的形式
       for(int i = index; i < accountNumbers -1 ; i++){//数据结构基础
                 accounts[i] = accounts[i+1];//先覆盖前面的
       }accounts[accountNumbers-1] = null;//覆盖完之后再把最后一个删掉。等于是单链表从把中间覆盖了之后 释放掉最后一个
        accountNumbers--;//删除完信息-1
        return true;
     }

    public Account findId(int findId){//查询方法
      for(int  i = 0; i < accountNumbers;i++){
          if(findId == accounts[i].getId()){
              return  accounts[i];
          }
      }   return null;
    }

    public Account[] list(){//数据类型是数组,返回创建好的数组对象内容。返回整个数组
        return accounts;
    }

    public void exit(){
        char c = Utility.readConfirmSelection();
    }
}

utils(包)

Utility.java(工具类)

package accountrentsystem.utils;


/**
 工具类的作用:
 处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
 */

import java.util.*;
/**


 */
public class Utility {
    //静态属性。。。
    private static Scanner scanner = new Scanner(System.in);


    /**
     * 功能:读取键盘输入的一个菜单选项,值:1——5的范围
     * @return 1——5
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);//包含一个字符的字符串
            c = str.charAt(0);//将字符串转换成字符char类型
            if (c != '1' && c != '2' &&
                    c != '3' && c != '4' && c != '5') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }

    /**
     * 功能:读取键盘输入的一个字符
     * @return 一个字符
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);//就是一个字符
        return str.charAt(0);
    }
    /**
     * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
     * @param defaultValue 指定的默认值
     * @return 默认值或输入的字符
     */

    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    /**
     * 功能:读取键盘输入的整型,长度小于2位
     * @return 整数
     */
    public static int readInt() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, false);//一个整数,长度<=10位
            try {
                n = Integer.parseInt(str);//将字符串转换成整数
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
    /**
     * 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
     * @param defaultValue 指定的默认值
     * @return 整数或默认值
     */
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(12, true);
            if (str.equals("")) {
                return defaultValue;
            }

            //异常处理...
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串
     * @param limit 限制的长度
     * @return 指定长度的字符串
     */

    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /**
     * 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
     * @param limit 限制的长度
     * @param defaultValue 指定的默认值
     * @return 指定长度的字符串
     */

    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("")? defaultValue : str;
    }


    /**
     * 功能:读取键盘输入的确认选项,Y或N
     * 将小的功能,封装到一个方法中.
     * @return Y或N
     */
    public static char readConfirmSelection() {
        System.out.println("请确认是否删除该账号信息(Y/N): 请小心选择");
        char c;
        for (; ; ) {//无限循环
            //在这里,将接受到字符,转成了大写字母
            //y => Y n=>N
            String str = readKeyBoard(1, false).toUpperCase();//toUpperCase js类自带转成大写
            c = str.charAt(0);//本少爷字符串的第一个字符
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }

    /**
     * 功能: 读取一个字符串
     * @param limit 读取的长度
     * @param blankReturn 如果为true ,表示 可以读空字符串。
     * 					  如果为false表示 不能读空字符串。
     *
     *	如果输入为空,或者输入大于limit的长度,就会提示重新输入。
     * @return
     */
    private static String readKeyBoard(int limit, boolean blankReturn) {

        //定义了字符串
        String line = "";

        //scanner.hasNextLine() 判断有没有下一行
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();//读取这一行

            //如果line.length=0, 即用户没有输入任何内容,直接回车
            if (line.length() == 0) {
                if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                else continue; //如果blankReturn=false,不接受空串,必须输入内容
            }

            //如果用户输入的内容大于了 limit,就提示重写输入
            //如果用户如的内容 >0 <= limit ,我就接受
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }

        return line;
    }
}
=

view(包)

AccountView

package accountrentsystem.view;

import accountrentsystem.domain.Account;
import accountrentsystem.service.AccountService;
import accountrentsystem.utils.Utility;

public class AccountView {
    private boolean loop = true;//控制菜单
    private char key = ' ';//选择接受
    private AccountService accountService = new AccountService(3);//不理解就debug再试一次
//这个位置new只是为了能够调用到AccountService里面的方法。 进去给结构体的account数组赋予了大小
//但是这跟accountService这个对象没关系。这个对象的编译类型本身就不是数组
//在AccountService类当中我给account[]赋值、并不会影响到accountService当中的数值为null
//除非我这个类继承了AccountService、并且我重写了构造器、这种情况下我使用数组才是给accouService赋值
    public void listAccount(){//5 房 屋 列 表
        System.out.println("----------账号出租系统菜单----------");
        System.out.println("ID\t号主\t\t\t电话\t\t地址\t小时费\t状态(为出租/已出租)");
        Account[] accounts = accountService.list();
        for(int i = 0; i < accounts.length ; i++){
            if(accounts[i] != null){
                System.out.println(accounts[i]);//输出结果有问题别忘了去看下toString
            }
        }
    }

   public void addAccount(){//1 新 增 账 号
       System.out.println("------------添加账号------------");
       System.out.println("姓名:");
       String name = Utility.readString(8);
       //工具包当中有设计Scanner所以可以理解为就是个Scanner。只不过做了字符转换
       System.out.println("电话:");
       long number = Utility.readInt(12);
       System.out.println("地址:");
       String address = Utility.readString(16);
       System.out.println("小时费:");
       int rent = Utility.readInt();
       System.out.println("状态:");
       String state = Utility.readString(3);
       Account account = new Account(0,name,number,address,rent,state);
       if(accountService.add(account)){
           System.out.println("-----------账号添加成功-----------");
       }else System.out.println("---------数据库满账号添加失败---------");
   }

   public  void deleteAccount(){//删除本身就没有设计动态编号、是为了避免找不到、后期如果链接mysql可以
       System.out.println("------------删除账号------------");
       System.out.println("请选择要删除的账号ID(-1退出)");
       int delete = Utility.readInt();
       if(delete == -1){
           System.out.println("----------放弃删除账号信息----------");
           return;//这里不能选择break,使用break会直接退出这个方法
       }
       char choise = Utility.readConfirmSelection();//自己看
       if(choise == 'Y'){
           if(accountService.delete(delete)){
               System.out.println("-----------账号添删除成功-----------");
           }else System.out.println("---------账号不存在删除失败---------");
       }else{
           System.out.println("----------放弃删除账号信息----------");
           return;
       }
   }

    public void upDate(){//修改
        System.out.println("------------修改账号------------");
        System.out.println("请选择要修改的账号ID(-1退出)");
        int update = Utility.readInt();//所修改ID
        if(update == -1){
            System.out.println("----------放弃修改账号信息----------");
        }
        Account account = accountService.findId(update);
        //findID返回的是引用类型、因此使用account.setXXX()实际控制的是Account类当中的数组元素
        if(account == null){//没找到
            System.out.println("-----------账号不存在-----------");
            return;
        }//找到的话再findID方法中会将该数组的内容返回
         System.out.println("姓名("+account.getName()+"):");
        String name = Utility.readString(8,"");
        //readString方法中,前面是字符限制,后面是不输入的默认值
        if(!"".equals(name)){//只要不是什么都没输入,那就把我输入的覆盖掉原本数组当中的元素
            account.setName(name);
        }
         System.out.println("电话("+account.getNumber()+"):");
         long number = Utility.readInt(-1);
        if(number != -1){
            account.setNumber(number);
        }
         System.out.println("地址("+account.getAddress()+"):");
         String address = Utility.readString(16);
        if(!"".equals(address)){
            account.setAddress(address);
        }
         System.out.println("小时费("+account.getRent()+"):");
         int rent = Utility.readInt(-1);
        if(rent != -1){//其实也就是只要不是默认值
            account.setRent(rent);
        }
         System.out.println("状态("+account.getState()+"):");
         String state = Utility.readString(3);
        if(!"".equals(state)){
            account.setState(state);
        } System.out.println("-----------账号修改除成功-----------");
    }

    public void findAccount(){//查找本身就可以判断是否存在
        System.out.println("------------查找账号------------");
        System.out.println("请选择要查找的账号ID");
        int findAccount = Utility.readInt();
       Account account = accountService.findId(findAccount);
       if(account != null){
           System.out.println(account);
       }else System.out.println("------------未查询到------------");
    }
   public void exit(){
      char choise =  Utility.readConfirmSelection();
      if(choise == 'Y'){//出来的只有Y或者N
          loop = false;//操纵循环结束
      }//x可以写个return;但没必要 写不写都会自动跳转到主菜单
   }

    public void mainMenu(){
        do {//shift + tab 整体左移
    System.out.println("----------账号出租系统菜单----------");
    System.out.println("\t\t\t1 新 增 账 号");
    System.out.println("\t\t\t2 查 找 账 号");
    System.out.println("\t\t\t3 删 除 房 屋 信 息");
    System.out.println("\t\t\t4 修 改 房 屋 信 息");
    System.out.println("\t\t\t5 房 屋 列 表");
    System.out.println("\t\t\t6 退      出");
    System.out.print("请输入您的需求(1-6):");
    key = Utility.readChar();
    //Utility类是工具包,全是静态、自己debug进去看也可以.ctrl+B也行
    switch (key){
        case '1':addAccount();
                 break;
        case '2':findAccount();
            break;
        case '3':deleteAccount();
            break;
        case '4': upDate();
            break;
        case '5': listAccount();
            break;
        case '6':exit();
            break;
    }
        }while(loop);//dowhile控制循环模式
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值