java servlet写的网页猜数小游戏

2023-05-16

几年前,用java servlet 写了个猜数的网页小游戏;今天看了觉得有点意思,贴出来怀旧一下:


1. 代码如下:

package cn.wzb;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class NumGame extends HttpServlet {

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        if (request.getSession().getAttribute("count") == null) {
            //request.getSession().setAttribute("realNum",(int)(Math.random()*10 + 1));
            request.getSession().setAttribute("realNum", (new Random()).nextInt(10) + 1);
            //游戏开始了,先初始一个随机数,只在第一次请求时产生。
            request.getSession().setAttribute("count", 0);
            //保存访问的次数。
        }

        showResult(request, response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        doPost(request, response);
    }

    private void showResult(HttpServletRequest request, HttpServletResponse response) throws IOException {

        int tag = 0;
        int realNum = 0;
        int clientNum = 0;
        int count = 0;
        if ((Integer) request.getSession().getAttribute("count") == 0) {
            count = (Integer) request.getSession().getAttribute("count");
            request.getSession().setAttribute("count", count + 1);
            //初次次访问。
            tag = -2;

        } else {
            try {
                count = (Integer) request.getSession().getAttribute("count");
                //本次为第count次访问。
                realNum = (Integer) request.getSession().getAttribute("realNum");
                //获取系统提供的随机数。
                clientNum = Integer.parseInt(request.getParameter("clientNum").trim());
                //获取客户端提供的数据。

                request.getSession().setAttribute(String.valueOf(count), clientNum);
                //保存客户端在第count次提交的数据,为成功时的列出做准备。
                request.getSession().setAttribute("count", count + 1);
                //下次访问做准备。
                tag = getTag(clientNum - realNum);
                //通过做差来获取,显示结果的标志tag.
            } catch (NumberFormatException e) {
                if (count == 1) {
                    tag = -2;//初次访问时,客户端提交了非法字符(不包括开始和结尾的空格)。
                } else {
                    tag = 2;      // 当不是初次访问时,客户端提交了非法字符(不包括开始和结尾的空格)。
                }
            } catch (Exception e) {
                 e.printStackTrace();
                if (count == 1) {
                    tag = -2;
                } else {
                    tag = 2;
                }
            }
        }

        response.setContentType("text/html;charset=gb2312");
        //设置显示页面的MIME和charset属性。
        PrintWriter out = response.getWriter();
        //获取输出流。



        out.println("<html");

        switch (tag) {
            case -2:  //初次访问时,提供的页面。
                out.println("<head><title>开始猜数游戏</title></head>");
                out.println("<body>");
                out.println("<center>游戏开始了</center>");
                out.println("<br>我们为您产生了一个1到10的整数:");
                out.println("<br>请你在下面输入你猜的数字:");
                out.println("<form action=beginNumGame method=post>");
                out.println("<br>输入你猜的数字:<input type=text name=clientNum>");
                out.println("<br><input type=submit value=提交该数>");
                out.println("<input type=reset value=清空>");
                out.println("</form>");
                out.println("</body>");

                break;


            case -1: //当客户端提交的数据较小时的页面。
                out.println("<head><title>你上次猜的数小了</title></head>");
                out.println("<center>你猜的数小了</center>");
                out.println("<br>你在第 " + count + "猜的数字:" + clientNum + " 小了");
                out.println("<br>请你在下面输入你再次猜的数字:");
                out.println("<form action=beginNumGame method=post>");
                out.println("<br>输入你猜的数字:<input type=text name=clientNum>");
                out.println("<br><input type=submit value=提交该数>");
                out.println("<input type=reset value=清空>");
                out.println("</form>");
                out.println("</body>");


                break;


            case 0: //当客户端提交了正确的数据时的页面。
                out.println("<head><title>你成功地猜对了了</title></head>");
                out.println("<body>");
                out.println("<center>你猜对了</center>");
                out.println("恭喜你,你在第 " + count + " 次猜对了,<br>你猜得结果是:" + clientNum);
                out.println("<br>下面是你猜的全过程:");
                for (int i = 1; i <= count; i++) {
                    out.println("<br>你在第 " + i + " 次猜的数字是:"
                            + ((Integer) request.getSession().getAttribute(String.valueOf(i))).intValue() + ".");
                }
                out.println("<br>注释:若所猜的数字是 0 ,则表示输入了非法数字。");

                request.getSession().removeAttribute("count");
                //为下次游戏的开始做准备,以实现初始一个新的随机数realNum。
                out.println("<p>你还想再进行一次游戏吗,可以点击下面的链接:");
                out.println("<br><a href=beginNumGame>开始游戏 </a>");
                //超链接辅助游戏的再次开始。
                out.println("<p>你猜对数字的的时间是:" + new Date());
                out.println("</body>");

                break;


            case 1: //客户端提交数据较大时,显示的页面。
                out.println("<head><title>你上次猜的数大了</title></head>");
                out.println("<center>你猜的数大了</center>");
                out.println("<br>你在第 " + count + " 次猜的数字:" + clientNum + " 大了");
                out.println("<br>请你在下面输入你再次猜的数字:");
                out.println("<form action=beginNumGame method=post>");
                out.println("<br>输入你猜的数字:<input type=text name=clientNum>");
                out.println("<br><input type=submit value=提交该数>");
                out.println("<input type=reset value=清空>");
                out.println("</form>");
                out.println("</body>");

                break;

            default: // 当客户端提交的数据中含有非法字符时,显示的页面。
                request.getSession().setAttribute(String.valueOf(count), 0);
                //为成功时的结果列表做准备。
                request.getSession().setAttribute("count", count + 1);
                //由于异常,还未为下次访问准备。在此完成。
                out.println("<head><title>你上次输入非法数据</title></head>");
                out.println("<center>你输入了非法字符</center>");
                out.println("<br>你在第 " + count + "输入了非法字符。");
                out.println("<br>请你在下面输入你再次猜的数字:");
                out.println("<form action=beginNumGame method=post>");
                out.println("<br>输入你猜的数字:<input type=text name=clientNum>");
                out.println("<br><input type=submit value=提交该数>");
                out.println("<input type=reset value=清空>");
                out.println("</form>");
                out.println("</body>");

            //break;


        }


        out.println("<html>");

        out.flush();
        out.close();

    }

    private int getTag(int d) { //获取switch中需要的tag标记。
        int tag = 0;
        if (d < 0) {
            tag = -1;
        }
        if (d == 0) {
            tag = 0;
        }
        if (d > 0) {
            tag = 1;
        }

        return tag;
    }

}



2. web.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  
  <servlet>
   <servlet-name>numGame</servlet-name>
   <servlet-class>cn.wzb.NumGame</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>numGame</servlet-name>
   <url-pattern>/beginNumGame</url-pattern>
  </servlet-mapping>
 
</web-app>

说明:java servlet文件编译后生成的NumGame.class文件将在tomcat 服务器的webapps\game\WEB-INF\classes\cn\wzb\NumGame.class;


web.xml文件在WEB-INF文件下。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java servlet写的网页猜数小游戏 的相关文章

  • c++——Unicode、UTF-8、UTF-16

    计算机起源于美国 xff0c 上个世纪 xff0c 他们对英语字符与二进制位之间的关系做了统一规定 xff0c 并制定了一套字符编码规则 xff0c 这套编码规则被称为ASCII编码 ASCII 编码一共定义了128个字符的编码规则 xff
  • spark MLlib之分类和回归

    MLlib支持多种方法用来处理二分分类 xff0c 多类分类以及回归分析 xff0c 下表列出了问题及对应的处理方法 xff1a 问题类型 支持的方法 二分分类 现行SVM xff0c 逻辑回归 xff0c 决策树 xff0c 贝叶斯 多类
  • 生产者消费者模型详解以及实现

    生产者消费者模式 我们先来看看什么是生产者消费者模式 xff0c 生产者消费者模式是程序设计中非常常见的一种设计模式 xff0c 被广泛运用在解耦 消息队列等场景 在现实世界中 xff0c 我们把生产商品的一方称为生产者 xff0c 把消费
  • 高频面试点:静态链接库与动态链接库

    库是写好的现有的 xff0c 成熟的 xff0c 可以复用的代码 现实中每个程序都要依赖很多基础的底层库 xff0c 不可能每个人的代码都从零开始 xff0c 因此库的存在意义非同寻常 本质上来说库是一种可执行代码的二进制形式 xff0c
  • cordova打包app热更新问题

    定义 xff1a 基于 cordova 框架能将web应用 js html css 图片等 打包成 App 当 App 在终端上安装后 xff0c 不需要重新下载app xff0c 实现内壳更新 原理 xff1a 1 在项目根目录的conf
  • 一文解决 Python读取文件的全部知识

    文件是无处不在的 xff0c 无论我们使用哪种编程语言 xff0c 处理文件对于每个程序员都是必不可少的 文件处理是一种用于创建文件 写入数据和从中读取数据的过程 xff0c Python 拥有丰富的用于处理不同文件类型的包 xff0c 从
  • 总结实验室对转录组及lncRNA数据分析的思路

    继师兄详细地讲述这个思路之后 xff0c 我进行一个归纳总结 xff08 师兄说 xff0c 首先要建立一个思想上的流程 xff0c 再来纠结软件 命令这些细节 xff01 xff01 xff01 xff01 xff01 xff01 xff
  • Android 高通7.1系统默认横屏显示(无G-sensor)

    竖屏横用 xff0c logo用的还是竖屏资源 1 添加宏控制 device qcom msm8909 system prop span class token comment add start span persist span cla
  • Android11 授权应用获取IMEI号和ICCID

    在Android11上获取IMEI号等设备信息需要android permission READ PRIVILEGED PHONE STATE权限 xff0c 而这个权限又只授予系统级应用 项目中如果targetSdkVersion值小于2
  • Enum枚举前后端传输展示方案

    1 定义枚举类型 public enum RolesTypeEnum implements Enumerator MANAGER 34 管理员 34 0 BUSINESS 34 招商员工 34 1 PROPERTY 34 物业员工 34 2
  • 蓝桥杯2018年第九届真题-递增三元组-题解(C语言代码)

    include lt bits stdc 43 43 h gt using namespace std const int MAXN 61 100005 int a MAXN b MAXN c MAXN int n sum int main
  • Altium Designer 推挤布线

    在进入交互式布线模式时按 TAB 键进入属性对话框 xff0c 在 Current Mode 参数项中选择Push Obstacles 模式 xff0c 然后点击 OK 退出设置这时将进入挤推布线模式 xff0c 它可以帮你自动移开遮挡的导
  • 范数及其意义

    什么是范数 xff1f 范数 Norm 是具有度量性质的函数 xff0c 它经常使用来衡量矢量函数的长度或大小 xff0c 是泛函分析中的一个基本概念 要更好的理解范数 xff0c 就要从函数 几何与矩阵的角度去理解 xff0c 我们都知道
  • cmd的炫酷玩法教程

    在我们看电影的时候 xff0c 经常看到黑客在电脑是一顿猛如虎的操作 然后电脑上就出现一系列花里胡哨的画面 xff0c 其实那种画面我们用cmd的一行代码就能搞定 第一步 按Win 43 R xff0c 输入cmd xff0c 打开小黑框
  • Java里面关于currentTimeMilllis()方法

    关于currentTimeMillis 方法的一些说明 很多的朋友在刚开始接触long这个数据类型的时候 xff0c 就会被引导去接触一个叫做currentTimeMillis 的方法 xff0c 看名字貌似很复杂的样子 xff0c 其实很
  • ubuntu安装nodejs的正确方式

    sudo apt get remove nodejs sudo apt get remove npm curl o https raw githubusercontent com nvm sh nvm v0 39 2 install sh
  • Android Studio 3.+ 使用gradle配置动态修改包名、图标、常量等,实现动态配置编译不同包名的APP和多渠道打包

    Android Studio 3 1 3 43 gradle 4 4 43 build gradle 3 1 3 示例代码已上传github https github com weixx gradle package 配置差别化渠道包 ap
  • 抽奖助手自动参与抽奖

    无码科技开发了一个抽奖的小程序 xff0c 里面有一些赞助商提供的抽奖 xff0c 但是每次都要一个一个的点才能参与 xff0c 很麻烦 参考了网上的一些教程 xff0c 写了一个脚本 xff0c 可以不用一个一个地点就可以参与抽奖 过程的
  • android——databinding中字符串的拼接处理、TextView显示的值随activity的属性值改变同时改变--LiveData、双向绑定过滤器、监听某个值的改变

    简介 使用的技术是观察者与被观察者的模式 xff0c 在google推荐的案例中也有使用到 xff0c 现在我把它封装成一个扩展函数 xff0c 使得使用更加简单明了 注意 1 在build gradle添加databinding xff0
  • LeetCode 547. 省份数量

    题目 有 n 个城市 xff0c 其中一些彼此相连 xff0c 另一些没有相连 如果城市 a 与城市 b 直接相连 xff0c 且城市 b 与城市 c 直接相连 xff0c 那么城市 a 与城市 c 间接相连 省份 是一组直接或间接相连的城

随机推荐

  • pycharm运行shift+f10停止ctrl+f2快捷键

    运行 shift 43 f10 停止 ctrl 43 f2
  • 嵌入式第一课

    GPIO实例应用 include 34 stm32f10x h 34 ifndef LED H define LED H void LED Init void endif include 34 led h 34 void LED Init
  • 范式通俗理解:1NF、2NF、3NF和BNCF

    范式通俗理解 xff1a 1NF 2NF 3NF和BNCF 准备知识超键 候选键 主键函数依赖部分依赖传递依赖 范式1NF2NF3NFBCNF 参考 准备知识 超键 候选键 主键 超键 超键 super key xff1a 在关系中能唯一标
  • 基于springboot的小区社区物业管理系统

    一 基于springboot的小区社区物业管理系统 此社区物业管理系统融合了大多数功能 xff0c 具有管理员和住户两种角色 管理系统可以使小区的管理水平有很大的提升 xff0c 使小区的管理更加方便便捷 社区管理员具有 xff0c 车位管
  • 基于springboot的电影推荐网站管理系统

    一 基于springboot的电影推荐网站管理系统 普通用户 浏览电影列表查看电影预告与详情查看收录的电影网站查看最新电影动态 管理员 管理电影预告与详情管理收录的电影网站管理最新电影动态管理网址信息管理友情链接 二 技术框架 这是一款基于
  • 代码优化-减少if else

    写在前面 不知大家有没遇到过像 横放着的金字塔 一样的 if else 嵌套 xff1a 我并没夸大其词 xff0c 我是真的遇到过了 xff01 嵌套 6 7 层 xff0c 一个函数几百行 xff0c 简 xff01 直 xff01 看
  • iapp裕v3语言浏览器教程

    如果你要写简单的浏览器的话 你可以这么做qwq 创建好应用后先添加浏览器 他的属性为 width span class token operator 61 span span class token operator span span c
  • VMOS-Pro一款虚拟机app。

    vmos分为两个版本 xff1a 安卓vmos 安卓vmospro 两个的差距在于界面 xff0c 可以说vmospro是重磅更新了 xff0c 让我们了解这一款虚拟机吧 xff01 首先这两款虚拟机都是安卓系统 xff0c 你要ios上红
  • UTM虚拟机-首款iOS虚拟机

    utm虚拟机 xff1b 非越狱安装方法 utm虚拟机是一款ipa为后缀的文件 xff0c 需要爱思助手安装 越狱安装方法 使用uncover越狱后在安装ipa文件 utm介绍 他跟bochs limbo qemo apq等app一样 xf
  • 所有小米机型 解BT+刷Magisk并ROOT+躲避应用ROOT环境检查教程

    废话章节 xff0c 可以不看 时隔一年又回来了 上一篇文章还是在2021年更新的 xff0c 因为学业问题我这是1年1更显然不行 xff0c 那我这次为啥不更新iApp了 xff1f 因为忘得差不多了 我也没想到我有一天回过头来看自己的文
  • 【Minecraft】【ModPC】【我的世界】 我的世界电脑版如何进入网络游戏?

    我的世界电脑版如何进入网络游戏 xff1f 须知 看看就好 xff0c 不要频繁使用modpc xff0c 破坏游戏玩家体验 xff01 不知道为什么Win11会用着用着就会闪退 降级到Win10就什么事也没有 下载 ModPC下载 包含普
  • WindwosServer系统一些设置【网卡驱动修复】【安装UWP应用】【服务器管理取消开机自启动】

    WindwosServer系统一些设置 这里以2022为例 xff1a 第一 网卡驱动丢失修复 此教程只针对I219 V LM网卡 xff01 小知识 xff1a 当电脑没网时 xff0c 将手机和电脑用USB数据线连接 打开设置 xff1
  • dp最长不上升子序列 二分upper lower+贪心

    题意 找出最长不上升子序列长度 再找出最长不下降子序列最大长度 写法运用了指针 减少了代码量 include lt iostream gt include lt algorithm gt using namespace std const
  • 小米平板5ProWIFI(elish)刷ArrowOS

    文章目录 警告下载奇兔刷机系统本体及Recovery 清除数据刷入AospRec开始刷入警告 完成设置输入法 变砖头了qwq又是警告 芝士截图Root方法结尾 警告 此文章只针对 小米平板5Pro Wifi版本 xff08 elish xf
  • 【宝塔】【Windows】【Blessing-Skin】【我的世界】用宝塔Windows搭建皮肤站

    文章目录 前言所需环境相关链接安装宝塔安装步骤访问宝塔同意协议 安装环境安装WNMP添加站点 开始安装皮肤站配置网站配置Nginx URL重写规则 xff08 即 伪静态 xff09 配置PHP 安装皮肤站 一些小调整安装插件常见问题 插件
  • ping的详细过程学习笔记

    pc1 ping pc2 也就是pc1 xff1a 192 168 1 1 ping pc2 xff1a 192 168 1 2 属于同一网段的ping过程 步骤1 ping开始 即后台运行192 168 1 1 ping 192 168
  • FTPClient上传文件内容为空/损坏/缺失

    项目场景 xff1a 项目场景 xff1a 本地项目联调OA系统的时候 xff0c 在发送审批时会传送相关附件 xff0c 该附件由本地项目上传至FTP xff0c OA系统会根据我们提供的路径和文件名去FTP中找到该文件 问题描述 xff
  • Debian9桌面设置

    本文由荒原之梦原创 xff0c 原文链接 xff1a http zhaokaifeng com p 61 665 新安装的Debian9桌面上啥都没有 xff0c 就像这样 xff1a 图 1 虽然很简洁 xff0c 但是用着不是很方便 x
  • 爬虫遇到Cloudflare问题

    网址 xff1a https opensea io rankings sortBy 61 seven day volume 返回代码 xff1a 403 遇到的问题 xff1a Access denied api opensea io us
  • java servlet写的网页猜数小游戏

    几年前 xff0c 用java servlet 写了个猜数的网页小游戏 xff1b 今天看了觉得有点意思 xff0c 贴出来怀旧一下 xff1a 1 代码如下 xff1a package cn wzb import java io impo