1、猜拳游戏
问题描述
今天的任务是通过控制台方式实现一个人机对战的猜拳游戏,用户通过输 入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布),胜者积分, n 局以后通过积分的多少判定胜负。
分析方法
拿道题目,首先分析题意,然后看看能抽象出来几个类,对应的属性和方法(注意:属性和方法可以边写边定义,包括方法的返回值类型都是写到后面才知道要不要有返回值),最后就不断完善它。
代码
Person.java
import java.util.Scanner;
public class Person {
private int score;//表示用户赢的积分
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
/**
* 人出拳的方法
* @return
*/
public int inputShow(){
Scanner input = new Scanner(System.in);
while(true){
System.out.println("请输入您的猜拳:(1.剪刀 2.石头 3.布)");
int num = input.nextInt();
switch(num){
case 1:
System.out.println("用户出拳:剪刀");
break;
case 2:
System.out.println("用户出拳:石头");
break;
case 3:
System.out.println("用户出拳:布");
break;
default:
System.out.println("您输入有误,游戏重新开始!");
continue;
}
return num;
}
}
}
Computer.java
public class Computer {
private int score;//表示机器赢的积分
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
/**
* 机器出拳的方法
* @return
*/
public int inputShow(){
int num = (int)(Math.random()*3+1);
switch(num){
case 1:
System.out.println("机器出拳:剪刀");
break;
case 2:
System.out.println("机器出拳:石头");
break;
case 3:
System.out.println("机器出拳:布");
break;
}
return num;
}
}
PerComGame.java
import java.util.Scanner;
/**
* 人机猜拳类
*/
public class PerComGame {
private int js;//游戏的局数
private Person person;//参与游戏的用户
private Computer computer;//参与游戏的机器
/**
* 构造方法,给属性赋初值
*/
public PerComGame(){
js = 0;
this.person = new Person();
this.computer = new Computer();
}
/**
* 最终输出界面
*/
public void menu(){
Scanner input = new Scanner(System.in);
System.out.println("------欢迎来到爱摸鱼的TT~猜拳游戏------");
System.out.println("开始游戏,用户先开始");
loop:while(true){
startGame();
js++;
System.out.println("是否继续游戏(y/n)");
String c = input.next();
if(c.equals ("n") || c.equals("否")){
//结束游戏
break loop;
}
}
System.out.println("本次游戏已结束!");
System.out.println("最终对战结果如下:");
System.out.println("用户\tVS\t机器");
System.out.println("总共游戏局数:" + js);
System.out.println("用户的积分:" + person.getScore());
System.out.println("机器的积分:" + computer.getScore());
System.out.println("由以上积分得最终赢家为 " + winner());
}
/**
* 游戏比拼开始
*/
public void startGame(){
int pNum = person.inputShow();
int cNum = computer.inputShow();
//比较结果
if((pNum == 1 && cNum == 3) || (pNum == 2 && cNum == 1) || (pNum == 3 && cNum == 2)){
//用户赢
System.out.println("用户赢!");
person.setScore(person.getScore() + 1);
}else if(pNum == cNum){
//平局
System.out.println("二者平局!");
}else{
System.out.println("机器赢!");
computer.setScore(computer.getScore() + 1);
}
}
/**
* 用于判断赢家
* @return
*/
public String winner(){
if(person.getScore() > computer.getScore()){
return "用户";
}else if (person.getScore() == computer.getScore()){
return "用户和机器打平";
}else{
return "机器赢";
}
}
}
TestGame.java
public class TestGame {
public static void main(String[] args) {
PerComGame game = new PerComGame();
game.menu();
}
}
运行结果:
总结
该题可以认为是纯面向对象的,慢慢地掌握分析方法,做这种面向对象的题目要多分析多练,把思路理透彻(从内到外)。本题的难点在于人机猜拳这个类里,采用了自定义一个类对象,然后用构造方法给属性赋初值。