答案 石头剪刀布 编码过程 0912
效果
下载 脑图
https://cloud.189.cn/t/VJzu6jRvQ7Rb
01根据脑图创建类
需要有的类
- 玩家,player
- 电脑,computer
- 裁判,referee
创建类
三个类
一个测试文件
编写玩家类的属性与方法
玩家类
public class Player {
// 名字
String name;
// 得分
int score;
/**
* 出拳方法
*/
public void punches() {
System.out.println("玩家出了一个拳");
}
}
测试一下
public class test {
public static void main(String[] args) {
// 测试开始
// 玩家对象
Player zs = new Player();
zs.punches();
}
}
结果
玩家出了一个拳
编写计算机类的属性与方法
代码与玩家类的代码差不太多,所以直接复制
public class Computer {
// 名字
String name;
// 得分
int score;
/**
* 出拳方法
*/
public void punches() {
System.out.println("计算机出了一个拳");
}
}
测试
public class test {
public static void main(String[] args) {
// 测试开始
// 玩家对象
Player zs = new Player();
zs.punches();
// 计算机对象
Computer pc = new Computer();
pc.punches();
}
}
结果
玩家出了一个拳
计算机出了一个拳
裁判类
定义
public class Referee {
/**
* 开始游戏
* 用途:控制游戏流程
*/
public void start() {
System.out.println("让游戏开始吧");
}
}
测试
public class test {
public static void main(String[] args) {
// 测试开始
// 玩家对象
Player zs = new Player();
zs.punches();
// 计算机对象
Computer pc = new Computer();
pc.punches();
// caipan对象
Referee cp = new Referee();
cp.start();
}
}
结果
玩家出了一个拳
计算机出了一个拳
让游戏开始吧
源码 01
https://cloud.189.cn/t/7VRnyaMvMvAj
视频 01
https://www.ixigua.com/6871813006473298440?logTag=1kWy5BjWbX2BTRb5vH5d2
02 实现裁判的开始方法
脑图
清除测试类中的杂乱代码
只保留裁判断的实例化与开始方法的调用
测试能否正常输出结果
在start方法中编写执行过程
先写占位代码
/**
* 裁判类
*/
public class Referee {
/**
* 开始游戏
* 用途:控制游戏流程
*/
public void start() {
// 初始化选手
System.out.println("玩家对象登场");
System.out.println("电脑对象登场");
// 获取出拳
System.out.println("玩家出拳");
System.out.println("电脑出拳");
// 计数器变化
System.out.println("计数器变化");
// 胜负判断
System.out.println("胜负判断");
// 是否要继续
System.out.println("要继续吗?");
}
}
效果
玩家对象登场
电脑对象登场
玩家出拳
电脑出拳
计数器变化
胜负判断
要继续吗?
视频 02
https://www.ixigua.com/6871834964221133326?logTag=DP0I_im3_7KDCTTaWt3OD
03 实现玩家与电脑的出拳-玩家
玩家出拳
/**
* 出拳方法
*/
public String punches() {
System.out.println("请出拳:1-剪刀,2-石头,3-布(输入相应数字):");
String quan = ipt.next();
System.out.println("你出拳" + quan);
return quan;
}
玩家通过键盘输入,出拳
quan变量接收键盘的输入
字符串类型
return 这个录入的结果
测试一下
可以正常的收到数据
然而需求为
输入2,提示出石头
所以还缺一个数字转字符串的打印操作
考虑使用分支语句可以完成
视频 03
04 实现玩家与电脑的出拳-电脑
电脑的出拳办法
电脑利用随机数出拳
随机出1 2 3 三个数据
先写一个随机小功能
测测能否实现1 2 3 的数据生成
在电脑出拳方法中生成一个数
public int punches() {
Random random = new Random();
int randNum = random.nextInt(3) + 1;
return randNum;
}
修正一下玩家出拳的数据类型
电脑出的是整数
玩家出的是字符串
应该统一数据类型
所以把,玩家出拳的返回值变成整数返回
视频 04
https://www.ixigua.com/6871846165554725390?logTag=-GFlBc25qOnbCxvX8jHd3
05 数字转字符串
思考,这里如何进行输出?
如果出拳是2,就输出石头, 如果出拳是1,就输出剪刀
可以考虑:
多路分支
简单粗暴的写法
// 需要,把1转换成剪刀,2转换成石头,3转换成布进行输出
// 使用一个粗旷的方法来实现
// 玩家出拳的转换
if (player1Quan == 1) {
System.out.println("你出拳:剪刀");
} else if (player1Quan == 2) {
System.out.println("你出拳:石头");
} else if (player1Quan == 3) {
System.out.println("你出拳:布");
}
// 电脑出拳的转换
if (computer1Quan == 1) {
System.out.println("电脑出拳:剪刀");
} else if (computer1Quan == 2) {
System.out.println("电脑出拳:石头");
} else if (computer1Quan == 3) {
System.out.println("电脑出拳:布");
}
System.out.println("虽然功能实现了,但是代码太罗嗦了,可以优化");
视频 05
https://www.ixigua.com/6871849136673522183?logTag=Zf5bwygPjJUJlZ8W5p4cS
06 胜负判断
利用分支进行三种情况的处理
- 平局情况
- 胜利情况
- 其它就是失败情况
视频 06
https://www.ixigua.com/6871853339307409927?logTag=m7mTVIFUSjvOZ85QnXhoK
07 游戏循环起来
一局游戏后,问询是否下一局
如果用户输入y,就继续游戏
do{反复的游戏}while(键盘输入是否是y);
视频 07
https://www.ixigua.com/6871856414227169799?logTag=fBvij9VaaSASNdbjoKzKj
08 调整显示
- 计数器变化
- 玩家固定名字
- 选择电脑姓名
- 在出拳前显示 玩家vs电脑
- do…while循环转while循环
- 计分处理
代码
import java.util.Scanner;
/**
* 裁判类
*/
public class Referee {
/**
* 开始游戏
* 用途:控制游戏流程
*/
public void start() {
// scanner
Scanner ipt = new Scanner(System.in);
// 初始化选手
Player player1 = new Player();
// 玩家名字默认为王子
player1.name = "王子";
// 初始化电脑
Computer computer1 = new Computer();
// 给电脑起名字
System.out.println("请选择对方角色(1 刘备,2 孙权,3 曹操)");
int nameNum = ipt.nextInt();
String computer1Name = "";
switch (nameNum) {
case 1:
computer1Name = "刘备";
break;
case 2:
computer1Name = "孙权";
break;
case 3:
computer1Name = "曹操";
break;
}
computer1.name = computer1Name;
// scanner对象
// 是否继续
String is_continue;
// 计数器
int counter = 0;
// 宣布对战
System.out.println(player1.name + " VS " + computer1.name + " 对战");
// 游戏循环:出拳,评判,是否再玩,再出拳,再评判,再问是否玩,do...while
// do...while 转while....
// 是否要继续
System.out.println("要继续吗?y-继续");
is_continue = ipt.next();
while ("y".equals(is_continue)) {
// 获取出拳,需要有返回值,用于提供裁判进行比较
int player1Quan = player1.punches();
int computer1Quan = computer1.punches();
// 需要,把1转换成剪刀,2转换成石头,3转换成布进行输出
// 使用一个粗旷的方法来实现
// 玩家出拳的转换
if (player1Quan == 1) {
System.out.println("你出拳:剪刀");
} else if (player1Quan == 2) {
System.out.println("你出拳:石头");
} else if (player1Quan == 3) {
System.out.println("你出拳:布");
}
// 电脑出拳的转换
if (computer1Quan == 1) {
System.out.println("电脑出拳:剪刀");
} else if (computer1Quan == 2) {
System.out.println("电脑出拳:石头");
} else if (computer1Quan == 3) {
System.out.println("电脑出拳:布");
}
// 计数器变化
counter++;
// 胜负判断
if (computer1Quan == player1Quan) {
// 平局情况
System.out.println("天哪,平局了");
} else if (player1Quan == 2 && computer1Quan == 1 || player1Quan == 1 && computer1Quan == 3 || player1Quan == 3 && computer1Quan == 2) {
// 胜利情况
System.out.println("玩家胜利,电脑失败");
player1.score += 1;
} else {
// 失败情况
System.out.println("电脑胜利,玩家失败");
computer1.score += 1;
}
// 是否要继续
System.out.println("要继续吗?y-继续");
is_continue = ipt.next();
// 换行
System.out.println();
System.out.println();
}
;
System.out.println("一共比赛的次数:" + counter);
System.out.println("玩家得分:" + player1.score);
System.out.println("电脑得分:" + computer1.score);
}
}
视频 08
https://www.ixigua.com/6871861896690172424?logTag=0CaNWCd2OZz_j0uU9iiSk
源文件 08
https://cloud.189.cn/t/iYfI3iyQzi63
说明
此法并不是最优的写法
为了便于理解,拆的很细
当编码流程理解透后
可以有更好的写法出来
小结
本项目主要演练如何让一个复杂的项目充实起来
看见这么麻烦的一个项目,脑头有可能会很大
不过要学会,先分析,再拆解,再填空,这样的思路
再难的东西,都可以分而治之
编码过程中有遇到过结构设计错误的情况
例如应该用while循环的结构,结果用了do…while…结构
但是并不影响
我们只需要把那附近的代码进行一个调整即可