

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
先把游戏规则和需求理清楚,避免做一半返工
做项目最怕“想到哪写到哪”,先把游戏逻辑掰碎了说:
所谓“百万富翁猜数字”,核心规则其实就3条——系统随机出1-100的数字,玩家猜,每次猜完给“大了/小了”的提示,根据猜的次数算奖金(比如1次猜对得100万,2次50万,递减到10次及以上得1万)。再往细了拆,还得考虑这些需求:
这些需求对应到技术上,其实就是用Session存游戏状态(随机数、已猜次数)、用Servlet处理逻辑(接收输入、比较数字、算奖金)、JSP负责显示页面(输入框、提示信息、奖金)——这刚好符合JSP推荐的MVC模式(Oracle官方文档里明确说过,JSP适合做“视图”,逻辑交给Servlet更清晰)。
从0到1写代码,每一步都讲清楚
接下来进入实战环节,我用IDEA+Tomcat8.5做演示,你用Eclipse也一样,核心逻辑不变。
第一步别嫌麻烦——先把基础环境弄好,否则后面写代码全是坑。
web
目录下新建一个index.jsp
,写一句“Hello JSP!”,然后启动Tomcat(点右上角的绿色三角),访问http://localhost:8080/MillionaireGame/index.jsp
,能看到这句话就说明环境没问题。 我当初学的时候,第一次启动Tomcat总报“端口被占用”,后来发现是电脑里的QQ音乐占了8080端口,关掉重开就好了——你要是遇到类似问题,可以去Tomcat的conf/server.xml
里改端口(比如把8080改成8081)。
前端不用搞太复杂,能用、直观就行。我写的页面结构大概是这样:
直接上代码(存为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
(后面要写的处理逻辑的类),method
用post
(比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)。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com