20233225 2025-2026-2 《Python程序设计》实验4报告
2025-2026-2《Python程序设计》实验四报告
课程:《Python程序设计》
班级:2442
姓名:曹熙卓
学号:20233225
实验教师:王志强
实验日期:2026年5月26日
必修/选修:专选课
一、实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
评分标准:
(1)程序能运行,功能丰富(至少5个功能)。(需求提交源代码,并建议录制程序运行的视频)15分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。20分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。10分
二、实验过程
(1)程序选择与介绍
在本学期的课程学习中,我在老师的教学指导与自己的学习积累过程中逐步掌握了Python基础语法、分支循环结构、常用数据结构、函数封装、面向对象编程、Tkinter图形界面开发以及异常处理等相关知识。结合课程给出的可选实践方向,我最终选择桌面交互类小游戏作为本次综合实践的开发内容,一方面是我的兴趣使然,一方面可以充分联系本课程所学相关知识点,另一方面可以借助游戏剧情设计,做出带有普法警示意义的模拟项目。
本次我开发的是一款基于Tkinter的模拟德州扑克赌场的戒毒警示小游戏,整个项目代码700余行,其中所有文本内容、批注添加修改、游戏规则设计、交互逻辑完善、分支剧情实现、异常容错处理、差错搜寻检验、额外功能思考等均由自己独立设计完成,而游戏窗口功能、界面美化布局、初步运行实现、相关功能增加、数据统计调用等则由自己与大模型辅助设计并编码实现,我使用PyCharm完成代码编写、调试、bug修复等全部开发工作。项目没有采用现成的游戏框架,完全依托Python标准库实现,能够很好地检验自己一学期以来的代码编写、逻辑设计以及问题排查能力。
(2)游戏玩法介绍
1.基础操作说明
①程序启动后会自动弹出游戏主窗口,窗口内会先输出游戏背景介绍、玩法说明、所有可输入指令的详细规则,玩家可以按照提示输入对应数字指令,完成开局或者退出操作。
②单局对局一共分为四个阶段,分别是底牌阶段、翻牌阶段、转牌阶段、河牌阶段,不同阶段开放的可执行操作存在区别,程序会自动限制非法操作指令。
③底牌阶段仅支持下注、跟注、弃牌三类操作;进入翻牌阶段之后,玩家可以新增选择过牌操作,在不下注的情况下将行动权交给庄家。
④玩家每次下注时需要手动输入具体下注金额,当输入金额超出当前自身剩余筹码时,程序会弹出借款交互提示,玩家可以选择借钱继续参与对局,也可以直接弃牌结束本局。
⑤单局对局结束之后,程序会自动展示本局牌型对比、筹码盈亏明细、当前剩余总筹码、累计欠款、有效对局次数等统计数据,玩家可以选择继续开启下一局,也可以选择结束游玩触发离场剧情。
⑥若玩家选择结束游玩,程序会根据玩家当前的筹码盈亏、负债情况、对局次数触发不同轮次不同内容的差异化庄家挽留对话,多次拒绝挽留之后会进入最终选择界面。
⑦在最终选择界面,玩家可以输入数字选择重置游戏或者直接关闭程序,选择确认后会启动5秒倒计时,倒计时结束后自动执行对应操作。
2.游戏设计目标
本项目并非单纯的休闲小游戏,核心设计目的是模拟现实中线下赌场的诱导套路,让玩家在模拟下注、盈利、亏损、借钱负债的过程中,直观感受到赌博行为存在的巨大风险,认清“十赌九输”的客观现实,最终树立远离赌博、拒绝网络借贷的意识。玩家初始拥有100万虚拟本金,在多轮对局的博弈过程中,会逐步体会庄家通过概率设置、话术诱导等方式蚕食玩家本金的全过程。
3.游戏整体规则
①基础德州扑克规则:程序内置完整的52张扑克牌,包含4种花色与13个牌面点数,每一局开始前都会自动打乱牌组,分别为玩家、庄家发放两张私密底牌,后续依次发放3张翻牌、1张转牌、1张河牌公共牌,玩家与庄家需要从7张手牌中选出最优5张完成牌型组合(本次实验该组合过程由程序自动判定最优解,不需要玩家额外操作)。
②牌型判定规则:按照德州扑克官方牌型大小顺序,从高到低依次为皇家同花顺、同花顺、四条、葫芦、同花、顺子、三条、两对、一对、高牌,程序会自动对双方手牌进行解析,计算牌型权重完成胜负判定。
③模拟赌场出千规则:在胜率设计方面除了最开始的额外规则,当玩家下注在10万以下时,庄家胜率为60%;当玩家下注在10万到30万时,庄家胜率为75%;当玩家下注在50万以下时,庄家胜率为90%;而当玩家下注在50万以上时,庄家胜率则必定为100%。
④诱导上瘾规则:在玩家刚开始玩的前两局,只要本局累计下注在10万以下,庄家会让玩家的胜率为100%,以此诱惑玩家继续。而如果玩家一开始累计下注金额就在十万以上,则按照庄家出千规则运行。如果玩家一开始拿到牌就没有下注,而是弃牌,那么本局没有输赢,不计入程序设计的10万以下前两局必胜的计数。除此之外,只要玩家不是负债或者全部亏损状态,在玩家离开时庄家都会挽留三次,三次的话术都不一样但都是按照好言哄骗-激将嘲讽-冷言威胁的套路来。
⑤下注规则:每一局会设置固定最低下注额度,玩家输入的下注金额不能低于该数值,同时程序会对输入内容做格式校验,非数字、负数、超出自身筹码的非法输入都会被拦截并重新提示输入。
⑥借贷规则:当玩家筹码不足以支撑当前下注操作时,弹出借款提示框,玩家可以输入指定金额向庄家借款,所有借款会累计计入总欠款,而玩家看不到自己累计借了多少庄家也不会主动告知,当累计欠款达到50万时,庄家会在该局对局完成后强制终止之后玩家的所有对局,要求玩家结清债务,不再提供继续游玩的机会。
⑦剧情分支差异文本规则:玩家选择离场时,程序会自动判断当前游玩数据,分为未开局、小额盈利、大额亏损、全部亏损、已经负债五种场景,每一种场景都会生成对应的不同轮次的挽留话术,其中未开局、小额盈利、大额亏损会挽留玩家三次,全部亏损会挽留一次,而负债则直接翻脸逼迫玩家还钱,还原现实中赌场人员诱导玩家继续投入资金的常见话术。而除了庄家话术的不同,玩家的选项文本描述也不同,还原不同情况下玩家不同的心理想法。并且结局结算文本也不同,程序将统计玩家的资金状况生成最终盈利或亏损多少甚至还有负债多少的不同文本,并且会根据玩家的未开局、小额盈利、大额亏损、已经负债四种场景模拟警方生成不同的普法警示文本。
⑧倒计时关闭或重开规则:玩家在体验一次后可以选择再来或者退出,在确认最终操作之后,会在固定单行位置实现5秒倒计时数字原地刷新,倒计时结束之后根据玩家选项,要么清空所有游戏数据恢复初始状态,要么直接销毁程序窗口完成退出。当然玩家随时可以直接关闭窗口结束运行。
4.全项目细分功能拆分
在写完上述游戏整体规则后,我发现本次程序中涵盖的许多设计的功能都没有提到,我觉得有些可惜,因此再增加该部分详细叙述我自主设计与借助大模型学到的所有内容(有点过于详细了,非常非常不建议细看,写出来只是我在梳理代码逐行理解代码运行规则的时候把这些都总结到了,不写出来可惜,本来打算放之后的实验过程里但这样要的截图太多了,因此在这里写出来,说实话我自己写写都不想写了,主要沉没成本在累加,咬了咬牙写完了):
①GUI图形界面相关功能
Ⅰ.主窗口初始化功能:设置程序窗口标题、固定窗口大小、禁止窗口随意缩放,配置窗口背景主题颜色,搭建赌场风格深色界面。
Ⅱ.彩色滚动日志文本框功能:创建带滚动条的文本展示组件,自定义十余种文字样式标签,不同场景下的提示文字、对话文字、警示文字、结算文字使用差异化颜色展示。
Ⅲ.底部交互输入布局功能:创建单行输入框、发送按钮,设置按钮大小、文字样式,绑定鼠标点击发送事件。
Ⅳ.回车快捷提交功能:监听键盘回车按键,按下回车键可直接提交输入内容,不用每次点击发送按钮,优化玩家交互体验。
Ⅴ.窗口内容自动滚动功能:每次新增文字输出后,文本框自动滚动到最新内容位置,方便玩家实时查看最新对局消息。
②通用工具封装功能
Ⅰ.窗口格式化打印封装函数:统一管理所有文字输出操作,支持指定文字内容、文字颜色标签,自动换行并刷新界面,避免重复编写界面输出代码。
Ⅱ.阻塞式交互输入封装函数:从消息队列中依次读取玩家输入内容,程序暂停运行等待玩家指令输入,保证对局流程按照顺序推进。
Ⅲ.消息队列存储功能:将玩家每次提交的输入内容存入队列,实现界面异步交互,避免Tkinter主线程阻塞导致窗口卡顿。
Ⅳ.输入内容合法性校验工具:对玩家所有数字指令、金额输入做格式校验,捕获非数字输入异常,循环提示玩家重新输入合规内容。
Ⅴ.倒计时单行原地刷新工具:锁定固定文本行坐标,每次循环完整清空当前行内容,在同一位置刷新倒计时数字,避免文字堆叠、内容残留。
③扑克牌基础处理功能
Ⅰ.完整扑克牌生成功能:遍历花色列表、点数列表,批量生成52张扑克牌数据,每张牌存储花色、原始点数、牌面字符。
Ⅱ.扑克牌随机洗牌功能:调用随机打乱方法,每一局对局开始前随机打乱牌组,保证每一次发牌结果具备随机性。
Ⅲ.牌面字符转数值功能:将J、Q、K、A这类特殊牌面转换为对应的数字数值,方便后续顺子、同花等牌型的统计判断。
Ⅳ.手牌组合筛选功能:从玩家7张手牌中遍历所有5张牌组合,筛选出权重最高的一组手牌作为最终比对牌型。
④牌型自动判定功能
Ⅰ.同花牌型识别功能:统计手牌所有花色,判断是否存在五张及以上相同花色的手牌。
Ⅱ.顺子牌型识别功能:对所有手牌点数去重、排序,遍历连续数字区间,判断是否存在连续五张的顺子组合。
Ⅲ.对子类牌型统计功能:统计各个点数出现的次数,依次识别四条、葫芦、三条、两对、一对牌型。
Ⅳ.牌型权重赋值功能:为十种不同牌型设置固定权重数值,同种牌型下再根据最大牌点数细化权重,用于玩家与庄家手牌的大小比对。
Ⅴ.胜负自动结算功能:比对双方手牌权重,自动判定本局对局的胜利方,计算底池归属,更新玩家当前筹码数据。
⑤单局对局流程功能
Ⅰ.游戏初始化重置功能:每一局开始前重置本局底池、玩家当前阶段操作状态,重新洗牌并发放玩家、庄家两张私密底牌。
Ⅱ.底牌阶段交互功能:限制玩家仅能执行下注、跟注、弃牌操作,校验下注金额合法性,更新底池数值。
Ⅲ.翻牌公共牌发放功能:随机从剩余牌组中抽取三张公共牌展示在界面,开放过牌操作权限。
Ⅳ.转牌公共牌发放功能:继续抽取一张公共牌展示,再次开启一轮下注交互流程。
Ⅴ.河牌公共牌发放功能:抽取最后一张公共牌,完成所有手牌发放,进入最终摊牌结算环节。
Ⅵ.弃牌对局终止功能:玩家选择弃牌后,直接终止当前所有对局流程,扣除已经投入的筹码,触发庄家安慰类对话。
Ⅶ.对局数据统计功能:对局正常结算之后,有效对局次数自增,记录本局盈利或亏损金额,实时更新并展示玩家所有财务数据。
⑥筹码借贷相关功能
Ⅰ.筹码余额校验功能:玩家每次提交下注金额后,自动比对当前剩余筹码,判断是否需要触发借款流程。
Ⅱ.借款弹窗交互功能:在日志窗口输出借款提示,限定玩家仅能输入1或者0两个指令,选择借钱或者放弃本局。
Ⅲ.借款金额校验功能:玩家输入借款金额后,校验数值是否为正数、是否超出合理区间,非法数值循环重新输入。
Ⅳ.玩家筹码更新功能:借款成功之后,将借款金额叠加至玩家当前可用筹码,同时累加至全局总欠款变量。
Ⅶ.负债阈值判断功能:每次借款完成后检测总欠款数值,当欠款达到50万时,触发债务强制剧情,锁定所有开局操作。
⑦多分支剧情交互功能
Ⅰ.未开局场景挽留剧情:玩家第一次还未参与任何对局就选择离场,通过多轮激将、氛围类话术挽留玩家尝试开局。
Ⅱ.盈利场景挽留剧情:玩家对局之后处于盈利状态,劝说玩家乘胜追击,继续下注扩大收益,多次引导玩家继续游玩。
Ⅲ.亏损场景挽留剧情:玩家本金出现亏损时,以回本翻本为核心话术,劝说玩家借钱继续参与对局,弥补之前的损失。
Ⅳ.负债场景风险剧情:玩家已经产生大额欠款之后,先诱导玩家继续下注还债,多次拒绝之后展示赌博负债相关警示文案。
Ⅴ.游玩数据汇总展示功能:玩家确定离场之后,自动汇总初始本金、当前剩余筹码、总盈亏、累计欠款、有效对局次数,在界面格式化展示。
⑧游戏重置与退出功能
Ⅰ.全量数据重置功能:清空窗口所有历史日志内容,将玩家本金、总欠款、对局次数全部恢复为初始数值,还原程序刚启动时的初始界面。
Ⅱ.程序窗口销毁功能:倒计时结束后直接关闭Tkinter主窗口,终止程序所有进程,完成程序退出。
Ⅲ.最终操作倒计时提示功能:根据玩家选择的操作类型,输出对应的提示文案,区分重置、退出两种场景的文字样式。
Ⅳ.倒计时异常容错功能:倒计时过程持续刷新界面,保证窗口可以正常拖动、缩放,不会出现程序卡死、界面无响应的问题。
⑨概率平衡与模拟赌场规则功能
Ⅰ.新手保护胜率设置:玩家前两局小额下注时,提高玩家获胜概率,模拟赌场前期给玩家甜头的诱导方式。
Ⅱ.大额下注胜率衰减功能:随着单次下注金额不断提高,逐步降低玩家的获胜概率,体现庄家天然的规则优势。
Ⅲ.底池金额动态计算功能:自动累加玩家、庄家每一轮投入的所有筹码,对局胜利方可以获得全部底池金额。
Ⅳ.亏损兜底数据保护功能:对玩家筹码数值做下限判断,防止多次大额亏损之后出现负金额,最低锁定为0元。
三、实验过程
(1)程序初始化与全局配置模块开发
整个项目采用自上而下的开发思路,首先完成主程序入口、全局变量、通用工具函数的编写。先导入本次项目需要用到的所有标准库,包括tkinter、random、time、threading等模块,接着创建程序主窗口,配置窗口基础属性,依次创建文本展示组件、输入框、发送按钮,同时自定义多种文字颜色标签,用来区分不同类型的输出内容。
为了避免游戏主逻辑阻塞GUI主线程,将整个游戏运行逻辑放在独立子线程中执行,保证界面可以随时响应鼠标、键盘操作。
随后封装全局的界面打印函数与阻塞式输入函数,统一管理所有界面文字输出和玩家指令读取操作,后续所有业务模块都可以直接调用这两个通用函数,大幅精简重复代码,也方便后续统一做格式修改与异常处理。
完成通用工具封装之后,初始化游戏基础全局变量,包括玩家初始本金、累计总欠款、有效对局统计标记、游戏运行状态标记,同时完成扑克牌花色、点数、牌型权重字典的定义,为后续发牌、牌型判定功能做好数据准备。









(2)扑克牌处理与牌型判定模块编码实现
这一部分是整个游戏的核心逻辑模块之一,我首先编写扑克牌批量生成函数,通过双层循环遍历花色与点数,生成完整的52张扑克牌列表,同时对J、Q、K、A四种特殊牌面做数值映射处理,方便后续数值比对。之后实现随机洗牌函数,借助random库的打乱方法,每次开局随机重置扑克牌顺序,保证每一局发牌结果具备随机性。
手牌处理部分,首先需要从7张手牌中遍历全部5张牌组合,筛选出最优的一组手牌参与牌型比对。之后依次编写同花、顺子、各类对子的判定逻辑,按照从大牌型到小牌型的顺序依次判断,一旦匹配到对应牌型就立刻终止后续判断,同时为当前手牌赋予对应的权重数值,同种牌型下按照最大单牌点数再次细化权重,确保可以精准比对两手牌的大小,最终返回牌型名称、总权重两个核心数据用于胜负结算。



(3)单局对局流程与下注交互模块开发
在对局逻辑开发时,我按照德州扑克的标准游玩顺序,分阶段实现每一个对局环节的代码。首先是底牌发放阶段,分别给玩家、庄家派发两张私密底牌并在界面展示,随后开放下注、跟注、弃牌三个操作指令,对玩家输入的指令做范围校验,不在指定范围内的输入会被拦截并重新提示操作。
玩家提交合法下注金额之后,首先判断当前筹码是否可以覆盖本次下注,如果余额充足则直接扣除对应筹码,将金额计入公共底池;如果余额不足,则跳转至借款交互流程。玩家选择弃牌的情况下,直接结束本局所有流程,扣除已经投入的筹码,同时输出一段庄家安抚对话。
顺利完成底牌阶段之后,依次实现翻牌、转牌、河牌三个公共牌发放环节,每一次发放公共牌之后都会开启新一轮下注交互,从翻牌阶段开始新增过牌操作,允许玩家在不下注的情况下跳过本轮操作。所有公共牌发放完成之后,双方公开手牌进行牌型比对,程序自动结算本局输赢,更新玩家当前筹码,同时在界面详细展示双方手牌、牌型、本局盈亏、剩余筹码等数据,正常结算的对局会将有效对局次数加一。




(4)筹码借贷与负债风控模块编码
在设计交互逻辑时,我考虑到玩家大概率会出现下注金额超过当前筹码的场景,因此设计了独立的借款交互分支。当检测到玩家余额不足时,程序在日志窗口输出借款提示内容,限定玩家只能输入1选择借款、输入0选择弃牌,其他任意输入都会被循环拦截。
如果玩家选择借款,会继续提示输入具体的借款金额,代码中通过try-except捕获非数字输入异常,同时校验借款数值必须是大于0的合法整数,校验通过之后,将借款金额增加到玩家可用筹码中,同时累加到全局总欠款变量里。每一次借款操作结束之后,程序都会实时判断当前总欠款数值,一旦达到预设的50万阈值,就会锁定所有开局功能,输出债务警示文案,不再允许玩家继续参与对局。


(5)多分支离场剧情模块的逻辑实现
为了让项目的警示效果更加贴合现实场景,我设计了四种不同的离场剧情分支,程序会自动读取玩家当前的游玩数据,匹配对应的挽留话术。首先判断玩家是否还没有开启任何一局游戏,如果未开局就选择退出,就采用激将类话术多次挽留;如果玩家已经参与对局,继续判断当前本金是盈利还是亏损状态,盈利场景引导玩家继续下注扩大收益,亏损场景劝说玩家借钱回本。
每一轮挽留对话结束之后,玩家都可以选择拒绝继续离场,连续多次拒绝之后,程序会跳出挽留循环,自动汇总本次游玩的全部财务数据,在界面清晰展示初始本金、当前剩余金额、整体盈亏、累计欠款、总对局次数,随后弹出远离赌博的警示文字,引导玩家做出最终选择。






(6)最终选择、倒计时与游戏重置功能实现
玩家进入最终选择界面之后,可以输入数字1选择重置游戏,输入数字0选择关闭程序。选定操作之后,首先在界面输出对应的提示文案,随后单独创建一行固定文本用于展示倒计时内容,通过获取当前行的固定索引锁定操作区域,循环从5秒递减至1秒,每一轮循环都会完整清空当前行原有内容,在同一位置写入最新的倒计时数字,实现原地刷新的视觉效果,每次刷新前调用界面更新方法,避免窗口卡顿、文字堆叠。
倒计时结束之后,如果玩家选择重置,就会清空文本框所有历史内容,将本金、欠款、对局次数全部恢复为初始数值,程序回到刚启动时的初始状态;如果选择退出,则直接销毁主窗口,结束整个程序进程。


(7)程序入口文件编写
项目最后编写程序主入口代码,在主函数中创建Tkinter根窗口,实例化游戏对应的运行对象,调用游戏启动函数,最后开启窗口事件循环,保证GUI程序持续运行、监听所有用户操作。


四、实验结果与测试
(1)测试相关环境说明
开发工具:PyCharm 2025.3.3
操作系统:Windows11
Python版本:Python3.10
程序运行录制视频:https://www.bilibili.com/video/BV1AsjV6HEYz/
(2)整体功能测试结果
在项目开发完成之后,我先后进行了多轮自主测试,同时邀请同班同学进行交叉测试,尽可能覆盖所有正常操作场景、边界数值场景、非法输入场景,整体测试结果如下:
程序可以正常启动,主窗口布局完整,各类彩色文字标签展示正常,鼠标点击发送、回车键快捷提交两种交互方式均可稳定使用,文本框可以自动滚动至最新内容;
扑克牌随机洗牌、发牌功能运行稳定,十种牌型的识别判定准确无误,同种牌型下大小比对逻辑正确,每一局的胜负结算、底池金额计算没有出现数值错误;
四个对局阶段的操作权限限制生效,玩家无法在底牌阶段使用过牌操作,所有非法指令都会被程序拦截并重新提示输入。
筹码不足时借款弹窗可以正常触发,非数字、负数、超大额非法输入都会被异常捕获,不会造成程序闪退,借款之后的筹码、欠款统计数据准确。
四种离场剧情分支可以根据玩家实时游玩数据精准触发,多轮挽留对话正常循环展示,多次拒绝后可以顺利进入最终选择页面;
倒计时可以在固定单行原地刷新数字,不会出现文字拼接、内容残留的问题,5 秒倒计时过程中窗口可以正常拖动,不会出现卡死无响应的情况;
游戏重置功能可以清空所有历史日志,将全部财务、统计数据恢复为初始值,退出功能可以正常关闭程序窗口;
负债达到 50 万之后,风控逻辑可以正常锁定开局功能,风险警示文案正常展示,新手胜率保护、大额下注胜率衰减规则可以正常生效。








(3)测试总结
本次项目一共细分实现了三十余项独立小功能,大大满足至少5功能的要求,并且程序具备完善的容错机制,对各类异常输入、边界数值都做了前置拦截与异常捕获,运行过程也是稳定可靠的,没有出现闪退、死循环、数据错乱等问题。我在做这个项目的过程中不仅完整练习了本学期所学的Python各类基础知识点,同时也借助游戏剧情完成了普法警示的设计,在锻炼代码编写、逻辑调试能力的同时,也加深了我对于赌博、网络借贷危害性的认知,圆圆满满完成本次综合实践的全部目标。
五、问题与解决方法
问题1:初次实现原地倒计时时使用文本标记末尾定位,多次循环之后旧文字无法清空,新的倒计时内容不断拼接在原有文字后方,出现文字堆叠错乱的情况

为何踩坑:一开始我使用mark_set绑定窗口末尾光标位置,每次循环删除当前标记行内容,但光标会随着文字新增不断向后偏移,导致每次只能删除一小部分内容,上一轮的倒计时文字残留,最终出现拼接错乱的显示问题。
解决方法:先单独插入一行空白文本作为倒计时固定行,获取这一行固定不变的行列索引坐标,后续每一轮循环都根据这个固定坐标完整清空整行所有内容,再在该行起始位置写入新的倒计时文字,从根源上避免文字残留、光标偏移带来的显示bug。
问题2:玩家输入字母、特殊符号、超出指令范围的数字时,程序直接抛出数值转换异常,运行直接终止闪退
为何踩坑:最开始编写交互输入逻辑时,没有做异常捕获处理,直接使用int()对玩家输入的内容强制转换,一旦输入内容不是纯数字格式,程序就会直接抛出ValueError异常并终止运行。

解决方法:所有需要做数字转换的输入位置,全部使用try-except语句捕获格式异常,一旦捕获到非数字输入,就提示玩家输入合规内容,通过while循环持续阻塞,直到玩家输入合法指令或者数值之后,才会跳出循环继续执行后续业务逻辑。
问题3:多次进行借钱、弃牌操作之后,全局总欠款数值出现重复累加、漏统计的情况,玩家实际欠款和界面展示数值不一致


为何踩坑:最开始我只在玩家点击确认借款的时候累加欠款数值,但部分分支场景下玩家放弃借款之后,变量没有做保护处理,多次来回切换操作后出现数据错乱,负债统计结果失真。
解决方法:将总欠款设置为全局唯一变量,只有玩家确认借款、金额校验通过之后才执行一次累加操作,只要玩家选择弃牌放弃借款,就不会对欠款变量做任何修改,同时每次借款完成后立刻刷新界面欠款展示内容,保证界面数值和后台变量完全同步。
问题4:其实除了这些外还有各种各样的问题,特别多来回一遍调试,小改还可以在原存档修改,大改因为害怕不小心让之前的功能也坏了所以都是全选复制重开一个存档来改的,光是重开的存档就快30个了,这里就不详细列举全部问题了,什么文本错位、相应结局触发文本对应错误、输入0跟1以外的错误数据仍按照输入1来执行、输赢牌型计算错误、借钱超过50万不主动退出就还能玩、概率判定只判定最初的而不是累加的金额、把弃牌过的牌局也计入最初对局导致特殊必胜规则没触发、刚好把钱花光被错误判定为亏钱分支,改了之后又被划到欠债去了等等,有点理解程序员修bug的心情了,我这才哪到哪啊...

六、实验总结
这次开发德州扑克警示小游戏,是我这学期写过代码量最多、逻辑最完整的程序。之前上课大多是跟着老师的示例敲代码,这次从需求构思、界面布局再到整套游戏规则、多分支剧情全部由自己从零设计实现,随后代码则一部分自己独立完成一部分在大模型辅助下完成,这对我的编程能力算是一次实打实的锻炼。
最一开始我原本想直接用第三方游戏框架来做,考虑到环境配置麻烦、还要额外安装依赖库,最后选择了Python自带的tkinter库来做图形界面,不需要额外安装包,兼容性更好。真正开发之后才发现,想要做好实时交互、文字动态刷新、多阶段流程控制等并不轻松,需要仔细设计循环结构、全局状态变量和消息队列。
整个项目里花费时间最多的两块,一是扑克牌牌型判定逻辑,最开始只写了基础的大小比对,后面不断完善顺子、同花、四条、葫芦等十种牌型的判定规则,反复调试才不会出现牌型识别错误。二是多分支离场剧情的逻辑判断,要根据玩家盈利、亏损、未开局、负债四种不同场景匹配对应的挽留话术,很容易出现条件嵌套混乱的问题,我通过分段梳理每一类场景的边界,才把分支逻辑理顺。
还有一个比较棘手的问题是GUI界面刷新卡顿和倒计时文字重叠的bug。虽然这部分是借助大模型实现的但它最开始直接使用sleep休眠没有刷新主线程,要么窗口卡死,要么倒计时文字全部一次性堆叠输出。我反复查阅资料,通过锁定单行固定坐标、每次循环清空整行内容再重新写入文字的方式,才实现了数字原地覆盖刷新的效果。
通过这次综合实践实验,我最大的收获就是学会把一个复杂的大项目拆解成一个个小模块逐个实现。先完成窗口界面搭建,再依次实现发牌、牌型判断、下注交互、借钱风控、剧情分支、倒计时重置这些小功能,逐个调试修复bug,每解决一个问题,项目就完善一步。
最后感谢王老师这一学期的耐心教学。最刚开始接触编程的时候我内心十分胆怯,毕竟之前理科那边C语言就没学好,到了这边还是很害怕代码难学,经过一学期的练习,现在虽然不能做到熟练精通,但遇到报错和程序异常不会再慌乱无措,能静下心去梳理逻辑、查找错误。如果之后有空余时间,我还想对这个项目做优化升级,比如美化游戏界面、增加背景音乐、设计多难度模式,让整个项目更加完善。
七、课程总结与感想体会
现在的我作为一名行政管理专业的文科生,在学习Python之前,我一直觉得编程是之前在理工科才需要掌握的技能,密密麻麻的代码让我内心十分抵触。经过这一学期的学习,这种刻板印象被彻底打破了。从最基础的打印语句、猜数字小游戏,再到循环、分支、函数、文件处理,最后尝试爬虫、GUI桌面程序开发,我慢慢积累起了编程基础知识,不仅提升了自己的逻辑思维素养,也慢慢体会到了代码解决重复工作的便捷之处,彻底改变了我对编程枯燥乏味的固有印象。
其次这门课也让我养成了细致严谨的做事习惯,极大锻炼了我的逻辑理解能力。Python编程里有很多容易忽略的细节,比如所有标点必须使用英文半角符号、缩进格式不能错乱、变量命名前后要统一、大小写拼写必须准确等等。往往一个小小的符号错误,就会导致整个程序无法运行,一次次的报错纠错,不断提醒我做事要细心沉稳。
除此之外,Python很多工具都能提升日常工作效率。在今后的专业学习里,不管是批量处理调研表格、整理文字资料,还是爬取公开政务数据做课题研究,编程都可以帮我省去大量重复繁琐的手工操作。我也相信在未来的工作场景中,这门课程学到的知识,会持续给我带来帮助。
八、课程建议
建议多结合我们行政管理专业的场景举例,比如公文批量处理、政务数据统计、舆情信息整理这类案例,能让我们更直观感受到这门课的实用价值,提升我们的学习积极性。
还有一点,这个其实算我自己的问题了。第三次作业我不是因为社恐所以本该跟同学合作的实验我自己跟自己即当发送方又当接收方么,还因此被扣分了,建议老师之后课程关照一下社恐的同学,有组队的给群里发个共享表格让同学们填,或者直接安排了。
九、免责声明
因本次作业我所做内容的特殊性故增加此版块,声明如下:
本次综合实践项目仅为Python课程教学实训作业,本德州扑克程序为赌博危害普法警示模拟演示程序,仅供课程学习交流使用,严禁用于线下真实赌博、商业盈利等违规违法场景,本人承诺不会将本代码用于任何违反法律法规、公序良俗的场景。
十、结语
Python课程的结束并不是编程学习的终点,而是我探索代码世界的新起点。这门课教会我的逻辑思维、问题拆解能力、耐心解决问题的习惯,都会在今后的学习和生活中长期受益。
最后由衷感谢老师一学期以来的辛苦授课、耐心答疑,课堂氛围轻松有趣,每次请教问题老师都会细致讲解,让我慢慢克服了对编程的恐惧。祝愿老师工作顺利、万事顺遂。
浙公网安备 33010602011771号