20224207 实验四《Python程序设计》实验报告

20224207周子涵 2024-05-28 23:55:44

# 20224207 2022-2023-2 《Python程序设计》实验4报告

课程:《Python程序设计》
班级: 2242
姓名: 周子涵
学号:20224207
实验教师:王志强
实验日期:2024年5月14日
必修/选修: 专选课

## 1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。

例如:利用公开数据集,开展图像分类、恶意软件检测等

例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。

例如:爬取天气数据,实现自动化微信提醒

例如:利用爬虫,实现自动化下载网站视频、文件等。

例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等

注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

## 2. 实验过程及结果
1.实验设计

在复习老师所讲内容并自学教材后,我决定利用设计Pycharm设计一个扫雷小游戏。

玩家的目标是在不触发隐藏的地雷的情况下,揭开所有安全的格子。游戏结束的胜利条件是成功揭开所有非地雷格子;失败则是玩家点击到任何一个含有地雷的格子。

2.实验分析

(1)功能划分:将游戏解构为几个主要的函数,如print_board负责打印当前游戏状态,init_board负责游戏板的初始化(包括地雷的布置和周围地雷数的计算),rreveal处理玩家揭开格子的逻辑,以及main作为主控制流程,负责游戏的开始、运行和结束条件判断,以提高代码的可读性和可维护性。

(2)用户交互:通过标准输入输出进行简单的文本界面交互,虽不如图形界面直观但保证了游戏在任何支持Python的环境中都能正常运行。使用正则表达式解析玩家输入,减少错误输入的可能性。

(3)循环逻辑:若玩家未触发胜利或失败结局则重复游戏过程直至结束,玩家输入信息后实时更新当前游戏状态,反馈明确。

3.实验过程

(1)导入模块

random函数用于生成随机数,用于放置地雷时的随机位置;re是正则表达式库,用于解析玩家实时输入的坐标。

 (2)设计打印游戏板

用print_board函数打印游戏状态到控制台。其中board是游戏板的数据结构,revealed标记哪些格子已被玩家揭开,通过这两个参数决定打印地雷、数字或未揭开的点的具体数量和位置。

(3) 设计初始化游戏板

用init_board函数创建并初始化游戏板:在给定大小的游戏板上随机布置指定数量的地雷,并确保正确设置每个非地雷格子周围的地雷计数。

 外层循环:

 持续到预设的地雷数量都成功放置到游戏板上,其中mine_positions集合用于存储已经布置了地雷的位置,以确保不会有重复。

随机选择地雷位置

 在游戏板的尺寸范围内随机选取一个x和y坐标作为潜在的地雷位置。

检查并添加地雷

检查这个位置是否已经被选作地雷位置,如果没有,则在集合中添加这个坐标。 

增加邻近格子的计数

对于每个地雷位置,遍历其周围的8个格子(包括对角线上的)。如果相邻格子的坐标在游戏板范围内且不是地雷(值不为-1),则该格子的值加1,表示其周围有一颗或多颗地雷。 

 设置地雷

遍历所有选定的地雷位置集合,在游戏板上将这些位置标记为地雷(值设为-1)。 

返回游戏板

 完成地雷布置和计数设置后,返回这个初始化完成的游戏板。

(4)处理揭开格子逻辑

用reveal函数处理玩家在扫雷游戏中揭开指定位置(x, y)格子的逻辑。

检查坐标是否越界(即不在游戏板范围内)或者该格子是否已经被揭开,如果满足这些条件中的任意一个,函数直接返回False,意味着这次揭开操作无效或无需进行;如果board[x][y]等于-1,说明玩家尝试揭开的是一个地雷,函数返回True,表示游戏结束(玩家失败)。

 将(x, y)位置的格子标记为已揭开(revealed[x][y] = True)后,如果该格子周围没有地雷(即board[x][y]==0),则会递归调用reveal函数尝试揭开其周围的8个格子(包括对角线上的)。

 如果上述情况都不满足,函数最后返回False(通常发生在成功揭开非地雷格子但未触发连锁反应时)。

(5) 编写游戏主程序

设置游戏板的大小 为10x10,设置地雷数量为10。

调用初始化游戏板,得到包含地雷布局的二维列表board 。

初始化一个同样大小的二维布尔列表revealed来跟踪每个格子是否被揭开。

 循环直到游戏结束条件触发。

 

调用print_board(board,revealed)打印当前游戏板状态,通过input获取玩家输入,允许玩家输入移动坐标或 'q' 退出游戏。

 使用正则表达式 re.match 验证玩家输入是否为有效的行和列坐标,如果不合法则提示错误并继续下一轮循环。

解析玩家输入的坐标为整数 x 和 y

 调用reveal(board,revealed,x,y)处理玩家的揭开操作,返回是否触雷。如果触雷,打印游戏结束信息并跳出循环;如果所有非地雷格子都被揭开,则打印胜利信息并结束游戏。

 ## 3. 实验过程中遇到的问题和解决方案
- 问题1:部分情况下玩家输入一次信息后无法继续游戏
- 问题1解决方案:检查主体部分代码,发现while True下缩进未统一,未能将所有语句包含在内。我重新顺了一遍运行逻辑,将几个if语句都缩在while True里面,实现了游戏的自动循环。
- 问题2:玩家输入单个数字后游戏无响应
- 问题2解决方案:增添了玩家输入无效的情况,输出"Invalid input. Please enter row and column numbers."继续下一轮循环,不影响游戏进程。


## 4.实验心得

在此次实验中,我在windows环境下利用Pycharm设计了一个扫雷小游戏,结合所学知识综合运用了print_boardinit_boardmain多种函数实现实验目标,纯文本式的呈现方式既遵循了经典扫雷游戏的基本规则和结构,也体现了简洁明了的程序设计原则。对于文科初学者来说这一步骤是漫长且复杂的,也遇到过许多问题,在一次次报错中碰壁。但我从未想过放弃或换个简单的实践内容,而是在摸索中一点一点研究语句结构、分析函数表达,与同学共同探讨难题和谜团,最终实现了游戏的正常运行,在实践中淬炼了编程思维、提升了学习锲而不舍的精神品质。

## 5.Python课程总结

最初接触Python时,陌生的语法和编程概念对我来说都仿佛是另一个世界的语言。每行代码、每个函数看上去都是那么深奥难懂,我也先入为主给自己贴了个“肯定学不会”的标签。但随着课程的逐步深入,在王志强老师生动的讲解下,我发现原来“天书”也可以变得浅显易懂。从打印“Hello, World!”入门,到后来能够解决实际问题的小项目,我逐渐感受到了编程的魅力所在——它是一种创造性的表达方式,能够将抽象的想法转化为具体的解决方案。我原先觉得计算机专业只用与枯燥的电子元件和数字打交道,而在学习Python的过程中,我发现编程语言同样需要严谨的逻辑和清晰的表达。这让我意识到,无论是文学分析还是编程,核心都是对问题的深入理解与有效沟通:Python教会了我如何用更结构化、逻辑性更强的方式去思考问题。

在一次次的实践课上,从数据分析到网页爬虫,我不仅看到了Python在各个领域的广泛应用,也在不断试错的代码调试过程中学会了面对挑战的耐心和解决问题的决心。每一个bug的解决都像是一次小小的胜利,每一次与老师共同攻克难题的经历都让我铭记在心,在碰壁中昂扬向上继续成长。

作为一名行政管理专业的学生,尽管我未来可能不会直接涉及编程工作,但Python的学习经历无疑为我打开了一扇新的大门,不仅拓宽了我的知识边界,还深刻地改变了我对问题解决方法的认知,也为我在未来的跨学科合作中提供了更多可能性。无论是进行数据分析以支持研究论点,还是利用技术手段优化工作流程,Python都将成为我工具箱中宝贵的资产。

## 参考资料

-  《零基础学Python》

...全文
190 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

93

社区成员

发帖
与我相关
我的任务
社区描述
Python程序设计作业
软件构建 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧