关闭

java servlet写的网页猜数小游戏

标签: servletjavaintegerinput游戏action
1042人阅读 评论(0) 收藏 举报
分类:

几年前,用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文件下。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:702372次
    • 积分:9954
    • 等级:
    • 排名:第1796名
    • 原创:203篇
    • 转载:304篇
    • 译文:44篇
    • 评论:62条
    文章分类
    最新评论