猜拳游戏
抛砖引玉
我们先来掌握一个知识点
Java中 == 和 equalse()的区别
- Java中数据类型有两种:基本数据类型和引用数据类型
基本数据类型的值存储在内存的栈中;引用数据类型栈中存储的是对象的地址,该地址指向的堆中内存空间存储的才是我们需要的内容,比如对象存储在内存的堆中。
- 关于==:
比较的是内存地址。当比较的是基本数据类型变量时,判断它们是否来自同一个内存地址,由于基本类型变量值是存储在栈里面的,当两个变量有同一个值时,其实它们只用到了一个内存空间,所以比较的结果是true。
当比较的是引用数据类型变量时,判断的也是内存地址,如果两个引用的地址信息相同,指向的就是同一个对象,得到的结果就是true。
例如:
例子1:
String s1 = “123”;
String s2 = “123”;
s1s2 值为true
例子2:
String s1 = “123”;
String s2 = new String(“123”);
s1s2 的结果是false
例子1中:java中有字符串缓冲池的概念,通俗的说,就是程序在运行的时候会创建一个字符串缓冲池,里面放了字符串对象,在声明String变量的时候,程序首先会在这个String缓冲池中寻找相同的对象,如果有相同对象,就将已有的地址赋值给引用;如果没有就创建新的内存地址,因此缓冲池里原来有的字符串的那个变量和新申请的变量,其实指向的是同一个内存空间。因此例子1里面s1和s2用到的都是同一个内存空间的“123”。所以此时==的结果是true。
例子2中:由于s2用new 关键字重写申请了空间,没有用到缓冲池里的原有的变量,所以它们内存地址不相同,所以结果为false。
- 关于equalse()
equalse()方法是Object类的基本方法之一,在Object类中的equalse()方法是对两个对象的地址值进行比较的,但是当String、Math、Integer等封装类在使用equalse()方法是已经覆盖了Object类的equalse()方法,所以每个类都有自己的equalse()方法,是比较两个对象的内容是否一样。所以上面的例子如果换成是equalse()比较的话,结果都true。
我们在来掌握一个知识点
将用户输入的数字与随机生成的数字进行比较
我的任务是创建一个随机生成的数字,要求用户输入一个数字,然后比较两者并显示一个消息框,告诉他们是否匹配。到目前为止,这是我的代码…
import javax.swing.*; //GUI 组件
public class RandomGuessMatch
{
public static void main(String[] args)
{
Integer random = (1 + (int)(Math.random() * 5)),userNum;
// 获取输入
userNum = JOptionPane.showInputDialog("输入一个数字 1 - 5.");
// 检查数字是否匹配
boolean matches = (random == userNum);
JOptionPane.showMessageDialog(null, "这个随机数是 " + random + ". " + "它匹配吗? " + matches);
}
}
我遇到的唯一错误是当我试图获取用户输入时。 “无法从String转换为Integer”。但是,我无法弄清楚如何获取用户的号码并将其与“userNum”相关联,以便我可以将其与“随机”进行比较。
1.可以通过解析将字符串转换为整数。
int x = Integer.parseInt(“1”);
请注意,如果String为NaN
,则会抛出异常
2.
JOptionPane的showInputDialog方法返回String。你可以做的是使用结果字符串作为Integer类的构造函数中的参数:
userNum = new Integer(JOptionPane.showInputDialog(“Enter a number 1 - 5.”));
此外,由于您使用的是Integer对象,因此必须使用equals方法对它们进行比较:
boolean matches = random.equals(userNum);
3.
需要使用
将字符串响应强制转换为整数
Integer.parseInt(userChoice)
4.
可以通过这种方式获得输入:
userNum = Integer.getInteger(JOptionPane.showInputDialog(“Enter a number 1 - 5.”));
稍后您可以进行一些输入验证以防止非整数输入。
5.
ShowInputDialog will return a String。因此,您将其值放入的变量也必须具有String类型。
尝试创建一个名为" userInput"的变量。并将用户输入的值放在那里。然后你可以说
userNum = Integer.valueOf(userInput);
从那里,使用" userNum.equals(随机)"比较两个整数。 double equals运算符只适用于int类型,而不是Integers。
6.
如果您读取用户输入它是一个String,那么您必须将userNum声明为String而不是Integer。
String userNum;
下一步是将随机数与字符串进行比较。要做到这一点,你需要Integer.valueOf(String s)方法,因此它们都是Integer值:
boolean matches = (random == Integer.valueOf(userNum));
我们可以用第二条(已过期)解决当前问题
import javax.swing.*; //GUI components组件
public class RandomGuessMatch
{
public static void main(String[] args)
{
Integer random = (1 + (int) (Math.random() * 5)),userNum;
// 获取匹配
userNum = new Integer(JOptionPane.showInputDialog("输入一个数字 1 - 5."));
// 检查数字是否匹配
// boolean matches = (random == userNum);
boolean matches = random.equals(userNum);
JOptionPane.showMessageDialog(null, "这个随机数是 " + random + ". " + "它匹配吗? " + matches);
}
}
我们看效果:
我们继续掌握一个知识点
Boolean数据类型以及判断true和false
Boolean数据类型
有两个值:true和false
Boolean()函数可以将任何数据类型转化为boolean类型
boolean数据类型
转化为true true
转化为false false
String数据类型
转化为true 任何非空字符串
转化为false “ ”(非空字符串)
Number数据类型
转化为true 任何非0数字
转化为false 0和NaN
Object数据类型
转化为true 任何对象
转化为false null
undefined数据类型
转化为true 无
转化为false undefined
在做if判断的时候的 真 和 假
假(6):false、空字符串、0、null、undefined、NaN
在做运算判断时
运算符 + - * / %
import java.util.Random;
import java.util.Scanner;
/*
请编写一个猜拳游戏
有个人 Tom 设计他的成员变量,成员方法,可以电脑猜拳
电脑每次都会随机生成 0,1,2
0 —— 石头
1 —— 剪刀
2 —— 布
并要可以显示 Tom 的输赢次数
*/
public class MoraGame
{
//测试
public static void main(String[] args)
{
// 创建一个玩家对象
Tom t = new Tom();
// 用来记录最后的输赢次数
byte isWinCount = 0;
// 创建二维数组,用来接收局数,Tom 出拳情况以及电脑出拳情况
byte[][] arrone = new byte[3][3];
byte j = 0;
// 创建一个一维数组,用来接收输赢情况
String[] arrtwo = new String[3];
Scanner scanner = new Scanner(System.in);
for(byte i=0;i<3;i++)
{
// 获取玩家出的拳
System.out.println("请输出你要出的拳 0 —— 石头 1 —— 剪刀 2 —— 布");
byte num = (byte)scanner.nextInt(); // 接收客户端从键盘的输入
t.setTomGuessNum(num); // 调用 Tom 类中的方法及传参
byte tomGuess = t.getTomGuessNum(); // 调用 Tom 类中的方法以及接收当前客户端在键盘的输入
arrone[i][j + 1] = tomGuess;
// 获取电脑出拳
byte comGuess = (byte)t.computerNum();
arrone[i][j + 2] = comGuess;
// 将玩家猜的拳与电脑做比较
String isWin = t.vsComString();
arrtwo[i] = isWin;
arrone[i][j] = t.count;
// 对每一局的情况进行输出
System.out.println("============================");
System.out.println("局数\t玩家的出拳\t电脑的出拳\t输赢情况");
System.out.println(t.count + "\t" + tomGuess + "\t\t" + comGuess + "\t\t" + arrtwo[i]);
System.out.println("============================");
System.out.println("\n\n");
isWinCount = t.winCount(isWin);
}
// 对游戏的最终结果进行输出
System.out.println("局数\t 玩家的出拳\t 电脑的出拳\t\t输赢情况");
for(byte a=0;a<arrone.length;a++)
{
for (byte b = 0; b < arrone[a].length; b++)
{
System.out.print(" "+arrone[a][b] + "\t\t");
}
System.out.println(arrtwo[a]);
// System.out.println();
}
System.out.println("您赢了" + isWinCount + "次");
}
}
// Tom 类
class Tom // 核心代码
{
// 玩家出拳的类型
byte tomGuessNum;
// 电脑出拳的类型
byte comGuessNum;
// 玩家赢的次数
byte winCountNum;
// 比赛的次数
byte count = 1;
public void showInfo()
{
// ...
}
/*
* 电脑随机生成猜拳定数字方法
* @return
*/
public int computerNum()
{
Random r = new Random();
comGuessNum = (byte) r.nextInt(3); // 方法 返回 0-2 的随机数
// System.out.println("电脑的随机"+comGuessNum);
return comGuessNum;
}
/*
* 设置玩家猜拳的数字方法
* @param tomGuessNum
*/
public void setTomGuessNum(byte tomGuessNum)
{
if(tomGuessNum>2||tomGuessNum<0)
{
// 抛出一个异常 未处理
// throw new IllegalArgumentException("数字输入错误");
System.out.println("数字输入错误");
}
this.tomGuessNum = tomGuessNum;
}
public byte getTomGuessNum()
{
return tomGuessNum;
}
/**
* 比较猜拳定结果
* @return 玩家赢返回true,否则返回 false
*/
public String vsComString()
{
// 比较巧
if(tomGuessNum==0&&comGuessNum==1)
{
return "您赢了";
}
else if(tomGuessNum==1&&comGuessNum==2)
{
return "您赢了";
}
else if(tomGuessNum==2&&comGuessNum==0)
{
return "您赢了";
}
else if(tomGuessNum==comGuessNum)
{
return "平手";
}
else
{
return "您输了";
}
}
/*
* 记录玩家赢的次数
* @return
*/
public byte winCount(String s)
{
count++;
if(s.equals("您赢了"))
{
winCountNum++;
}
return winCountNum;
}
}
看效果:
达到预期