20244119 实验四 《Python综合实践》实验报告

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

一、程序及运行

1.源代码
board = [" " for _ in range(16)]

current_player = "X"
winner = None
game_running = True

def print_board(board):
print(f"{board[0]} | {board[1]} | {board[2]} | {board[3]}")
print("-----------")
print(f"{board[4]} | {board[5]} | {board[6]} | {board[7]}")
print("-----------")
print(f"{board[8]} | {board[9]} | {board[10]} | {board[11]}")
print("-----------")
print(f"{board[12]} | {board[13]} | {board[14]} | {board[15]}")

def handle_turn(player):
print(f"\n当前玩家是 {player}")
position = input("请选择1-16的位置: ")

valid = False
while not valid:
    while position not in ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"]:
        position = input("输入无效,请选择1-9的位置: ")

    position = int(position) - 1

    if board[position] == " ":
        valid = True
    else:
        print("这个位置已经被占用了!")
        position = input("请选择其他位置: ")

board[position] = player
print_board(board)

def check_rows():
global game_running
row_1 = (board[0] == board[1] == board[2] != " ") or (board[1] == board[2] == board[3] != " ")
row_2 = (board[4] == board[5] == board[6] != " ") or (board[5] == board[6] == board[7] != " ")
row_3 = (board[8] == board[9] == board[10] != " ") or (board[9] == board[10] == board[11] != " ")
row_4 = (board[12] == board[13] == board[14] != " ") or (board[13] == board[14] == board[15] != " ")

if row_1 or row_2 or row_3 or row_4:
    game_running = False
if row_1:
    return board[1]
elif row_2:
    return board[5]
elif row_3:
    return board[9]
elif row_4:
    return board[13]
return None

def check_columns():
global game_running
col_1 = (board[0] == board[4] == board[8] != " ") or (board[4] == board[8] == board[12] != " ")
col_2 = (board[1] == board[5] == board[9] != " ") or (board[5] == board[9] == board[13] != " ")
col_3 = (board[2] == board[6] == board[10] != " ") or (board[6] == board[10] == board[14] != " ")
col_4 = (board[3] == board[7] == board[11] != " ") or (board[7] == board[11] == board[15] != " ")
if col_1 or col_2 or col_3 or col_4:
game_running = False
if col_1:
return board[4]
elif col_2:
return board[5]
elif col_3:
return board[6]
elif col_4:
return board[7]
return None

def check_diagonals():
global game_running
diag1 = (board[0] == board[5] == board[10] != " ") or (board[5] == board[10] == board[15] != " ")
diag2 = (board[3] == board[6] == board[9] != " ") or (board[6] == board[9] == board[12] != " ")
diag3 = board[1] == board[6] == board[11] != " "
diag4 = board[2] == board[5] == board[8] != " "
diag5 = board[4] == board[9] == board[14] != " "
diag6 = board[7] == board[10] == board[13] != " "
if diag1 or diag2 or diag3 or diag4 or diag5 or diag6:
game_running = False
if diag1:
return board[5]
elif diag2:
return board[6]
elif diag3:
return board[6]
elif diag4:
return board[5]
elif diag5:
return board[9]
elif diag6:
return board[10]
return None

def check_winner():
global winner
row_winner = check_rows()
col_winner = check_columns()
diag_winner = check_diagonals()

if row_winner:
    winner = row_winner
elif col_winner:
    winner = col_winner
elif diag_winner:
    winner = diag_winner
else:
    winner = None
return winner

def check_tie():
global game_running
if " " not in board and winner is None:
game_running = False
return True
return False

def switch_player():
global current_player
if current_player == "X":
current_player = "O"
else:
current_player = "X"

print("欢迎参加井字棋游戏!")
print_board(board)

while game_running:
handle_turn(current_player)
check_winner()
check_tie()
switch_player()

if winner == "X" or winner == "O":
print(f"\n游戏结束!{winner} 获胜!")
else:
print("\n游戏结束!平局!")

while True:
play_again = input("是否要再玩一次?(Y/N): ").upper()
if play_again == "Y":
board = [" " for _ in range(16)]
current_player = "X"
winner = None
game_running = True
print("\n\n新的一局游戏开始!")
print_board(board)
while game_running:
handle_turn(current_player)
check_winner()
check_tie()
switch_player()
if winner == "X" or winner == "O":
print(f"\n游戏结束!{winner} 获胜!")
else:
print("\n游戏结束!平局!")
elif play_again == "N":
print("感谢游玩!游戏已退出。")
break
else:
print("输入无效,请输入 Y 或 N。")
2.运行视频链接
【20250529-1659】https://www.bilibili.com/video/BV1Zq7Gz4EHo?vd_source=68826ab76fd1ebf596dfee38f22caac6

二、实践过程

1.分析:
因为喜欢玩游戏,所以我在众多选项中选择做一个和游戏有关的应用。之后,出于井字棋玩法较为简单且有益智效果两点出发,我选择了做井字棋小游戏程序。

2.设计:
我决定把井字棋的游戏规则还有操作办法和本学期python知识结合起来,以此设计一个在Pycharm上可以两个人玩的井字棋小游戏
井字棋的规则是在3×3的九宫格中,两位玩家轮流落子,先将自己的三颗棋连成一条直线的那位玩家获胜。结合半学期知识,通过Print(board)函数和while循环架构等将规则用编程语言表示出来,然后在电脑上显示出棋盘,两位玩家轮流按指示选择落子,优先自己的三子练成一条线时,宣布胜利,程序运行结束,但是在第一次的实验以后,发现三乘三的规则确实是比较容易,并且难度较小,所以为了增大难度,我就改成了4×4的棋盘,重新修改了代码,但规则仍是谁的三颗棋先连成一条线,谁就胜利。

3.实现过程:
第一步 创建棋盘

以board为变量,借助列表推导式创建棋盘,通过[" " for _ in range(16)]生成一个包含16个空格字符串的列表作为棋盘。

第二步 设置玩家

用current_player将当前玩家设成X,由此名玩家首先落子,
用winner变量存储获胜玩家,初始化设为None,此时没有获胜玩家,
game_running作为布尔值控制游戏主循环运行,初始值设置为True表示游戏正在进行。

第三步 打印棋盘

运用print函数打印棋盘,整个棋盘呈4×4分布,使用竖线分割16个格子。

第四步 处理玩家输入

print(f"\n当前玩家是 {player}"):显示当前轮到哪位玩家进行操作。
position = input("请选择1-9的位置: "):获取用户输入的数字,用valid变量用于验证输入数字是否有效,初始值设为False,用while循环结构验证用户输入是否正确。(正确方有效)
再次运用循环结构while position not in [...]:检查用户输入是否为 1 - 16 之间的数字,如果不是,则提示玩家重新输入。
映射列表索引:position=int(position)-1:用int函数取整数,再减1,从而将输入(1-16)映射到列表索引(0-15)。用if board[position] == " "::检查选则的位置是否为空。如果空,将valid设为True,循环结束;如果被不空,提示玩家重新选择位置。
board[position] = player:把轮到的玩家标记填入选定的位置。
运用print函数更新棋盘(board)最新状态。

第五步 查找行获胜者

用global声明全局变量,提示将修改真个函数的变量
row_1 = board[0] == board[1] == board[2] != " ":检查第一行的三个格子是否相同且不为空。同理row_2和row_3row_4检查第二三四行的三个格子
运用条件判断if,If row_1 or row_2 or row_3or row_4::如果某一行的三个格子都相同且不为空,则game_running设为False,游戏结束。
如果有获胜者,返回获胜行的第一个格子的值(即获胜玩家的标记),
如果没有获胜行,返回最初设定none,游戏继续

第六步 查找列获胜者

“检查每列是否有获胜者”和上一步类似,通过比较每列的三个格子是否相同且不为空来判断。
如果有获胜列,返回获胜列的第一个格子的值,同时将game_running设为False。
如果没有获胜列,返回最初设定none,游戏继续

第七步 查找对角线获胜者

“检查每条对角线是否有获胜者”和上一步类似,运用diag分别检查从左上,左下,右上,右下四个方向开始的各条对角线。
如果有获胜对角线,就返回对角线上第一个格子的值,同时将game_running设为False,游戏结束。
如果没有获胜对角线,返回最初设定none,游戏继续

第八步 检查获胜者

使用global声明使用全局变量winner。
通过check_rows()、check_columns()和check_diagonals()三个函数,分别检查行、列和对角线是否有获胜者。
通过if-elif语句,获取获胜者结果,并将结果存储在winner变量中。如果没有获胜者,就将winner设为None,游戏继续。

第九步 检查是否平局

用If语句 " " not in board and winner is None:判断棋盘是否not is none且没有获胜者。
如满足上述条件,就把game_running设为False,表示游戏结束,并返回True,说明平局;否则返回False,游戏继续。

第十步 切换玩家

用global声明使用全局变量current_player。
通过switch和if条件判断如果当前玩家是 "X",切换为 "O";反之,切换为 "X"。

第十一步 游戏继续

使用print函数输入“欢迎参加井字棋游戏”美化环境。
运用while分支结构 game_running::只要,游戏就会继续。
在本循环内循环内依次执行:当前玩家进行操作(handle_turn)、检查是否有获胜者(check_winner)、检查是否平局(check_tie)、切换玩家(switch_player)四步,直到game_running为False,游戏结束

第十二步 显示结果,游戏结束

根据变量winner的值判断游戏结果。如果winner是 "X" 或 "O",就“X”获胜;如果winner为None,则平局,程序运行结束。

第十三步 添加重开功能

运用双层while结构,第一个循环负责游戏重开,再运用if判断语句规定知道玩家输入“N”,游戏才会停止。第二个while循环则就是游戏的正常进行过程,当玩家选择“Y”,每局游戏就正常运行。
为了方便玩家电脑输入,使用input,自动将玩家输入的n和y识别并转换成大写模式,加速美剧进程。当选择重开时,进入重置状态,清空棋盘,重置先手玩家为X,重置第八步,获胜者数据清零重置,接着使用print函数,提示新的一局开始。
之后第二个循环正式启动,按照第十一步重新进入游戏。

当一局游戏结束后,按照第八步,运用if条件判断是否有获胜者,通过check_rows()、check_columns()和check_diagonals()三个函数,分别检查行、列和对角线。Else,检查平局,并且打印结果。回到外层while架构询问“是否重开”,按照外层循环设定,玩家输入“Y”,游戏继续,输入“N”,游戏结束,代码运行结束。这样做方便了连续进行多局游戏,不需要反复退出。

三、总结、感想体会和意见建议

全课总结:
开始上这门课之前,我在编程方面确实是一个小白。所以课程刚开始的时候我是有巨大的畏难心理的,到现在课程即将结束,回头看自己这一学期的收获,看自己pycharm里一列表的作品,还是感到有所收获。
从第一节课开始,老师教我们如何搭建python运行环境,到如何python环境开发,再到语法特点、保留字、标识符、运算符等,我逐渐掌握一定的基础知识。
随着流程控制语句的学习,先前的点被if、else等串联起来,形成了一个个结构,循环、分支等等。接着,我们了解了序列、列表、字典和元组等,区分了它们的区别。接着是字符串、正则表达式、函数、网络爬虫等一个个知识点,所有的东西汇成一股洪流,有条不紊地进入我的脑子里面。
每个周二晚上的时间安排的正好,先回忆上节课知识点,然后开始新课,最后通过当堂的随堂练习巩固所学,在我一开始的时候,老是害怕自己跟不上,往往一节课上完,有很多东西都要靠去问别的同学才能掌握,但后来随着几次我自己独立的完成了小任务,我有了一些自信心,然后我就开始试着尽量多依靠自己来完成学习任务和作业,于是,学习效果变好了一些。
在老师带着我们演练的过程中,我学会了好几个具体的项目,也在某些时刻留下了深刻的印象。如“猜数字”,或者“把输入的句子变成藏头诗”,又或者最开始的“人生苦短,我用python”,种种要素的融合,使课堂不仅有理科氛围的巧思,还有了一丝文科的浪漫。

现在课程即将结束,除了课堂上教的应会的东西,老师结课的发言也令人动容。我想,虽然本学期的课程结束,可是python作为一个很有用的东西,未来它可能在很多方面帮助到我,比如大创,或是红星杯。我会一直温习,并一直坚定的走下去。

课程感想体会;
我的第一个感想是困难,作为一个新手,python的学习过程并非一帆风顺。在写“猜数字”和“石头剪刀布”的代码时,我首次遇上了代码中出现大量错误的情况,短短的几行代码,出现了数个红色感叹号。有的按照老师的笔记我自己改了过来,有的我则束手无策,最好找了身边的同学请教,终于把错误都改正了。在挫折中,我学到了一点就是平和,不要急躁,不要因为有错误就不做,而是要仔细地,认真的尽可能改正。
其次另一个感悟就是要虚心向别人学习,比如那一次让两个人合作完成服务端和客户端创建并通信的作业,当所有工作都准备就绪,但客户端就是接收不到信息且显示已拦截。当时我也没什么解决办法,后来通过和别人讨论,意识到需要关闭两台电脑的防火墙,于是我们大胆尝试了,这次就顺利做了出来,完成了作业。
学习的过程确实艰难,但是我很感谢能遇到好老师还有很多的好同学。未来也不可能每件事我都擅长,但我已经知道如何虚心向他人请教并努力提升自己了。
意见建议:
通过对比这门课和其他课程的考核方式,我认为以后可以增加一个期中的阶段性测试,或者是大作业,增加同学们的忧患意识,推动大家上课认真跟进。
在上课的时候,如果发现发现同学们有人兴致不高的话,可以设一些提问环节,当然可以把这些提问也归到可以加分的那一档里,这样就可以迅速调动起大家的积极性。
参考我个人的水平(小白),每个班的编程基础确实是良莠不齐的,可以在班上找一些优秀的同学作为老师的助手,在平时完成几项实验时适当帮助有困难的同学,推进班级整体水平。

posted @ 2025-05-29 22:09  a5w4  阅读(64)  评论(0)    收藏  举报