猜拳程序被广泛作为例题和练手材料应用于各个编程语言学习,他主要学习的是一个循环判断,那么今天我们延伸一下,猜拳问题通过类的封装实现。
我们首先要确定的是猜拳的玩家应该是两个人,或者一个人一个电脑,也就是说要去分别存储两个重复类型的数据集合,那么就明确了应该定义一个玩家类,(如果是C语言的话应该是自定义一个结构体),我们创建的类应该是要有着姓名,分数这两个私有属性,以及游戏次数这个公共属性,所以修饰词分别是private,private和static public。这个类应该有一个展示用户分数的方法,得到下面代码
gameplayer.java:
package StartGame;
public class gameplayer {
private String name;
private int score = 0;
static public int gametimes;
public gameplayer() {
}
public gameplayer(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void scoreUP() {
score++;
}
public void show() {
System.out.println("player:" + name);
System.out.println("score:" + score);
System.out.println("times:" + gametimes);
}
}
之后就是确定游戏的主体方法,首先要满足对输入的判断,通过scannr类的hasNextInt方法判断输入的是不是一个整数,如果不是那么我们要进行重新输入,这里就要用到循环,同时hasNextInt只是判断而不是取走缓冲区的内容,所以这个时候你的输入其实还在缓冲区,你需要做一个存取处理,读走取出的数据,我们在INT方法中将上述完成
public int INT() {
boolean flag = false;
double sca = -1.0;
String skr;
while (!flag) {
flag = ob.hasNextInt();
if (flag) {
sca = ob.nextInt();
return (int) sca;
} else {
skr = ob.next();
System.out.println("您输入的是一个错误的字符串" + skr);
System.out.println("请重新输入整数:");
}
}
return -1;
}
然后创建一个规范输入函数,这个函数能够检测你的输入是不是一个符合要求的输入,参数是相应的输入变量和上下限,这里要注意和上面INT区分的原因是避免方法内代码冗杂,不便修改。
public boolean rel(int n, int a, int b) {
if (n >= a && n <= b) {
return true;
} else {
return false;
}
}
规范了输入后开始构思猜拳游戏主体,首先是信息要保存到玩家对象,因此game的构造方法首先参数是两个gameplayer对象,然后是对游戏有一个开关选项,实现玩家对战或者人机对战,实际上也就是if判断,人机对战功能通过随机数实现(因为并不是多复杂的游戏,如果是围棋游戏之类,算法就很复杂了)
下面是完整的game方法和启动方法
package StartGame;
import java.util.Scanner;
public class game {
Scanner ob = new Scanner(System.in);
gameplayer p1;
gameplayer p2;
private int cho;
public game(gameplayer p1, gameplayer p2) {
this.p1 = p1;
this.p2 = p2;
}
public void getPlayer() {
System.out.println("请输入是否为玩家对战或者人机对战:1.玩家队长 ,2.人机大战");
cho = INT();
while (!rel(cho, 1, 2)) {
System.out.println("请输入1或者2!");
cho = INT();
}
System.out.println("请输入玩家1姓名:");
String player1 = ob.next();
p1.setName(player1);
if (cho == 1) {
System.out.println("请输入玩家2姓名:");
String player2 = ob.next();
p2.setName(player2);
} else {
p2.setName("工具人阿尔法");
}
}
public void gaming() {
boolean flag = true;
getPlayer();
int ga1;
while (flag) {
gameplayer.gametimes++;
System.out.println(p1.getName() + "请输入数字代替:1.剪刀 2.石头 3.布");
ga1 = INT();
while (!rel(ga1, 1, 3)) {
System.out.println("输入数不在范围,重新输入:");
ga1 = INT();
}
int ga2;
if (cho == 1) {
System.out.println(p2.getName() + "请输入数字代替:1.剪刀 2.石头 3.布");
ga2 = INT();
while (!rel(ga2, 1, 3)) {
System.out.println("输入数不在范围,重新输入:");
ga2 = INT();
}
} else {
ga2 = (int) (Math.random() * 3 + 1);
}
if (ga1 == 1 && ga2 == 3) {
System.out.println(p1.getName() + "获胜");
p1.scoreUP();
} else if (ga1 == 3 && ga2 == 1) {
System.out.println(p2.getName() + "获胜");
p2.scoreUP();
} else if (ga2 > ga1) {
System.out.println(p2.getName() + "获胜");
p2.scoreUP();
} else if (ga1 == ga2) {
System.out.println("平局重新选择!");
continue;
} else {
System.out.println(p1.getName() + "获胜");
p1.scoreUP();
}
System.out.println("是否继续游戏y/n:");
String BUTTON = ob.next();
if ("n".equals(BUTTON)) {
flag = false;
}
}
}
public boolean rel(int n, int a, int b) {
if (n >= a && n <= b) {
return true;
} else {
return false;
}
}
public int INT() {
boolean flag = false;
double sca = -1.0;
String skr;
while (!flag) {
flag = ob.hasNextInt();
if (flag) {
sca = ob.nextInt();
return (int) sca;
} else {
skr = ob.next();
System.out.println("您输入的是一个错误的字符串" + skr);
System.out.println("请重新输入整数:");
}
}
return -1;
}
}
package StartGame;
public class play {
public static void main(String[] args) {
gameplayer p1 = new gameplayer();
gameplayer p2 = new gameplayer();
game ga = new game(p1, p2);
ga.gaming();
p1.show();
p2.show();
}
}
那么又到了每次发布的马后炮时间(我也不想每次快发布完才发现还要改啊.....)上面的这个游戏中,玩家对战是可以看到前一位玩家的输入值的,实际上在玩家1输入结束,玩家2输入之前加入清屏就能解决.emmmmmm,反正没人看感觉无所谓啦