Java基础小项目——实现人机猜拳


学习了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);
	}

}

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值