猜拳游戏
规则
0表示石头,1表示剪刀,2表示布
输入输出
键盘接收游戏局数和Tom的出拳情况(0、1、2)
输出显示Tom的每一局输赢情况
所有回合结束后,输出所有回合的输赢情况和用户赢的次数
- 输入
请输入你要玩的回合数:
3
请出拳(0-石头,1-剪刀,2-布):
1
- 输出
=======本局情况=======
==0:石头 1:剪刀 2:布==
Tom 电脑 输赢情况
1 2 你赢了
=======回合一览=======
==0:石头 1:剪刀 2:布==
Tom 电脑 输赢情况
1 2 你赢了
1 2 你赢了
1 1 你俩平局
=====你总共赢了2局=====
设计思路
- 有一个用户Tom,设计他的成员变量,成员方法。
- 电脑可以随机出拳。(随机生成0,1,2)
- 主类实现游戏流程
- Customer类实现两个用户(Tom和电脑)的出拳信息
算法流程
- 实现主类(MoraGame)的回合数输入
- 创建存储信息的变量:二维数组、对象
- 实现玩家类(Player)的功能
- 定义属性:tom、com、winCount
- 定义方法:
- tom的出拳(setTom/getTom)
- com的出拳(setCom/getCom)
- 输赢判断(judge):并实现获胜回合数的增加
- 完善主类功能(游戏流程实现)
- 循环进行round回合
- 每一轮回合:
- 获取玩家出拳并存储至二维数组
- 获取电脑出拳并存储至二维数组
- 获取输赢情况并存储至二维数组
- 对每一局情况进行输出
- 所有回合结束:对二维遍历输出,并输出获胜的回合数
反思
-
我主要用一维数组 + 当前回合 + 循环
这就需要把游戏放在Customer类里去,感觉逻辑上有些漏洞按理来说应该是:主类实现游戏流程,Customer类实现两个用户(Tom和电脑)的出拳信息
还有就是Customer类中有两个属性是数组类型的,用起来不是很方便,每次都需要传参当前回合数。
-
老师用的是二维数组 + 循环
逻辑上是没问题的,有两个地方做了修改,使代码更完善:- 老师用的int型二维数组不能存储输赢情况。
-> 改为直接采取string型二维数组,一次性存储完毕。只是得把int型的tom、com数据改为string - 原代码局数固定为3局。
-> 改为键盘输入要玩的回合数。
- 老师用的int型二维数组不能存储输赢情况。
实现的细节
- 产生随机数的方法:
Random r = new Random();
int num = r.nextInt(3); //返回0-2的整数随机数(0、1、2)
具体实现
- 老师写的
public class MoraGame02 {
public static void main(String[] args) {
//修正:局数由玩家设定
System.out.println("请输入你要玩的回合数:");
Scanner scanner = new Scanner(System.in);
int round = scanner.nextInt();
//修正:用String型二维数组,每一局一行,每行3个信息:Tom出拳情况、电脑出拳情况以及输赢情况
String[][] arr = new String[3][round];
int i = 0, j = 0;
//创建一个玩家对象
Player player = new Player();
for (i = 0; i < round; i++) {
//获取玩家出拳
player.setTom();
int tom = player.getTom();
arr[i][j] = tom + "";
//获取电脑出拳
int com = player.getCom();
arr[i][j+1] = com + "";
//获取输赢情况
String isWin = player.judge();
arr[i][j+2] = isWin;
//对每一局情况进行输出
System.out.println("=======本局情况=======");
System.out.println("==0:石头 1:剪刀 2:布==");
System.out.println("Tom\t\t电脑\t\t输赢情况\t\t");
System.out.println(tom + "\t\t" + com + "\t\t" + isWin);
}
//对最终情况输出
System.out.println("\n\n=======回合一览=======");
System.out.println("==0:石头 1:剪刀 2:布==");
System.out.println("Tom\t\t电脑\t\t输赢情况\t\t");
for (i = 0; i < arr.length; i++) {
for (j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t\t");
}
System.out.println();
}
System.out.println("=====你总共赢了"+ player.winCount + "局=====");
}
}
class Player {
int tom; //tom出拳类型
int com; //电脑出拳类型
int winCount = 0; //玩家赢的次数
//电脑随机出拳
public int getCom() {
Random r = new Random();
com = r.nextInt(3); //返回0-2的随机数
return com;
}
//设置tom的出拳
public void setTom() {
Scanner scanner = new Scanner(System.in);
System.out.println("\n请出拳(0-石头,1-剪刀,2-布):");
tom = scanner.nextInt();
if(tom > 2 || tom < 0){
//抛出一个异常
throw new IllegalArgumentException("数字输入错误");
} else {
this.tom = tom;
}
}
public int getTom() {
return tom;
}
//比较猜拳的结果
public String judge() {
if(tom == 0 && com == 1){
winCount++;
return "你赢了";
} else if(tom == 1 && com == 2) {
winCount++;
return "你赢了";
} else if(tom == 2 && com == 0) {
winCount++;
return "你赢了";
} else if(tom == com) {
return "你俩平局";
} else {
return "电脑赢了";
}
}
}
- 我写的
package com.rxli.chapter07;
import java.util.Scanner;
public class MoraGame {
public static void main(String[] args) {
System.out.println("请输入你要玩的回合数:");
Scanner scanner = new Scanner(System.in);
//初始化参数
int round = scanner.nextInt();
int[] tom = new int[round];
int[] com = new int[round];
String[] resultArr = new String[round];
//创建一个玩家对象
Customer customer = new Customer(round,tom,com,resultArr);
//开始游戏
customer.game();
}
}
class Customer {
int round;
private int[] tom; //Tom出拳信息
private int[] com; //电脑出拳信息
private String[] resultArr; //包含所有出拳情况的数组
int winCount = 0;//记录输赢次数
//初始化局数和数组
public Customer(int round, int[] tom, int[] com, String[] resultArr) {
this.round = round;
this.tom = tom;
this.com = com;
this.resultArr = resultArr;
}
//第i+1局Tom出拳记录
public void setTom(int i){
int res;
System.out.println("\n请出拳(0-石头,1-剪刀,2-布):");
Scanner scanner = new Scanner(System.in);
while(true){
res = scanner.nextInt();
if(res >=0 && res <= 2){
this.tom[i] = res;
break;
} else {
System.out.println("程序错误:必须输入0、1、2这三者中其中一个数\n请重新输入:");
}
}
}
//第i+1局电脑出拳记录
public void setCom(int i){
com[i] = (int)(Math.random() * 3); //Math.random范围:[0,1),乘以2不能取到2
}
//输赢判断
public void judge(int i){ //i:currentRound
if(tom[i] == com[i]){ //简写了,如果详细写的话,有9种情况
System.out.println(tom[i] + "\t\t" + com[i] + "\t\t你俩平局");
resultArr[i] = tom[i] + "\t\t" + com[i] + "\t\t你俩平局";
} else if((tom[i] == 0 && com[i] == 1) ||
(tom[i] == 2 && com[i] == 0) ||
(tom[i] == 1 && com[i] == 2) ){
System.out.println(tom[i] + "\t\t" + com[i] + "\t\t你赢了");
resultArr[i] = tom[i] + "\t\t" + com[i] + "\t\t你赢了";
winCount++;
} else {
System.out.println(tom[i] + "\t\t" + com[i] + "\t\t电脑赢了");
resultArr[i] = tom[i] + "\t\t" + com[i] + "\t\t电脑赢了";
}
}
//游戏流程
public void game(){
//游戏中
for (int i = 0; i < round; i++) { //进行第i+1轮游戏
//Tom出拳
setTom(i);
//电脑出拳
setCom(i);
//本局情况
System.out.println("=======本局情况=======");
System.out.println("==0:石头 1:剪刀 2:布==");
System.out.println("Tom\t\t电脑\t\t输赢\t\t");
//输赢判断
judge(i);
}
//结束游戏,输出总情况
System.out.println("\n\n=======回合一览=======");
System.out.println("==0:石头 1:剪刀 2:布==");
System.out.println("Tom\t\t电脑\t\t输赢\t\t");
for(int i = 0;i < round ; i++){
System.out.println(resultArr[i]);
}
System.out.println("=====你总共赢了"+ winCount + "局=====");
}
}