Java面向对象开发剪刀石头布游戏

  • 介绍
  • 需求分析
  • 面向对象
  • 准备工作
  • 功能实现
  • 系统工具类
  • main方法
  • 完成功能
  • 注意事项


介绍

今天作业的需求是利用Java的 面向对象来完成石头剪刀布这个小游戏。

既然是利用面向对象的方式,那么一定会用到接口、与 的概念。
没有基础的小伙伴们可以在CSDN 以及 百度搜索引擎了解

需求分析

角色

  • 用户
  • 系统

用户则负责出拳 、 出拳采用Scannernext()方法控制
系统则通过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;
    }
}

到这里我们的准备工作完成了

功能实现

  1. 定义一个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;
    }

}
  1. 定义一个游戏数据管理类 (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();
    }
}

完成功能

注意事项

了解面向对象相关知识、熟练掌握 接口定义使用 以及相关实现类

关于一直强调的 面向对象知识

  • 可以看其他博主文章以及自行百度
  • 对发布的内容有疑问的欢迎评论指出
  • 感谢观看