93
社区成员




20234203 2023-2024-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2342
姓名: 郑凯夫
学号:20234203
实验教师:王志强
实验日期:2024年5月27日
必-修/选修: 公选课
一、实验项目
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等
评分标准:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。20分。
(3)实验4的遇到的问题以及感想体会。5分。
(4)对全课进行总结,并写课程感想体会、意见和建议等。10分。
二、实验过程
对2048这个游戏一直挺上头的,形策课有一次院士还提到了,觉得做一个2048是一个不错的方向
在观看B站视频、csdn社区讨论已经咨询相关专业同学后,开始编写
对2048游戏的制作需要对制作相应的游戏面板(本次以标准4*4为例)
设置游戏面板尺寸,并规定初始值为0
规定程序通过left up down right进行移动,控制同一行或同一列数值可以进行移动与合并
在程序运行中添加数值保证游戏正常进行
判断游戏是否到达结束条件,即当没有空格且无法进行任何有效移动时,游戏结束
根据输入的方向,选择相应的移动函数执行。确保只有在移动导致面板发生变化时(即有有效移动),才更新面板状态并添加新数字。
将程序拆分上述部分,合并可得完整简易4*4的2048游戏代码
以下是源代码
import random import copy # 初始化 def init_board(size=4): return [[0 for _ in range(size)] for _ in range(size)] # 游戏面板 def print_board(board): for row in board: print(" ".join(str(cell).rjust(5) for cell in row)) print() # 移动 def move_direction(board, direction): def shift_and_merge(line): line = [x for x in line if x != 0] merged = [] skip = False for i in range(len(line)): if skip: skip = False continue if i < len(line) - 1 and line[i] == line[i + 1]: merged.append(line[i] * 2) skip = True else: merged.append(line[i]) return merged + [0] * (len(board) - len(merged)) if direction == 'left': for row in board: row[:] = shift_and_merge(row) elif direction == 'right': for row in board: row[:] = shift_and_merge(row[::-1])[::-1] elif direction == 'up': for col in range(len(board)): column = [board[row][col] for row in range(len(board))] shifted = shift_and_merge(column) for row, val in enumerate(shifted): board[row][col] = val elif direction == 'down': for col in range(len(board)): column = [board[row][col] for row in range(len(board) - 1, -1, -1)] shifted = shift_and_merge(column) for row, val in enumerate(shifted[::-1]): board[len(board) - 1 - row][col] = val # 添加随机新数字 def add_new_tile(board): empty_cells = [(r, c) for r in range(len(board)) for c in range(len(board[r])) if board[r][c] == 0] if empty_cells: r, c = random.choice(empty_cells) board[r][c] = random.choice([2, 4]) # 检查游戏是否结束 def is_game_over(board): if any(0 in row for row in board): return False directions = ['left', 'right', 'up', 'down'] for direction in directions: temp_board = copy.deepcopy(board) move_direction(temp_board, direction) if temp_board != board: return False return True # 主游戏循环 def main(): board = init_board() add_new_tile(board) add_new_tile(board) while not is_game_over(board): print_board(board) move_input = input("请输入移动方向(left, right, up, down): ").strip().lower() if move_input in ['left', 'right', 'up', 'down']: move_direction(board, move_input) add_new_tile(board) else: print("无效的输入,请重新输入!") print("\n游戏结束!感谢游玩。") if __name__ == "__main__": main()
!!!老师我的csdn不知道咋搞的没有传输视频的选项,没法在这里展示了,会打包给课代表的
(运行截图)
三、实验问题及感受
1.在实验项目选择中发现有需要cfg模块、pygame等额外插件,可以win+r在cmd中输入cfg进行下载已经在官方网站下载pygame
2.在4*4盘满时仍然继续运行,无法结束。 在进行前确保通过一个函数检查游戏板上是否存在空位。如果没有空位,则不再生成新数字,避免循环。
四、全课总结与感想
在学长的建议下,选择了python作为本学期的一门选修课,转眼结课,不知时间过隙。也带着一点高中时期对python的一些兴趣,以及会考里的一些遗憾,对python课也是充满自信的。(然而自信仅仅持续三周)
收获也是很多的,从python语言的字符运算、数据类型(就是字符串、列表、字典那些啦)、还有控制结构(诸如条件语句、循环)等等。控制结构也算是比较得心应手的一个小模块了,现在想来还是成就感十足。在一次次的实验中,看着自己的小程序从一次次调试运行不断出错,到正常运行,期间不停地查阅资料,咨询同学,对照老师给出的代码,出错试错的过程,就是知识汲取的过程。不停的循环语句做出自己的猜数字游戏,不停调试实现了同一网络下服务端和客户端的交互,由简入难,自己对python也是有一种又爱又恨的感觉。非常感谢老师地宽容,面对抽问不会的情况,依旧选择原谅我们并且不厌其烦地解答问题,深深体会到老师治学之严谨,教学之敬业。希望自己在日后学习也可以戒骄戒躁脚踏实地,敬畏知识,学以致用。
关于课程,我也有一些自己的小的提议!即使老师您意识到文科班对于python理解的艰难晦涩而放缓进度,但理解起来还是有些吃力,希望老师可以对重点内容加以强调或者查阅网络资料,用通俗的语言向同学们阐明道理。另外,自己在csdn的浏览过程中发现python的应用中,关于python小游戏的开源大部分会使用到pygame,感觉到pygame的应用还是比较广泛的,想到我们有类似的实验任务和实验课程,我认为如果课程充裕的条件下老师可以向大家拓展一下pygame,感觉大家的兴趣会更广一些。感觉知识的遗忘还是很严重的,自己没有认真去记是很大一部分,也希望老师作为课程的第二负责人可以对我们多加约束(可以多问问甚至多考考,现场再写一串代码~)
最后的最后,还是感谢老师对我们的倾情授课!我们学到了好多!“未来的人生,一路繁花似锦”,我们会记住这个学期在富丰路7号发生的故事,和那个燃烧着整片天空的傍晚。