20234203 2023-2024-2 《Python程序设计》实验4 Python综合实践

20234203郑凯夫 2024-05-28 23:59:08

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号发生的故事,和那个燃烧着整片天空的傍晚。

 

 

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

93

社区成员

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

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