1.Mymain类: 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); } }
2.player类: 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.setChoiceName(tmp); }catch(Exception e){ this.setChoiceName((int)(Math.random()*3+1)); } } @Override public void name_setting() { //super调用父类,父类中的“匿名用户”有效 // super.name_setting(); //玩家设置名称,输入名称 System.out.println("请输入玩家名称:"); Scanner scanner = new Scanner(System.in); //这个名称允许空格,但是空格后回车,如果接受是空的,空的没有意义 //属次调用scanner.nextLine()一直接收屏幕输入,只输入一次 //这里只有变量接收一次 String line=scanner.nextLine(); if (!line.trim().equals("")) { this.setName(line); }else{ //父类中提取的公共代码 super.name_setting(); } } }
3.Judge类:
/* 裁判类 */ public class Judge { //判断输赢的方法,方法需要两个角色,这个角色就是方法的参数 public void judge_winner(Player player,Computer computer){ //可以用减差来判断胜负 int sub_player=player.getChoiceName()-computer.getChoiceName(); //通过减值得到结果是 sub_player是1 0 2 -1 -2 // 0 1 考虑数组的角标,0值永远都是平局,0数组中的第一个元素,1就是数组中的赢 //值是2 对应数组中的输 //-1 arrs[-1] 0 -1 -2 应用到电脑中没有问题 String[] arrs= {"平局","赢","输"}; try{ System.out.println("玩家"+arrs[sub_player]); }catch(Exception e){ //电脑应用Math.abs绝对值函数, System.out.println("电脑"+arrs[Math.abs(sub_player)]); } System.out.println("双方出牌情况"); String[] player_choices={"剪刀","石头","布"}; System.out.println("玩家出拳:"+player_choices[player.getChoiceName()-1]); System.out.println("电脑出拳:"+player_choices[computer.getChoiceName()-1]); } }
4.joiner类:
public class Joiner { //属性: name名字 choice出拳名称,choice_name化成数值与算法有关系 //封装内容私有化 private String name; private int choice_name; //2、构造函数产生(无参有利于实例化,有参有利于实例化传入所有参数 public Joiner() { } public Joiner(String name, int choice_name) { this.name = name; this.choice_name = choice_name; } //实现自己的方法,返回值是void,一般最开始写方法,都可以默认void,这里的choice()方法避免和choice属性重名 public void choice(){ //代码逻辑略,因为玩家和电脑逻辑不同,由玩家和电脑重写 } //玩家和电脑设置参与者名称的方法 public void name_setting(){ this.setName("匿名用户"); } //1、把两个私有变量产生setter和getter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getChoiceName() { return choice_name; } public void setChoiceName(int choice_name) { this.choice_name = choice_name; } //3、在程序调试有打印的问题,打印当前对象是一个地址,重写toString(),打印属性值 @Override public String toString() { return "Joiner{" + "name='" + name + '\'' + ", choice_name=" + choice_name + '}'; } }
5.computer类:
import java.util.Scanner; public class Computer extends Joiner { @Override public void choice() { //电脑随机1,2,3 this.setChoiceName((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("****************"); System.out.println("请选择对阵的英雄编号"); Scanner scanner = new Scanner(System.in); System.out.println("注意:必须输入内容,然后再回车,不能是空格加回车,否则程序执行不下去"); try{ //把scanner的nextInt先接收一下 int tmp=scanner.nextInt(); this.setName(computer_names[tmp-1]); }catch(Exception e ){ } } }