剪刀石头布(猜拳游戏)
游戏: 至少两个角色(玩家,电脑)
逻辑: 游戏规则(出拳,判断大小)
(1)首先分析有几个类
两个玩家------定义两个类 :玩家类和电脑类
裁判类------用于进行判断输赢
主程序------main主函数
(2)封装的内容
玩家类:
属性:名字---name 出拳名称---choice
方法:出拳
电脑类:
属性:名字---name 出拳名称---choice
方法:出拳
隐形裁判类:
属性:埋点(私有化)
方法:判断
主程序:
main函数
(3)继承关系:
玩家类和电脑类应该有一个共同的父类,父类的作用:
第一点:限定了玩家和电脑的属性和方法
第二点:取名规范化
定义一个参与者类作为父类,玩家类和电脑类继承参与者类。
在主函数中代码:
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);
}
}
在参与者类中的代码:
public 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;
}
//实现自己的方法,返回值是void
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 getChoiceName(){
return choice_name;
}
public void setChoiceName(int choice_name){
this.choice_name=choice_name;
}
@Override
public String toString() {
return "Joiner{" +
"name='" + name + '\'' +
", choice_name=" + choice_name +
'}';
}
}
在玩家类和电脑类中需要重写设置名称和出拳名称。
玩家类代码:
import java.util.Scanner;
public class Player extends Joiner{
//重写方法设置玩家名称
@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调用父类,父类中的"匿名用户"有效
System.out.println("请输入玩家名称:");
Scanner scanner=new Scanner(System.in);
String line=scanner.nextLine();
//用户名称可以有空格,但是全为空格没有意义,所以若用户名称全为空格,就默认为匿名用户
if(!line.trim().equals("")){
this.setName(line);
}else{
//继承父类
super.name_setting();
}
}
}
电脑类代码:
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{
int tmp=scanner.nextInt();
this.setName(computer_names[tmp-1]);
}catch(Exception e){
}
}
}
最后再定义一个判断类来判断是电脑赢还是玩家赢
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
String[] arrs={"平局","赢","输"};
try{
System.out.println("玩家"+arrs[sub_player]);
}catch (Exception e){
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]);
}
}
以上就是通过面向对象的思想来实现猜拳游戏。