【设计模式】简易俄罗斯转盘实现JAVA

news2024/11/26 9:19:15

大家好哇,我是梦辛工作室的灵,最近有些无聊,没得什么事情做,所以想再熟悉熟悉设计模式吧,然后就写了个俄罗斯转盘玩,还是老样子先看结果:
在这里插入图片描述
看上去还是不错的吧,最后那个只是打印,不会真的删除,别被吓到了,哈哈哈,下面直接 上代码
TestPlayGame

public class TestPlayGame {
    public static void main(String[] args) {
        PlayGameFactory.createPlayGame().start();
    }
}

PlayGame

package com.mx.deathtrun;

import java.util.HashMap;
import java.util.Map;

public class PlayGame {

    public static Printer printer = new Printer();  //打印器

    private TurnTable turnTable;    //转盘

    Map<String,Handler> handlerMap = new HashMap<>();   //处理器

    public PlayGame(TurnTable turnTable){
        this.turnTable = turnTable;
    }

    public TurnTable getTurnTable() {
        return turnTable;
    }

    public int getHoleSize(){
        return turnTable.getHoleSize();
    }

    /**
     * 添加处理器
     * @param handler
     */
    public void addHandler(Handler handler){
        handlerMap.put(handler.getName(),handler);
    }

    public void hand(String name){
        Handler handler = handlerMap.get(name);
        if(handler == null){
            printer.print("错误的处理器=============>");
            return;
        }
        handler.hand();
    }

    public void start(){
        hand("start");
    }

    public void print(String message){
        printer.print(message);
    }

}

PlayGameFactory

package com.mx.deathtrun;

import java.util.Scanner;

public class PlayGameFactory {

    static Scanner scanner = new Scanner(System.in);

    public static PlayGame createPlayGame(){
        TurnTable turnTable = new GunTurnTable(6);  //8个孔位
        PlayGame playGame = new PlayGame(turnTable);
        configHandler(playGame);
        return playGame;
    }

    private static void configHandler(PlayGame playGame) {
        playGame.addHandler(new Handler() {
            @Override
            public void hand() {
                playGame.print("欢迎来到德莱联盟==========>");
                playGame.hand("menu");
            }

            @Override
            public String getName() {
                return "start";
            }
        });

        playGame.addHandler(new Handler() {
            @Override
            public void hand() {
                playGame.print("来玩一把俄罗斯转盘吧==========>");

                int number = 0;

                while (number <= 0 || number > 6 ){
                    playGame.print("你要上几颗子弹==========>");
                    try {
                        String next = scanner.next();
                        number = Integer.parseInt(next);
                        break;
                    }catch (Exception exception){
                        number = 0;
                    }
                    playGame.print("子弹数量仅能为1-6,蠢货=====>");
                }

                playGame.getTurnTable().clear();
                playGame.getTurnTable().loadBullet(number);
                playGame.getTurnTable().random();

                playGame.hand("play");
            }

            @Override
            public String getName() {
                return "menu";
            }
        });

        playGame.addHandler(new Handler() {
            @Override
            public void hand() {
                playGame.print("有意思============>");
                int who = -1;// 0 - 电脑 1 - 玩家
                while (who != 0 && who != 1 ){
                    playGame.print("那么谁先来,我还是你?=========>");
                    try {
                        String next = scanner.next();
                        if(next.indexOf("我") >= 0){
                            who = 1;
                            playGame.print("勇气可嘉,那你来吧=====>");
                        } else if(next.indexOf("你") >= 0){
                            who = 0;
                            playGame.print("真是懦夫,看我的=====>");
                        }
                        break;
                    }catch (Exception exception){
                        who = -1;
                    }
                    playGame.print("你没有指明谁先来,懦夫=====>");
                }
                if (who == 0){
                    playGame.hand("computer_shoot");
                } else  if (who == 1){
                    playGame.hand("user_shoot");
                }
            }

            @Override
            public String getName() {
                return "play";
            }
        });

        playGame.addHandler(new Handler() {
            @Override
            public void hand() {
                playGame.print("该我了============>");
                if (playGame.getTurnTable().shoot()){
                    playGame.print("============>砰");
                    playGame.print("真倒霉,啊,我挂了====>");
                    playGame.hand("menu");
                } else {
                    playGame.print("============>咔");
                    playGame.print("我真帅======>");
                    playGame.print("该你了,懦夫======>");
                    playGame.hand("user_shoot");
                }
            }

            @Override
            public String getName() {
                return "computer_shoot";
            }
        });

        playGame.addHandler(new Handler() {
            @Override
            public void hand() {
                playGame.print("任意值开枪========>");
                String next = scanner.next();
                if (playGame.getTurnTable().shoot()){
                    playGame.print("============>砰");
                    playGame.print("You Are Died====>");
                    playGame.print("送你个惊喜");
                    playGame.print("rm -rf * ==============================================>");
                } else {
                    playGame.print("============>咔");
                    playGame.print("运气还不错嘛,小伙子============>");
                    playGame.hand("computer_shoot");
                }
            }

            @Override
            public String getName() {
                return  "user_shoot";
            }
        });

    }
}

GunTurnTable

package com.mx.deathtrun;

import javax.crypto.Mac;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class GunTurnTable implements TurnTable{

    List<TurnHole> turnTable;   //转孔集合
    int curIndex = 0;      //当前游标

    public  GunTurnTable(int number){
        turnTable = new ArrayList<>();
        curIndex = 0;
        for (int i = 0; i < number; i++) {
            turnTable.add(new GunTurnHole());
        }
    }

    /**
     * 射击
     * @return
     */
    @Override
    public boolean shoot() {
        curIndex++;
        if(Math.random() > 0.55 && Math.random() < 0.57){
            PlayGame.printer.print("孔位" + curIndex + " 射击=========>");
            PlayGame.printer.print("卡壳");
            curIndex--;
            return false;
        }
        if(curIndex >= turnTable.size()){
            curIndex = 0;
        }
        PlayGame.printer.print("孔位" + curIndex + " 射击=========>");
        return turnTable.get(curIndex).shoot();
    }

    /**
     * 旋转转盘 实际随机游标
     * @return
     */
    @Override
    public boolean random() {
        curIndex = (int)Math.ceil(Math.random() * turnTable.size());
        PlayGame.printer.print("轮盘旋转==========>");
        return true;
    }

    /**
     * 装子弹
     * @param number 数量
     * @return
     */
    @Override
    public boolean loadBullet(int number) {
        for (int i = 0; i < number; i++) {
            curIndex++;
            if(curIndex >= turnTable.size()){
                curIndex = 0;
            }
            turnTable.get(curIndex).loadBullet();
            PlayGame.printer.print("孔位" + curIndex + " 上子弹======>");
        }
        return true;
    }

    /**
     * 随机装子弹
     * @param number 子弹数量 不一定实际装单数
     * @param prec 百分比先随机
     * @return
     */
    @Override
    public boolean loadBulletRandom(int number,int prec) {
        for (int i = 0; i < number; i++) {
            if(curIndex >= turnTable.size()){
                curIndex = 0;
            }
            if(Math.random() <= prec * 0.01f){
                turnTable.get(curIndex).loadBullet();
                PlayGame.printer.print("孔位" + curIndex + " 上子弹======>");
            }
        }
        return true;
    }

    /**
     * 所有孔位下子弹
     * @return
     */
    @Override
    public boolean clear() {
        int index = 0;
        for (TurnHole turnHole : turnTable) {
            if(turnHole.isBullet()){
                turnHole.clear();
                PlayGame.printer.print("孔位" + index + " 下子弹======>");
            }

            index++;
        }
        return true;
    }

    @Override
    public int getHoleSize() {
        if(turnTable == null){
           return 0;
        }
        return turnTable.size();
    }
}

GunTurnHole

package com.mx.deathtrun;

/**
 * 转孔 孔里面有无子弹
 */
public class GunTurnHole implements TurnHole{
    boolean bullet = false; //是否有子弹
    TurnHole turnHole = null;   //下一个孔位

    /**
     * 装弹
     * @return
     */
    @Override
    public boolean loadBullet() {
        if(!bullet){
            bullet = true;
            return true;
        }
        return false;
    }
    @Override
    public boolean isBullet() {
        return bullet;
    }

    /**
     * 射击
     * @return
     */
    @Override
    public boolean shoot() {
        if(bullet){
            bullet = false;
            return true;
        }
        return false;
    }

    /**
     * 下一个孔位
     * @param turnHole
     */
    @Override
    public void setNext(TurnHole turnHole) {
        this.turnHole = turnHole;
    }

    /**
     * 返回下一个孔位
     * @return
     */
    @Override
    public TurnHole next() {
        return this.turnHole;
    }

    /**
     * 清子弹
     * @return
     */
    @Override
    public boolean clear() {
        bullet = false;
        return true;
    }
}

Handler

package com.mx.deathtrun;

public interface Handler {
    void hand();
    String getName();
}

TurnHole

package com.mx.deathtrun;

public interface TurnHole {
    boolean loadBullet();
    boolean shoot();
    void setNext(TurnHole turnHole);
    TurnHole next();
    boolean clear();
    boolean isBullet();
}
package com.mx.deathtrun;

/**
 * 转盘
 */
public interface TurnTable {
    boolean shoot();
    boolean random();
    boolean loadBullet(int number);
    boolean loadBulletRandom(int number,int prec);
    boolean clear();
    int getHoleSize();
}

Printer

package com.mx.deathtrun;

public class Printer {
    public void print(String message)  {
        String[] split = message.split("");
        for (String s : split) {
            System.out.print(s);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {

            }
        }
        System.out.println("");
    }
}

收,今天的分享就到这里了,又水了一天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模 插值算法

有问题 牛顿差值也有问题它们都有龙格现象&#xff0c;一般用分段插值。 插值预测要比灰色关联预测更加准确&#xff0c;灰色预测只有2次 拟合样本点要非常多&#xff0c;样本点少差值合适

Qt 桌面系统设计

文章目录 前言一、项目介绍二、界面布局三、按键图标四、桌面背景五、实现led功能总结 前言 这篇文章介绍 一个Qt 桌面系统的项目&#xff0c;大家可以在此基础上加以改进&#xff0c;实现更多的功能。 一、项目介绍 可以看到 这个桌面系统上分为两部分&#xff0c;左边是 三个…

在Linux上 USRP RIO 2944 使用 PCIe

支持的硬件 USRP-2900USRP-2901USRP-2920USRP-2921USRP-2922USRP-2930USRP-2932USRP-2940 40 MHzUSRP-2940 120 MHzUSRP-2942 40 MHzUSRP-2942 120 MHzUSRP-2943 40 MHzUSRP-2943 120 MHzUSRP-2944USRP-2945USRP-2950 40 MHzUSRP-2950 120 MHzUSRP-2952 40 MHzUSRP-2952 120 MH…

【Unity面试篇】Unity 面试题总结甄选 |算法相关 | ❤️持续更新❤️

前言 之前整理了一篇关于Unity面试题相关的所有知识点&#xff1a;2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全&#xff0c;面试题总结【全网最全&#xff0c;收藏一篇足够面试】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整…

山西电力市场日前价格预测【2023-07-14】

日前价格预测 预测明日&#xff08;2023-07-14&#xff09;山西电力市场全天平均日前电价为315.29元/MWh。其中&#xff0c;最高日前价格为386.08元/MWh&#xff0c;预计出现在21: 45。最低日前电价为232.93元/MWh&#xff0c;预计出现在14: 45。 价差方向预测 1&#xff1a;实…

利用windows恶意软件获取windows主机shell

实验目的&#xff1a; 模拟黑客利用windows恶意软件获取windows主机shell权限的过程 熟悉操作使用的命令实验准备&#xff1a; kali 同网段的windows主机&#xff08;关闭防火墙&#xff09; msfvenom是一个Metasploit独立的有效负载生成器&#xff0c;也是msfpayload和msfenco…

【大数据之Hive】二十二、HQL语法优化之Join优化

主要控制优化使用哪种join算法。 1 Common Join Common Join是Hive中最稳定的join算法也是默认的join算法&#xff0c;其通过一个MapReduce Job完成一个join操作。Map端负责读取join操作所需表的数据&#xff0c;并按照关联字段进行分区&#xff0c;通过Shuffle&#xff0c;将…

【动手学深度学习】--01.线性回归

文章目录 线性回归1.原理1.1线性模型1.2衡量预估质量——平方损失1.3训练数据1.4参数学习1.5优化算法 2.从零开始实现线性回归2.1生成数据集2.2批量读取数据集——Mini-batch思想2.3初始化模型参数2.4定义模型2.5定义损失函数2.6定义优化算法2.7训练模型 3.借助深度学习框架实现…

关于nginx学习记录(一)

系列文章目录 第一章 Nginx 学习入门——Nginx的概述及安装 系列文章目录 一、Nginx 概述 二、安装步骤 1.下载pcre安装包,并放入linux中,进行解压: 2.pcre解压完成后,进入解压后的文件,执行./configure命令 3.在当前目录执行命令:make && make install 4.由于到…

【并发编程的艺术读书笔记】创建线程的四种方式

创建线程的四种方式 继承Thread类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("MyThread...run...");}public static void main(String[] args) {// 创建MyThread对象MyThread t1 new MyThread() ;MyThread t2 new M…

神经网络模型在深度学习中的作用

神经网络模型是一种模拟人脑神经元之间连接和相互作用的数学模型。它由多个神经元&#xff08;节点&#xff09;以层次结构相互连接而成&#xff0c;每个神经元通过学习权重和偏置&#xff0c;根据输入数据产生相应的输出。 在深度学习中&#xff0c;神经网络模型被广泛应用于…

基于ZYNQ阵列涡流检测系统硬件设计(一)

为实现阵列涡流检测系统总体功能&#xff0c;需研制一套多通道信号采集硬件系统&#xff0c;以搭配 软件编程实现分时激励和分时采集。基于以上要求&#xff0c;本章介绍了阵列涡流检测系统的硬 件模块设计。 3.1 阵列涡流检测系统总体设计 阵列涡流检测系统需要利用 DA …

PADS Logic元件库创建的管脚如何快速复制

在绘制原器件封装的时候&#xff0c;如果对管脚一个一个去进行放置会影响效率&#xff0c;因此可以通过对管脚进行复制来实现快速放置管脚。 第一步&#xff1a;在元件界面点击添加端点图标&#xff0c;先进行一个管脚的放置&#xff0c;如图1所示 图1 放置管脚示意图 第二步&…

2.Vue3中Cesium地图初始化及地图控件配置

前言 本文中&#xff0c;我们主要介绍 Cesium 在 Vue 3运行环境的配置&#xff0c;以及 Cesium 实例中控件的显隐设置&#xff0c;本文是后续文章内容的基础&#xff0c;项目代码在此查看&#xff1b;通过本文&#xff0c;我们可以得到一个纯净的 cesium 项目&#xff0c;后续的…

ptrace修改进程数据

ptrace可以修改和读取一个进程的数据 long ptrace(enum __ptrace_request request,pid_t pid,void *addr,void *data); PTRACE_TRACEME, 本进程被其父进程所跟踪。其父进程应该希望跟踪子进程 PTRACE_PEEKTEXT, 从内存地址中读取一个字节&#xff0c;内存地址由addr给出 PT…

基于docker搭建gitea私服仓库,并开启https访问、ssh访问和邮箱验证通知功能

系列文章目录 git常用命令大锦囊 文章目录 系列文章目录前言一、gitea安装1. 安装docker compose2. 安装gitea 二、给gitea配置https访问三、gitea配置ssh方式拉取代码四、给gitea配置可发送的邮箱五、gitea注册开启邮箱验证和邮箱通知六、限制所有仓库只有登录后才能访问七、…

Windows git bash输入vim报错,不能使用vim-plug插件管理器

Windows系统下的git bash在安装时自带了默认的vim&#xff0c;我自己也下了个gvim&#xff0c;并且配置了.vimrc&#xff0c;其中使用了vim-plug管理nerdtree这些插件。但是在bash中vim <file>时&#xff0c;就会蹦出来几行报错&#xff1a; 处理 /c/Users/<username…

pyqt 实现计算器

1.由designer设计实现的计算器类 文件名为&#xff1a;untitled.py # -*- coding: utf-8 -*-# Form implementation generated from reading ui file untitled.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will b…

浅谈无线温度监控系统在低功耗开关柜中的应用

安科瑞 华楠 摘要&#xff1a;为了能够实现实时监测高压开关柜的温度状况&#xff0c;提出一种基于无线传感器网络的开关柜温度在线监测系统。设计的无线温度在线监测系统不仅解决了开关柜内高温、高压、强电磁感应等在恶劣环境下不易检测的问题&#xff0c;而且从硬件选择和软…

谷粒商城篇章4 ---- P102-P172【分布式高级篇一】

目录 1. Elasticsearch 1.1 基本概念 1.1.1 Index&#xff08;索引&#xff09; 1.1.2 Type&#xff08;类型&#xff09; 1.1.3 Document&#xff08;文档&#xff09; 1.1.4 倒排索引机制 1.2 Docker安装 ES 1.2.1 下载镜像文件 1.2.2 运行 Elasticsearch 1.3 初步…