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