参与者类:
public abstract class Joiner { //属性: name名字 choice出拳名称,choice_name化成数值与算法有关系 //封装内容私有化 private String name; private int choice_name; //构造函数产生(无参有利于实例化,有参有利于实例化传入所有参数 public Joiner() { } public Joiner(String name, int choice_name) { this.name = name; this.choice_name = choice_name; } public void choice(){ } //玩家和电脑设置参与者名称的方法 public void name_setting(){ this.setName("匿名用户"); } //把两个私有变量产生setter和getter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getChoice_Name() { return choice_name; } public void setChoice_Name(int choice_name) { this.choice_name = choice_name; } //在程序调试有打印的问题,打印当前对象是一个地址,重写toString(),打印属性值 @Override public String toString() { return "Joiner{" + "name='" + name + '\'' + ", choice_name=" + choice_name + '}'; } } 电脑类:
import java.util.Scanner; public class Computer extends Joiner{ @Override public void choice() { //电脑随机1,2,3 this.setChoice_Name((int)(Math.random()*3+1)); } @Override public void name_setting() { super.name_setting(); String[] computer_names={"小五","小六","小七"}; System.out.println("****************"); System.out.println("1----小五"); System.out.println("2----小六"); System.out.println("3----小七"); System.out.println("****************"); System.out.println("请选择对阵的人机编号"); Scanner scanner = new Scanner(System.in); System.out.println("注意:必须输入内容,然后再回车,不能是空格加回车,否则程序执行不下去"); try{ int tmp=scanner.nextInt(); this.setName(computer_names[tmp-1]); }catch(Exception e ){ } } } 玩家类:
import java.util.Scanner; public class Player extends Joiner{ //建议不要把Scanner放在外面,意味着程序执行过程中控制台一直开着,键盘类设备一直开着,系统容易被入侵 //重写方法设置玩家名称 @Override public void choice() { System.out.println("*****************"); System.out.println("1-----剪刀"); System.out.println("2-----石头"); System.out.println("3-----布"); System.out.println("*****************"); System.out.println("请选择出拳名称代表数字:"); Scanner scanner = new Scanner(System.in); //这里直接接收数字,考虑nextInt可能报错 System.out.println("注意:必须输入内容,然后再回车,不能是空格加回车,否则程序执行不下去"); try{ int tmp=scanner.nextInt(); this.setChoice_Name(tmp); }catch(Exception e){ this.setChoice_Name((int)(Math.random()*3+1)); } switch (getChoice_Name()){ case 1: System.out.println("玩家选择出:剪刀"); break; case 2: System.out.println("玩家选择出:石头"); break; case 3: System.out.println("玩家选择出:布"); break; } } @Override public void name_setting() { //玩家设置名称,输入名称 System.out.println("请输入玩家名称:"); Scanner scanner = new Scanner(System.in); String line=scanner.nextLine(); if (!line.trim().equals("")) { this.setName(line); }else{ //父类中提取的公共代码 super.name_setting(); } } }
裁判类:
public class Judge { //判断输赢的方法,方法需要两个角色,这个角色就是方法的参数 public void judge_winner(Player player,Computer computer){ //可以用减差来判断胜负 int sub_joiner=player.getChoice_Name()-computer.getChoice_Name(); //通过减值得到结果是 sub_joiner是1 0 2 -1 -2 // 0 1 考虑数组的角标,0值永远都是平局,0数组中的第一个元素,1就是数组中的赢 //值是2 对应数组中的输 String[] arrs= {"平局","赢","输"}; try{ System.out.println("玩家"+arrs[sub_joiner]); }catch(Exception e){ //电脑应用Math.abs绝对值函数, System.out.println("电脑"+arrs[Math.abs(sub_joiner)]); } System.out.println("双方出牌情况"); String[] joiner_choices={"剪刀","石头","布"}; System.out.println("玩家出拳:"+joiner_choices[player.getChoice_Name()-1]); System.out.println("电脑出拳:"+joiner_choices[computer.getChoice_Name()-1]); } } 主类:
import java.util.Scanner; public class Mymain { public static void main(String[] args) { //所有类实例化 Player player = new Player(); Computer computer = new Computer(); Judge judge = new Judge(); //按照游戏逻辑,调用类中的方法进行串联。 //显示一个菜单 System.out.println("*************************"); System.out.println(" 游戏:剪刀石头布"); System.out.println(" 版本:v1.0"); System.out.println(" 作者:XXXX"); System.out.println("************************"); System.out.println("输入回车后,游戏开始"); Scanner scanner = new Scanner(System.in); scanner.nextLine(); System.out.println("游戏开始......."); //开始逻辑 //定义玩家名称 player.name_setting(); //选择电脑参与作战者 computer.name_setting(); //调用player的出拳 player.choice(); //调用电脑computer的出拳 computer.choice(); //调用对应的裁判类,进行裁决。 judge.judge_winner(player,computer); } }