• 中秋假期,回不了家的程序员,竟然用Python做了这件事...


    8cea3c304e0dbc18ba4bc7b96ead9800.jpeg

    文 | 乌鸦

    来源:Python 技术「ID: pythonall」

    a3a49cfbba72f0c92742ebdaa7b9dc49.jpeg

    明月几时有,难得的中秋假期,很多码农兄弟经历疫情后终于有机会和家人团聚,也有不少兄弟因为各种原因在他乡度过假期。

    无论是怎样的情感,程序员总有自己特别的表达方式。今天就让我们花上几分钟时间用Python写一个小游戏,给中秋假期增加一点不一样的趣味。

    首先来看看最终的效果:

    4253b628cd3f382204818e5e2172c47e.jpeg

    fe38642e951dfc8a8bfc3cd4e9fcccd2.gif

    游戏所需的所有素材都帮大家整理好了,公众号后台回复“乌鸦”领取。

    这次我们要用到pygame这个库,这种简单的玩法用其他语言实现起来也很容易,但大多都需要一些框架的辅助,有一定的学习成本,而pygame就是为这种小游戏场景设计的,使用门槛很薄,相信只要看完这篇文章,你也能学会如何实现一个自己的玩法。

    7939df277e5e2d1bbeaa6a352da5c690.png

    首先我们引入资源,完成初始化,之后就可以开始Coding啦。
    1. # 导入所需模块
    2. import random
    3. import pygame
    4. # pygame初始化 
    5. pygame.init()
    6. # 设置主屏窗口
    7. screen = pygame.display.set_mode((600800))
    8. # 设置游戏名称
    9. pygame.display.set_caption("明月几时有")
    10. font = pygame.font.SysFont("Microsoft YaHei"40)

    我们的玩法设计是移动鼠标,操作屏幕下方的嫦娥接住月饼,所以首先定义同屏中月饼的数量:这里设计为x轴坐标随机,y轴坐标按规律值间隔,以免大量月饼黏在一起出现。

    1. # 控制月饼密度
    2. tar_pos = []
    3. for i in range(08):
    4.     tar_pos.append([random.randint(50550),(i - 1) * 100])

    然后开始定义游戏的主循环。主循环是在游戏运行的整个过程中一直运行的循环,所有的监听,判断和处理都应当编写进去。

    1. while True:
    2.     for event in pygame.event.get():
    3.         if event.type == pygame.QUIT:
    4.             exit()
    5.     
    6.     # 初始菜单
    7.     screen.blit(bg_menu, (00))
    8.     screen.blit(word_menu, (0-70))
    9.     button.show()
    10.     if button.click():
    11.         time = 3
    12.         score = 0
    13.         score_num = font.render(str(score), True, (255255255))
    14.         time_num = font.render(str(time), True, (255255255))

    这里需要注意的是,pygame中的坐标轴是以左上角为原点,X轴向左递增,Y轴向下递增的,这点可能和习惯性认知不太一样,切记不要闹出乌龙,否则会找不到月饼在哪儿。

    然后是运动的处理部分,这里首先要监听鼠标的移动,然后让人物跟随鼠标X轴运动,并加上窗口边界的判断。

    1. # 角色移动
    2.   if event.type == pygame.MOUSEMOTION:
    3.       move_x, move_y = pygame.mouse.get_pos()
    4.       now_pos = move_x - 75
    5.   if now_pos < 0:
    6.       now_pos = 0
    7.   if now_pos > 600:
    8.       now_pos = 525

    然后是游戏中最重要的部分——接到月饼的判断了,这里首先使用最开始创建的月饼位置,通过Y轴坐标值的增加,实现下落的过程。

    这里注意,之前创建月饼位置的时候,为了方便数值处理,原本的Y轴值减掉窗口高度后,才是月饼在Y轴的实际坐标,这里的逻辑大家可以根据自己的思维习惯修改。

    当月饼的xy轴左边均在人物的坐标范围内,或者月饼掉落出屏幕,即没有被接到时,重置Y轴坐标到窗口顶部,并重新随机x轴坐标,通过这种方式使得月饼不断出现。

    1. for i in range(len(tar_pos)):
    2.       screen.blit(pygame.transform.scale(target, (5050)), (tar_pos[i][0], tar_pos[i][1] - 800))
    3.       tar_pos[i][1] += speed1
    4.       if tar_pos[i][1] > 1600:
    5.           tar_pos[i][1] = 800
    6.           tar_pos[i][0] = random.randint(50550)
    7.           score -= 2
    8.           score_num = font.render(str(score), True, (255255255))
    9.       # 边界判定
    10.       if tar_pos[i][0] + 50 > now_pos and tar_pos[i][0]  < now_pos + 75 and tar_pos[i][1] >= 1300 and tar_pos[i][1] <= 1500:
    11.           tar_pos[i][1] = 800
    12.           tar_pos[i][0] = random.randint(50550)
    13.           score += 10
    14.           score_num = font.render(str(score), True, (255255255))

    做到这里,游戏的基本玩法已经完成了————但这样还称不上一个游戏,因为没有限制,也没有挑战。所以我们还需要给游戏加入一些其他的元素。

    649364ba823d38bc46bc52e2c5ebb94e.jpeg

    比如除了月饼之外,给玩家增加树枝的掉落,需要在抢月饼的同时躲避;同时增加生命值限制,如果多次碰到树枝则游戏结束:

    1. # 控制树枝密度
    2. for i in range(02):
    3.     wro_pos.append([random.randint(50550),(i - 1) * 300])
    4. while True:
    5.     # 开始游戏
    6.     if time > 0 and time < 4 and score >= 0:
    7.     ...
    8.     # 树枝运动路线
    9.         for i in range(len(wro_pos)):
    10.             screen.blit(pygame.transform.scale(wrong, (5050)), (wro_pos[i][0], wro_pos[i][1] - 800))
    11.             wro_pos[i][1] += speed2
    12.             if wro_pos[i][1] > 1600:
    13.                 wro_pos[i][1] = 800
    14.                 wro_pos[i][0] = random.randint(50550)
    15.             # 边界判定
    16.             if wro_pos[i][0] + 50 > now_pos and wro_pos[i][0] < now_pos + 75 and wro_pos[i][1] >= 1300 and wro_pos[i][1] <= 1500:
    17.                 wro_pos[i][1]= 800
    18.                 wro_pos[i][0] = random.randint(50550)
    19.                 time -= 1
    20.                 time_num = font.render(str(time), True, (255255255))

    仅仅是躲避很容易让人感到厌倦,所以我们可以加入一个难度变化,让节奏不断变快。随着分数的增加,下落的速度会越来越快。

    1. # 速度变化
    2.         if score <= 30:
    3.             speed1 = 0.8
    4.             speed2 = 1.2
    5.         elif score <= 60:
    6.             speed1 = 1
    7.             speed2 = 1.5
    8.         elif score <= 90:
    9.     ...

    至此游戏的整体玩法已经成型了,最后再在结束页面加一个分数展示,整个流程就比较的完整了~

    1. # 重新开始游戏
    2.     if time == 0 or score < 0:
    3.         # 初始化游戏
    4.         now_pos = 0
    5.         speed = 1
    6.         # 月饼运动路线
    7.         for i in range(len(tar_pos)):
    8.             tar_pos[i][0] = random.randint(50550)
    9.             tar_pos[i][1] = (i - 1) * 100
    10.         # 树枝运动路线
    11.         for i in range(len(wro_pos)):
    12.             wro_pos[i][0] = random.randint(50550)
    13.             wro_pos[i][1] = (i - 1) * 300
    14.         end_text = font.render(end_word.format(score), True, (255255255))
    15.         screen.blit(bg_menu, (00))
    16.         screen.blit(end_text, (50220))

    至此这个抢月饼的游戏就完成了,文章篇幅有限,我已经将完整的源码和游戏素材上传,大家可以在公众号后台回复“乌鸦”获取下载链接,直接在本地运行体验。

    我自己玩了几次,不得不说到后面还是需要眼疾手快的,一番操作之后,我拿到了这样的分数~你们拿到了多少分呢?

    f21c8b0115a15a9935f1ffe764c3fb77.jpeg

    最后祝大家中秋假期愉快,生活幸福美满~!

    PS:公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!

    老规矩,酱友们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

    6d127ae31d7c796dd55ac9a73eff696d.gif

    代码获取方式

    识别文末二维码,回复:乌鸦

    7c323a0b16e19dd41028ad160c76a9af.png

    d6e2d62bd09ebb770812be598b736d6e.png

  • 相关阅读:
    【21天Python进阶学习挑战赛】[day8]操作MySQL和SqlServer
    要想实现超视距低延时图数传输,你还需要一款Mini Homer
    深度学习系列47:styleGAN总结
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
    mysql基于Java的学生请销假审批管理系统的设计与实现毕业设计源码130939
    PWA 踩坑 - 第一次加载页面后无法获取CacheStorage某些资源
    2023-python-import耗时是为什么?
    正点原子嵌入式linux驱动开发——U-boot顶层Makefile详解
    解析分布式数据库的技术框架及其在金融行业中的应用规划
    Android 包体积优化(未完成)
  • 原文地址:https://blog.csdn.net/weixin_48923393/article/details/126825543