用Java实现猜丁壳(石头剪刀布)
我们在控制台输入数字1,2,3分别代表石头,剪刀,布。让后人机(电脑玩家)随机生成石头剪刀布中的一个,比较后得出比分与赢的一方。率先获得5场胜利的玩家获胜。
前言
首先创建如下图所示的包、类、接口。
运行时仅需要运行TestGame即可
运行界面如下:
一、代码实现
1.util工具包
util工具包中的Constants类
package guessgame.util;
/**
* 常量类
*/
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=5;
public static final String [] names={"石头","剪刀","布"};
}
util工具包中的MyUtils类
package guessgame.util;
import java.util.Random;
/**
* 工具类
*/
public class MyUtils {
private MyUtils(){}
public static int getRandom(int n){
return new Random().nextInt(n+1);//(0,n+1)
}
public static int getRandom(int min,int max)//(10,30)
{
//return Math.random();//(0,1) 0.112233
return (int)(Math.random()*(max-min+1))+min;
}
}
2.service包
Player玩家类:
package guessgame.service;
/**
* 玩家类
*/
public abstract class Player {
private String name;
private int value;//出拳 0,1,2
private int winCount;//取胜的局数
public Player() {
}
public Player(String name) {
this.name = name;
}
public Player(String name, int value, int winCount) {
this.name = name;
this.value = value;
this.winCount = winCount;
}
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();
}
UserPlayer玩家类:
package guessgame.service;
import guessgame.util.MyUtils;
import java.util.Scanner;
/**
* 用户玩家
*/
public class UserPlayer extends Player{
public UserPlayer() {
}
public UserPlayer(String name) {
super(name);
}
public UserPlayer(String name, int value, int winCount) {
super(name, value, winCount);
}
@Override
public int getInputValue() {
//从键盘获取随机数
Scanner input=new Scanner(System.in);
System.out.println("请选择你的手势 :[0-石头],[1-剪刀],[2-布]"
);
int value = input.nextInt();
//赋给电脑玩家的value
this.setValue(value);
//
return value;
}
}
ComputerPlayer玩家类:
package guessgame.service;
import guessgame.util.MyUtils;
/**
*
*/
public class ComputerPlayer extends Player{
public ComputerPlayer() {
}
public ComputerPlayer(String name) {
super(name);
}
public ComputerPlayer(String name, int value, int winCount) {
super(name, value, winCount);
}
@Override
public int getInputValue() {
//获取工具类
int value = MyUtils.getRandom(2);
//赋给电脑玩家的value
this.setValue(value);
//
return value;
}
}
Judger裁判类
package guessgame.service;
/**
* 裁判类
*/
public class Judger {
/**
* 根据两个玩家的出拳,判断这局两个玩家的胜负
*
* @param computerValue 电脑玩家
* @param userValue 用户玩家
* @return 0 和局 1 电脑玩家赢 2 电脑玩家输
*/
public int compare(int computerValue, int userValue)
{
if (computerValue == userValue) {
return 0;
} else if (computerValue == 0) {
if (userValue == 1) {
return 1;
} else {
return 2;
}
} else if (computerValue == 1) {
if (userValue == 0) {
return 2;
} else {
return 1;
}
} else if (computerValue == 2) {
if (userValue == 1) {
return 2;
} else {
return 1;
}
}
return 0;
}
}
GameInterface接口
package guessgame.service;
public interface GameInterface {
public void initGame();
public void startGame();
public void endGame();
}
GuessGame类
package guessgame.service;
import guessgame.util.Constants;
public class GuessGame implements GameInterface{
private Player computerPlayer;
private Player userPlayer;
private Judger judger;
private int count;//当前是第几局;
@Override
public void initGame() {
computerPlayer = new ComputerPlayer("王会强");
userPlayer =new UserPlayer("王会强他爹");
judger =new Judger();
count =1;
}
@Override
public void startGame()
{
while(true)
{
//用户玩家出拳
int userValue=userPlayer.getInputValue();
//电脑玩家出拳
int comValue=computerPlayer.getInputValue();
//输出两方的出拳
System.out.println(userPlayer.getName()+":"+ Constants.names[userValue]+":"+"\t"+computerPlayer.getName()+":"+Constants.names[comValue]);
//数列进行比较
int result=judger.compare(comValue,userValue);
//修改winCount
modifyWinCount(result);
//输出本局比赛结果
showResult(result);
//判断胜负
if(userPlayer.getWinCount()==Constants.WIN_COUNT||computerPlayer.getWinCount()==Constants.WIN_COUNT){
break;
}
}
}
@Override
public void endGame() {
System.out.println("=======================");
System.out.println("最终比分");
System.out.println(userPlayer.getName()+"\t"+userPlayer.getWinCount()+"\t"+computerPlayer.getWinCount()+"\t"+computerPlayer.getName());
if(userPlayer.getWinCount()==Constants.WIN_COUNT)
System.out.println(userPlayer.getName()+"赢");
if(computerPlayer.getWinCount()==Constants.WIN_COUNT)
System.out.println(computerPlayer.getName()+"赢");
}
private void showResult(int result) {
switch (result){
case 0:
System.out.println("本局:和局");
break;
case 1:
System.out.println("本局:"+computerPlayer.getName()+"赢");
break;
case 2:
System.out.println("本局:"+userPlayer.getName()+"赢");
}
System.out.println("当前比分为:"+userPlayer.getName()+"\t"+userPlayer.getWinCount()+"\t"+":"+computerPlayer.getWinCount()+"\t"+computerPlayer.getName());
}
private void modifyWinCount(int result) {
if(result==1){//电脑玩家赢了
computerPlayer.setWinCount(computerPlayer.getWinCount()+1);
}else if(result==2){
userPlayer.setWinCount(userPlayer.getWinCount()+1);
}
}
}
3.test包
TsetGame类
package guessgame.test;
import guessgame.service.GameInterface;
import guessgame.service.GuessGame;
/**
* 启动类
*/
public class TestGame {
public static void main(String[] args) {
GameInterface gameInterface=new GuessGame();
gameInterface.initGame();
gameInterface.startGame();
gameInterface.endGame();
}
}