游侠网云服务,免实名免备案服务器 游侠云域名,免实名免备案域名

统一声明:

1.本站联系方式
QQ:709466365
TG:@UXWNET
官方TG频道:@UXW_NET
如果有其他人通过本站链接联系您导致被骗,本站一律不负责!

2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET
3.免实名域名注册购买- 游侠云域名
4.免实名国外服务器购买- 游侠网云服务
JSP实现百万富翁猜数字游戏|详细教程+附完整可运行源码

先把游戏规则和需求理清楚,避免做一半返工

做项目最怕“想到哪写到哪”,先把游戏逻辑掰碎了说:

所谓“百万富翁猜数字”,核心规则其实就3条——系统随机出1-100的数字,玩家猜,每次猜完给“大了/小了”的提示,根据猜的次数算奖金(比如1次猜对得100万,2次50万,递减到10次及以上得1万)。再往细了拆,还得考虑这些需求:

  • 状态要保存:玩家第一次猜完,第二次再猜时,系统得记得之前的随机数和已猜次数——总不能刷新页面就“重置”,那玩家根本没法玩(我学弟之前就踩了这坑,没加Session,结果每次点按钮都生成新数字,差点崩了);
  • 交互要友好:用户输入字母或符号时,得提示“请输有效数字”,不能直接报错;
  • 有重置功能:玩家想重新玩,点个按钮就能清空状态,不用关浏览器。
  • 这些需求对应到技术上,其实就是用Session存游戏状态(随机数、已猜次数)、用Servlet处理逻辑(接收输入、比较数字、算奖金)、JSP负责显示页面(输入框、提示信息、奖金)——这刚好符合JSP推荐的MVC模式(Oracle官方文档里明确说过,JSP适合做“视图”,逻辑交给Servlet更清晰)。

    从0到1写代码,每一步都讲清楚

    接下来进入实战环节,我用IDEA+Tomcat8.5做演示,你用Eclipse也一样,核心逻辑不变。

  • 先搭环境,确保项目能跑通
  • 第一步别嫌麻烦——先把基础环境弄好,否则后面写代码全是坑。

  • 新建项目:打开IDEA,选“Java Enterprise”,勾选“Web Application”,下一步填项目名(比如“MillionaireGame”),然后配置Tomcat路径(要选你电脑里装的版本,比如8.5.93);
  • 验证环境:项目建好后,在web目录下新建一个index.jsp,写一句“Hello JSP!”,然后启动Tomcat(点右上角的绿色三角),访问http://localhost:8080/MillionaireGame/index.jsp,能看到这句话就说明环境没问题。
  • 我当初学的时候,第一次启动Tomcat总报“端口被占用”,后来发现是电脑里的QQ音乐占了8080端口,关掉重开就好了——你要是遇到类似问题,可以去Tomcat的conf/server.xml里改端口(比如把8080改成8081)。

  • 写前端页面,让游戏有“交互感”
  • 前端不用搞太复杂,能用、直观就行。我写的页面结构大概是这样:

  • 一个输入框(让用户输1-100的数字);
  • 两个按钮(“猜一下”提交输入,“重新开始”重置游戏);
  • 两个提示区域(红色显示“大了/小了”,绿色显示当前奖金)。
  • 直接上代码(存为guess.jsp,放web目录下):

    
    
    百万富翁猜数字
    
    

    .container { width: 600px; margin: 50px auto; }

    .input-area { margin-bottom: 20px; }

    input { padding: 8px; font-size: 16px; }

    button { padding: 8px 15px; background: #4285F4; color: white; border: none; cursor: pointer; }

    .tip { color: red; font-size: 18px; margin: 10px 0; }

    .prize { color: green; font-size: 20px; font-weight: bold; }

    百万富翁猜数字游戏

    ${tip}
    当前奖金:${prize}元

    这里有两个小细节要注意:

  • 表单的action指向GuessServlet(后面要写的处理逻辑的类),methodpost(比get更安全,不会把输入的数字显示在URL里);
  • “重新开始”按钮用了location.reload(),直接刷新页面清空Session——虽然简单,但足够用(如果想更优雅,可以写个Servlet清空Session,不过新手先这么来)。
  • 写Servlet处理核心逻辑,把“猜数字”变真
  • 前端只是“壳子”,真正的大脑是Servlet。先新建一个GuessServlet类(放在src下的com.example.game包,包名随便取,但最好规范点),继承HttpServlet,重写doPost方法——所有逻辑都在这里:

    第一步,先解决状态保存的问题:用Session存随机数和已猜次数。代码里要先获取Session,如果没有就创建:

    HttpSession session = request.getSession();
    

    // 从Session拿随机数,没有就生成一个1-100的数字

    Integer targetNumber = (Integer) session.getAttribute("targetNumber");

    if (targetNumber == null) {

    targetNumber = (int) (Math.random() * 100) + 1;

    session.setAttribute("targetNumber", targetNumber);

    }

    // 从Session拿已猜次数,初始是0

    Integer guessCount = (Integer) session.getAttribute("guessCount");

    if (guessCount == null) {

    guessCount = 0;

    }

    第二步,处理用户输入:要先把前端传的字符串转成整数,还得捕获异常(比如用户输入“abc”):

    String numberStr = request.getParameter("number");
    

    int userNumber;

    try {

    userNumber = Integer.parseInt(numberStr);

    } catch (NumberFormatException e) {

    request.setAttribute("tip", "请输入1-100的有效数字!");

    request.getRequestDispatcher("guess.jsp").forward(request, response);

    return;

    }

    第三步,比较数字,算奖金:这里我定了个简单的奖金规则(你也可以自己改),用数组存对应次数的奖金,比如:

    // 奖金规则:第1次100万,第2次50万,…第10次1万,10次以上1万
    

    int[] prizes = {1000000, 500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000};

    String tip = "";

    int prize = 0;

    // 比较用户输入和目标数字

    if (userNumber == targetNumber) {

    guessCount++; // 猜对了也要算一次次数

    // 根据次数拿奖金(次数超过10次,按第10次算)

    if (guessCount

  • 1 < prizes.length) {
  • prize = prizes[guessCount

  • 1];
  • } else {

    prize = prizes[prizes.length

  • 1];
  • }

    tip = "恭喜你猜对了!用了" + guessCount + "次,获得奖金" + prize + "元!";

    // 猜对后清空Session,准备下一轮

    session.removeAttribute("targetNumber");

    session.removeAttribute("guessCount");

    } else if (userNumber > targetNumber) {

    tip = "你猜大了!再试试~";

    guessCount++;

    } else {

    tip = "你猜小了!再试试~";

    guessCount++;

    }

    第四步,把结果传回JSP:用request.setAttribute存提示信息和奖金,再转发回guess.jsp显示:

    request.setAttribute("tip", tip);
    

    request.setAttribute("prize", prize);

    // 把更新后的次数存回Session

    session.setAttribute("guessCount", guessCount);

    // 转发回JSP页面

    request.getRequestDispatcher("guess.jsp").forward(request, response);

    别忘了在web.xml里配置Servlet(或者用注解,新手先学xml配置更清楚):

    
    

    GuessServlet

    com.example.game.GuessServlet

    GuessServlet

    /GuessServlet <!-

  • 和前端form的action对应 >
  • 测试!解决那些“新手必踩”的bug
  • 写好代码先别急着开心,测试才能发现问题。启动Tomcat,访问http://localhost:8080/MillionaireGame/guess.jsp,试试这几个场景:

  • 输入“abc”:应该提示“请输有效数字”;
  • 输入“101”:可以加个判断,提示“数字要在1-100之间哦”(我代码里没写,你可以自己加,比如if (userNumber 100) { tip = "数字要在1-100之间!"; });
  • 连续猜:比如目标数字是50,输入60提示“大了”,输入40提示“小了”,输入50提示“猜对了”——奖金显示100万(如果第一次就中)。
  • 我之前测试时遇到过中文乱码的问题——提示信息变成“???大了”,后来在doPost开头加了两句话就解决了:

    request.setCharacterEncoding("UTF-8"); // 处理请求的中文乱码
    

    response.setContentType("text/html;charset=UTF-8"); // 处理响应的中文乱码

    附:百万富翁猜数字游戏奖金规则表

    为了让你更清楚,我把奖金规则做成了表格——你可以直接复制到代码里改:

    猜测次数 对应奖金(元)
    1次 1000000
    2次 500000
    3次 200000
    4次 100000
    5次 50000
    6-10次 依次递减到1000
    10次以上 1000

    最后:源码拿好,直接跑!

    我把完整代码打包放在了GitHub(地址:https://github.com/yourname/MillionaireGame,替换成你自己的仓库),里面包括:

  • 完整的项目结构;
  • 已经配置好的Tomcat;
  • 解决了中文乱码、Session过期的问题。
  • 你下载下来后,用IDEA打开,直接启动Tomcat就能玩——如果遇到问题,比如“找不到Servlet”,先检查web.xml里的servlet-class路径对不对(比如包名是com.example.game,那路径就是com.example.game.GuessServlet);如果“随机数老变”,看看Session是不是没加对。

    其实做JSP项目没那么难,关键是把逻辑拆细,每一步都测试。我学弟跟着这套方法做,上周已经把作业交了,还拿了满分——你要是按这个步骤试了,欢迎回来告诉我效果!要是遇到bug,直接留言,我帮你捋捋。


    你肯定遇到过这种情况——输入数字猜错了,页面本该显示“你猜大了”或者“你猜小了”,结果出来一堆“???大了”,看着就闹心,明明代码里写的是中文,怎么就变成问号了?其实这压根不是你代码逻辑有问题,就是中文编码没配置对——Servlet默认处理请求用的是ISO-8859-1编码,这玩意儿根本不认识中文,你写的“大了”“小了”到它那儿就成了乱码,页面自然显示问号。

    我教你个最快的解决办法,直接在Servlet的doPost方法最开头加两行代码就行。第一行是request.setCharacterEncoding("UTF-8"),这行是告诉Servlet:“你接收用户输入的时候,得用UTF-8编码,别再用默认的老编码了”;第二行是response.setContentType("text/html;charset=UTF-8"),这行是说:“你给页面返回提示信息的时候,也得用UTF-8编码,不然页面根本读不懂你传的中文”。我之前帮朋友调过这个问题,他一开始把这两行加在处理逻辑后面,结果还是乱码,后来我让他挪到最前面,刷新页面立马就好了——记住,这两行必须放在doPost方法的最开头,要是放晚了,前面的输入已经用错编码了,肯定还是解决不了。

    还有个小细节得提醒你:要是你用的是Tomcat 8及以上版本,其实请求的默认编码已经是UTF-8了,但保险起见还是加上第一行——毕竟有些老项目可能还在用Tomcat 7,或者配置文件里改了默认编码,加了肯定没错。 JSP页面本身的编码也得检查一下,顶部的这句可别漏了,要是JSP页面自己编码不对,就算Servlet传对了,页面还是显示不了中文。我之前就遇到过一次,Servlet加了编码,结果JSP页面没写charset,最后还是乱码,折腾了半小时才找到问题。


    为什么启动Tomcat后访问页面提示“404错误”?

    404通常是路径错误或项目未正确部署导致的。先检查访问地址是否正确(比如项目名是MillionaireGame,地址应为http://localhost:8080/MillionaireGame/guess.jsp);再确认Tomcat配置里的“Deployment”是否添加了当前项目;最后检查guess.jsp是否放在web目录下(不是WEB-INF里)。

    为什么刷新页面后,之前的随机数和猜的次数会重置?

    这是因为没有用Session保存状态。需要在Servlet中通过request.getSession()获取Session对象,将随机数(targetNumber)和已猜次数(guessCount)存入Session(比如session.setAttribute("targetNumber", targetNumber))。这样即使刷新页面,Session中的数据也不会丢失。

    想调整奖金规则(比如1次猜对得50万,2次25万),需要修改哪里?

    直接修改Servlet中的奖金规则数组即可。代码里有一个prizes数组(比如int[] prizes = {1000000, 500000,...}),数组下标对应猜测次数(第1次对应下标0,第2次对应下标1),把数组里的数值改成你想要的奖金金额就行。

    为什么输入中文提示时出现乱码(比如“???大了”)?

    这是中文编码没配置好。需要在Servlet的doPost方法开头添加两行代码:request.setCharacterEncoding("UTF-8")(处理请求的中文乱码)、response.setContentType("text/html;charset=UTF-8")(处理响应的中文乱码),确保请求和响应都用UTF-8编码。

    点击“重新开始”按钮后,游戏没重置怎么办?

    首先检查按钮的onclick事件是否正确:按钮要加onclick="location.reload()"(刷新页面),同时要确保Servlet在猜对后会清空Session(比如session.removeAttribute("targetNumber"))。如果还是没反应,可能是浏览器缓存了页面,试试强制刷新(Ctrl+F5)。