JavaLearn # 面向对象案例:猜丁壳
Posted LRcoding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaLearn # 面向对象案例:猜丁壳相关的知识,希望对你有一定的参考价值。
1. 案例设计
最终的运行效果:
类的设计:【常量类 和 工具类 在开发中应该必须定义】
游戏的核心业务: 对战一局
- 用户玩家出手
- 电脑玩家出手
- 输出两方的出手
- 裁判判断谁赢谁输
- 根据结果修改赢家的 winCount
- 输出本局结果
- 判断游戏是否结束
2. 搭建案例框架
- com.lwclick.entity :存放实体类
- com.lwclick.service :存放业务代码
- com.lwclick.test : 存放测试类
- com.lwclick.util : 存放常量类和工具类
3. 开发工具类和常量类
常量类Constants
:
public class Constants {
public static final int STONE = 0; // 石头
public static final int SCISSORS = 1; // 剪刀
public static final int CLOTH = 2; // 布
public static final int WIN_COUNT = 3; // 判定胜的次数
public static final String[] NAME = {"石头", "剪刀", "布"}; // 变量对应的索引获得对应的字符值
}
工具类Utils
:
public class Utils {
/**
* 不允许在外部创建对象
* 要调用方法只能通过 类名.方法名 (方法声明成静态的)
*/
private Utils(){
}
/**
* 产生 [0, n] 的随机数(可以用于电脑玩家随机选择石头 剪刀 布)
* @param n
* @return
*/
public static int getRandom(int n) {
return new Random().nextInt(n + 1);
}
/**
* 产生[n, m]范围的随机整数
* @param min
* @param max
* @return
*/
public static int getRandom(int min, int max) {
return (int)(Math.random() * (max - min + 1)) + min;
}
}
4. 开发玩家类和裁判类
抽象父类Player
:
public abstract class Player {
private String name;
private int value; // 取值 0 1 2
private int winCount;
public Player() {
}
/**
* 此处构造方法只用 name 即可,因为 value 和 winCount 是变化的
* @param name
*/
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public int getWinCount() {
return winCount;
}
public void setWinCount(int winCount) {
this.winCount = winCount;
}
/**
* 获取玩家的手势对应的数字,赋给 value 并返回
* @return
*/
public abstract int getInputValue();
}
电脑玩家类ComputerPlayer
:
public class ComputerPlayer extends Player {
public ComputerPlayer() {
}
public ComputerPlayer(String name) {
super(name);
}
@Override
public int getInputValue() {
int value = Utils.getRandom(2);
this.setValue(value);
return value;
}
}
用户玩家类UserPlayer
:
public class UserPlayer extends Player {
public UserPlayer() {
}
public UserPlayer(String name) {
super(name);
}
@Override
public int getInputValue() {
// 从键盘输入要选择的手势
Scanner sc = new Scanner(System.in);
System.out.println("请选择你的手势:[0-石头], [1-剪刀], [2-布]");
int value = 0;
try {
value = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("请正确输入");
}
super.setValue(value);
return value;
}
}
裁判类Judger
:
public class Judger {
/**
* 根据某一局两个玩家的出手,判断谁赢谁负
* @param userValue
* @param computerValue
* @return
*/
public int compare(int userValue, int computerValue) {
if (userValue == computerValue) {
return 0;
} else if (userValue == 0) { // 石头
if (computerValue == 1) { // 剪刀
return 1;
} else { // 布
return -1;
}
} else if (userValue == 1) { // 剪刀
if (computerValue == 2) { // 布
return 1;
} else { // 石头
return -1;
}
} else { // 布
if (computerValue == 0) { // 石头
return 1;
} else { // 剪刀
return -1;
}
}
}
}
5. 开发游戏类并进行测试
游戏类接口GameInterface
:
public interface GameInterface {
/**
* 初始化游戏
*/
public void initGame();
/**
* 开始游戏
*/
public void startGame();
/**
* 游戏结束
*/
public void endGame();
}
猜拳游戏类GuessGame
:
public class GuessGame implements GameInterface {
private Player computer;
private Player people;
private Judger judger;
private int count; // 局数
@Override
public void initGame() {
computer = new ComputerPlayer("阿尔法狗");
people = new UserPlayer("张三");
judger = new Judger();
count = 1;
}
@Override
public void startGame() {
while (true) {
System.out.println("\\n----------------------第 " + count + " 局-------------------------");
// 玩家出手
int value1 = people.getInputValue();
// 电脑出手
int value2 = computer.getInputValue();
// 输出两方出的什么
System.out.println(people.getName() + ":" + Constants.NAME[value1]
+ " " + computer.getName() + ":" + Constants.NAME[value2]);
// 裁判进行判断
int res = judger.compare(value1, value2);
// 根据本局结果,修改玩家的 winCount;
modifyWinCount(res);
// 输出本局比赛的结果
showResult(res);
// 判断两方获胜的次数是否到了规定的次数,是否结束游戏
if (people.getWinCount() == Constants.WIN_COUNT
|| computer.getWinCount() == Constants.WIN_COUNT) {
break;
}
count++;
}
}
/**
* 输出一次游戏的比赛结果
* @param res
*/
private void showResult(int res) {
switch (res) {
case 0:
System.out.println("本局:和局");
break;
case 1:
System.out.println("本局:" + people.getName() + " 胜利!");
break;
case 2:
System.out.println("本局: " + computer.getName() + " 胜利!");
break;
}
// 当前比分
System.out.println("当前比分:" + people.getName() + " " + people.getWinCount()
+ ":" + computer.getWinCount() + " " + computer.getName());
}
/**
* 修改选手获胜的次数
* @param res
*/
private void modifyWinCount(int res) {
if (res == 1) {
people.setWinCount(people.getWinCount() + 1);
} else if (res == -1) {
computer.setWinCount(computer.getWinCount() + 1);
}
}
@Override
public void endGame() {
System.out.println("============================================================");
System.out.println("最终比分:" + people.getName() + " " + people.getWinCount()
+ ":" + computer.getWinCount() + " " + computer.getName());
if (people.getWinCount() > computer.getWinCount()) {
System.out.println(people.getName() + " 获得了最终的胜利!");
} else {
System.out.println(computer.getName() + " 获得了最终的胜利!");
}
}
}
测试类Test
:
public class Test {
public static void main(String[] args) {
GameInterface game = new GuessGame();
game.initGame();
game.startGame();
game.endGame();
}
}
以上是关于JavaLearn # 面向对象案例:猜丁壳的主要内容,如果未能解决你的问题,请参考以下文章
JavaLearn#(19)反射Class类使用反射创建对象-操作属性-执行方法泛型与反射反射案例
JavaLearn#(25)Ajax相关知识三级联动案例Bootstrap入门栅格系统排版表格字体图标等简单概述
JavaLearn#(25)Ajax相关知识三级联动案例Bootstrap入门栅格系统排版表格字体图标等简单概述
JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)