学习了Java的选择循环之后,结合类的基础,加上随机数。可以实现一个简单的小程序——人机猜拳
1.实现效果
有两个选手(Player),一名代表玩家(People),一名代表电脑(Computer)。玩家可以选择出拳类型,电脑随机出拳,若赢则积分加一,结束后可以统计分数。
2.设计UML类图
本程序由于人玩家与电脑玩家有许多共同的属性与方法,所以,笔者采用Player类作为父类,People和Computer继承它。
3.设计类代码
Player类代码
package fingerGuessing;
import java.util.Random;
import java.util.Scanner;
public abstract class Player {
String name;//名字属性
int scores=0;//统计分数
public abstract void setName(String name);
public abstract String getName();
public abstract int getScore();
public abstract int go();//出拳方法
public abstract void changeSore(int n);//比较一局输赢,改变分数
}
People类代码(重写父类的方法)
package fingerGuessing;
import java.util.Scanner;
class People extends Player{
@Override
public void setName(String name) {
// TODO Auto-generated method stub
this.name = name;
}
public String getName() {
// TODO Auto-generated method stub
return name;
}
public int getScore(){
return scores;
}
@Override
public int go() {
// TODO Auto-generated method stub
int op;
//以数字来代替(0石头 1剪刀 2布),可以大大简化之后的比较输赢
System.out.println("出拳 请选择:0石头 1剪刀 2布");
Scanner in = new Scanner(System.in);
op = in.nextInt();
if(op>=0&&op<=2)//输入的是正确范围内的数字,返回该数字
return op;
else //输入的是错误范围则返回3
return 3;
}
@Override
public void changeSore(int n) {//1代表赢,2代表输,3代表平局。具体可以在下面的Game类中查看
// TODO Auto-generated method stub
switch (n) {
case 1:
scores+=1;
System.out.println("恭喜你,你赢了,你目前的的积分是"+this.getScore());
break;
case 2:
scores-=1;
System.out.println("尴尬了,你输了,你目前的的积分是"+this.getScore());
break;
case 3:
System.out.println("没意思,平局,你目前的的积分是"+this.getScore());
break;
default:
break;
}
}
}
Computer类代码(也需要重写父类代码)
package fingerGuessing;
class Computer extends Player{
@Override
public void setName(String name) {
// TODO Auto-generated method stub
this.name = name;
}
public String getName() {
// TODO Auto-generated method stub
return name;
}
public int getScore(){
return scores;
}
@Override
public int go() {
// TODO Auto-generated method stub
int op=(int)(Math.random()*3);//以数字来代替(0石头 1剪刀 2布),可以大大简化之后的比较
return op;
}
@Override
public void changeSore(int n) {
// TODO Auto-generated method stub
}
}
4.Game类实现
敲完参与者类之后,我们需要开始实现游戏类了。代码如下。
package fingerGuessing;
import java.awt.color.CMMException;
import java.util.Scanner;
public class Game {
Player p1;
Player p2;
static int i =0;
static String[] map={"石头","剪刀","布","请输入正确的数字"};//将出拳的形式存储入一个
public Game() {
// TODO Auto-generated constructor stub
}
public Game(Player p1, Player p2) {
super();
this.p1 = p1;
this.p2 = p2;
}
public void initial() {
System.out.println(" **************");
System.out.println(" ** 猜拳开始 **");
System.out.println(" **************");
Scanner in = new Scanner(System.in);
System.out.println("请输入玩家名字");
String name = in.next();
p1.setName(name);
System.out.println("请输入电脑名字");
name = in.next();
p2.setName(name);
}
public void fight(){
int p1_num = p1.go();//玩家出的石头剪刀布放入p1_num
if(p1_num==3){
System.out.println(map[3]);
}else{
int p2_num = p2.go();//电脑出的石头剪刀布放入p2_num
System.out.println(p1.getName()+"出拳:"+map[p1_num]+" "+p2.getName()+"出拳:"+map[p2_num]);
//在Map数组中我们可以发现,石头剪刀布,如果将其看成是循环数组,那么前一个一定可以赢后一个
//比如1<2<3<1 石头<剪刀<布<石头。
//所以只要判断p1_num 在p2_num的前面还是后面就好,如果相等则是平局
if(((p1_num+1)%3)==p2_num)
p1.changeSore(1);
else if(((p1_num+2)%3)==p2_num)
p1.changeSore(2);
else
p1.changeSore(3);
}
}
public static Game startGame() {
Player p1 = new People();
Player p2 = new Computer();
Game g = new Game(p1, p2);
g.initial();
return g;
}
public static void onGame(Game g){
Scanner in = new Scanner(System.in);
int op=1;
System.out.println("---------------\n输入1继续游戏,其他数字结束");
op=in.nextInt();
while(op==1){
g.fight();
g.i++;
System.out.println("---------------\n输入1继续游戏,其他数字结束");
op=in.nextInt();
}
}
public static void endGame(Game g){
System.out.println("------------------\n对局结束");
System.out.println("你的最终积分是"+g.p1.getScore()+"\n你们一共进行"+Game.i+"局");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Game g=Game.startGame();
Game.onGame(g);
Game.endGame(g);
}
}