Java面向对象开发剪刀石头布游戏
- 介绍
- 需求分析
- 面向对象
- 准备工作
- 功能实现
- 系统工具类
- main方法
- 完成功能
- 注意事项
介绍
今天作业的需求是利用Java的 面向对象来完成石头剪刀布这个小游戏。
既然是利用面向对象的方式,那么一定会用到接口、类、与 包 的概念。
没有基础的小伙伴们可以在CSDN 以及 百度搜索引擎了解
需求分析
角色
- 用户
- 系统
用户则负责出拳 、 出拳采用Scanner的 next()方法控制
系统则通过Java的随机(Random)类来写随机算法出拳
面向对象
要了解以下相关知识点
- 类
- 包
- 接口
没有面向对象基础的可以提前预习一下
准备工作
- Game(接口)
定义接口: Game
方法定义: onStart() 、onOver()、onResult()
上代码
package cn.marinda.controll;
import cn.marinda.data.SystemData;
import cn.marinda.data.UserData;
public interface Game {
/** Game游戏接口
*
*
*/
/** 开始游戏的接口 方法
*
*/
public void onStart();
/** 结束游戏的接口 方法
*
*/
public void onOver();
/** 游戏结果的接口 方法
*
* @param userData
* @param systemData
* @return
*/
public boolean onResult(UserData userData,SystemData systemData);
}
- SystemData & UserData
定义类: SystemData & UserData
定义属性: String Plans(出拳)
上代码
package cn.marinda.data;
public class SystemData {
private String plans = "";
public SystemData(String plans)
{
this.plans = plans;
}
public SystemData()
{
}
public void setPlans(String plans){
this.plans = plans;
}
public String getPlans(){
return plans;
}
}
&
package cn.marinda.data;
public class UserData {
private String plans = "";
public UserData(String plans)
{
this.plans = plans;
}
public UserData()
{
}
public void setPlans(String plans){
this.plans = plans;
}
public String getPlans(){
return plans;
}
}
到这里我们的准备工作完成了
功能实现
- 定义一个GameHandle 类来实现 Game接口并实现相关方法
package cn.marinda.handle;
import cn.marinda.controll.Game;
import cn.marinda.data.SystemData;
import cn.marinda.data.UserData;
import cn.marinda.mannager.GameDataMannager;
import cn.marinda.utils.SystemUtils;
import javafx.application.Application;
import java.util.Scanner;
public class GameHandle implements Game {
public GameHandle()
{
}
/**
* 开始游戏的接口 方法
*
*/
@Override
public void onStart() {
while(true){
System.out.println("欢迎游玩 石头剪刀布 游戏");
Scanner sc = new Scanner(System.in);
System.out.println("请出拳:");
String nextPlans = sc.next();
GameDataMannager dm = GameDataMannager.instance;
UserData userDatas = dm.getUserData(nextPlans);
String systemPlans = SystemUtils.onRandomResult();
SystemData systemDatas = dm.getSystemData(systemPlans);
System.out.println("系统出拳是:" +systemPlans);
onResult(userDatas, systemDatas);
System.out.println("按Q退出其他键继续!");
String str = sc.next();
if(SystemUtils.isExit(str)){
onOver();
}else{
continue;
}
}
}
/**
* 结束游戏的接口 方法
*
*/
@Override
public void onOver() {
System.out.println("退出游戏成功!");
System.exit(0);
}
/**
* 游戏结果的接口 方法
*
* @param userData
* @param systemData
* @return
*/
@Override
public boolean onResult(UserData userData, SystemData systemData) {
SystemUtils.endResult(userData.getPlans(),systemData.getPlans());
return true;
}
}
- 定义一个游戏数据管理类 (GameMannager)
package cn.marinda.mannager;
import cn.marinda.data.SystemData;
import cn.marinda.data.UserData;
public class GameDataMannager {
/** GameData 游戏数据管理器
*
*/
public static GameDataMannager instance = new GameDataMannager();
public GameDataMannager()
{
}
public SystemData getSystemData()
{
return new SystemData();
}
public SystemData getSystemData(String plans)
{
return new SystemData(plans);
}
public UserData getUserData()
{
return new UserData();
}
public UserData getUserData(String plans)
{
return new UserData(plans);
}
}
系统工具类
主要实现相关 游戏逻辑 以及 猜拳机制 算法和结算
定义一个 SystemUtils 类
package cn.marinda.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class SystemUtils {
/** SystemUtils
* 主要负责随机算法以及胜负判断
*
*
*/
public static String onRandomResult()
{
Random random = new Random();
int numx = random.nextInt(3);
String plans = setPlans(numx);
return plans;
}
/** 设置 返回字符串
*
*
* @param num
* @return
*/
public static String setPlans(int num){
switch (num){
case 0:
return "石头";
case 1:
return "布";
case 2:
return "剪刀";
}
return null;
}
/** 游戏计算结果
*
* @param userPlans
* @param systemPlans
*/
public static void endResult(String userPlans,String systemPlans)
{
int wins = 0;
switch (userPlans){
case "石头":
wins = isWin(systemPlans);
if(wins == 1){
System.out.println("你输了!再接再厉");
}else if(wins == 2){
System.out.println("你赢了!很棒!");
}else if(wins == 0){
System.out.println("这局平!");
}
break;
case "剪刀":
wins = isWin(systemPlans);
if(wins == 1){
System.out.println("你赢了!很棒!");
}else if(wins == 2){
System.out.println("这局平!");
}else if(wins == 0){
System.out.println("你输了!再接再厉");
}
break;
case "布":
wins = isWin(systemPlans);
if(wins == 1){
System.out.println("这局平!");
}else if(wins == 2){
System.out.println("你输了!再接再厉");
}else if(wins == 0){
System.out.println("你赢了!很棒!");
}
break;
}
}
/** 根据字符串返回数字进行比较
*
* @param systemPlans
* @return
*/
public static int isWin(String systemPlans){
//0 -> 石头
if(systemPlans.equalsIgnoreCase("石头")){
return 0;
}
else if(systemPlans.equalsIgnoreCase("剪刀"))
{
return 2;
}
else if(systemPlans.equalsIgnoreCase("布")){
return 1;
}
return -1;
}
public static boolean isExit(String exitStr)
{
if(exitStr.equalsIgnoreCase("q")){
return true;
}
return false;
}
}
main方法
package cn.marinda;
import cn.marinda.handle.GameHandle;
public class Application {
public static void main(String[] args) {
application();
}
private static void application()
{
GameHandle handle = new GameHandle();
handle.onStart();
}
}
完成功能
注意事项
了解面向对象相关知识、熟练掌握 接口定义使用 以及相关实现类
关于一直强调的 面向对象知识
- 可以看其他博主文章以及自行百度
- 对发布的内容有疑问的欢迎评论指出
- 感谢观看