美文网首页大数据 爬虫Python AI SqlPython编程
用Python做一个中秋节嫦娥投食小游戏《千里婵娟》

用Python做一个中秋节嫦娥投食小游戏《千里婵娟》

作者: 傻逼平台瞎几把封号 | 来源:发表于2022-09-01 23:02 被阅读0次

    山河远阔,烟火人间,又一年,千里婵娟~

    今天给大家带来的是给玉兔投喂月饼的小游戏。八月十五中秋夜晚,让我们对着月亮许愿:希望我们在意和在意我们的人,诸邪避退、百事无忌、平安喜乐、万事胜意。提前祝大家中秋节快乐。

    中秋节的起源

    中秋节起源于上古时代,普及于汉代,定型于唐朝初年,盛行于宋朝以后。中秋节是秋季时令习俗的综合,其所包含的节俗因素,大都有古老的渊源。中秋节以月之圆兆人之团圆,为寄托思念故乡,思念亲人之情,祈盼丰收、幸福,成为丰富多彩、弥足珍贵的文化遗产。

    游戏设计

    1、游戏背景

    故事的开始🌕,中秋佳节至,玉兔因为贪玩被赶下人间,抬头望向天际,总是不自觉的会想起苏轼的词:“但愿人久,千里共婵娟”。这是一年中,最温柔又最有诗意的节日,可惜玉兔与嫦娥今年不能相聚,但嫦娥为了不让玉兔饿肚子,在八月十五中秋节的晚上,嫦娥在月球为玉兔投食月饼……🤔为了让玉兔吃到更多,嫦娥开启全民投食😃,只要给博主三连,就能给玉兔投食月饼啦!难道你忍心看到可爱的玉兔🐰饿肚子吗?快点行动起来吧!记得三连噢!

    2、功能设计

    人物:玉兔使用鼠标来控制左右运动

    月饼:随机从上界降落至下界,当碰到玉兔时,加10分,落到下界减5分。

    月亮:随机从上界降落至下界,当碰到玉兔时,减5分,且血条减一格。

    血条:HP

    值为3格时,生命为满值,当碰到月亮时减1格。减为0格时,游戏结束。

    开始:开始按钮,鼠标点击即开始游戏

    重来:重来按钮,鼠标点击即重新开始

    效果展示

    兔兔是不是很可爱嘞!

    代码素材

    环境如下

    • python 3.8.0
    • pygame 2.1.0

    代码

    看看素材地址是否一致,不一致要改成素材本地的地址。

    import pygame
    import random
    
    pygame.init()
    sc = pygame.display.set_mode((600, 695))
    pygame.display.set_caption("玉兔吃月饼——猿童学祝大家中秋节快乐!")
    basket = pygame.image.load("pic/basket.png")
    bj = pygame.image.load("pic/bj.jpg")
    bomb = pygame.image.load("pic/bomb.png")
    coin = pygame.image.load("pic/coin.png")
    start = pygame.image.load("pic/start.jpg")
    over = pygame.image.load("pic/over.jpg")
    ihp = pygame.image.load("pic/hp.png")
    btn_up = pygame.image.load("pic/btn_up.png")
    btn_down = pygame.image.load("pic/btn_down.png")
    bbtn_up = pygame.image.load("pic/bbtn_up.png")
    bbtn_down = pygame.image.load("pic/bbtn_down.png")
    word = "HP"
    font = pygame.font.SysFont("", 32)
    text = font.render(word, True, (75, 217, 65))
    score = 0
    text1 = font.render(str(score), True, (255, 255, 255))
    bx = 0
    lx, ly = [], []
    fx, fy = [], []
    speedy = 1
    hp = 4
    # 月饼生成的序列,通过序列可以源源不断生成月饼
    for i in range(0, 4):
        tx = random.randint(0, 586)
        ty = (i - 1) * 150
        lx.append(tx)
        ly.append(ty)
    
    # 月亮生成的序列
    for i in range(0, 2):
        x = random.randint(0, 586)
        y = (i - 1) * 300
        fx.append(x)
        fy.append(y)
    
    # 按钮类和按钮点击事件
    class Button(object):
        def __init__(self, btn_up, btn_down, position):
            self.btn_up = btn_up
            self.btn_down = btn_down
            self.position = position
    
        def isOver(self):
            point_x, point_y = pygame.mouse.get_pos()
            x, y = self.position
            w, h = self.btn_down.get_size()
    
            in_x = x - w / 2 < point_x < x + w / 2
            in_y = y - h / 2 < point_y < y + h / 2
            return in_x and in_y
    
        def isPressed(self):
            if event.type == pygame.MOUSEBUTTONDOWN:
                point_x, point_y = pygame.mouse.get_pos()
                x, y = self.position
                w, h = self.btn_down.get_size()
                in_x = x - w / 2 < point_x < x + w / 2
                in_y = y - h / 2 < point_y < y + h / 2
                return True
    
        def render(self):
            w, h = self.btn_up.get_size()
            x, y = self.position
    
            if self.isOver():
                sc.blit(self.btn_down, (x - w / 2, y - h / 2))
            else:
                sc.blit(self.btn_up, (x - w / 2, y - h / 2))
    
    button = Button(btn_up, btn_down, (288, 460))
    
    bbutton = Button(bbtn_up, bbtn_down, (288, 460))
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
        # 游戏开始界面
        sc.blit(start, (0, 0))
        bbutton.render()
        if bbutton.isPressed():
            hp = 3
            score = 0
            text1 = font.render(str(score), True, (255, 255, 255))
        # 进入游戏
        if hp > 0 and hp < 4 and score >= 0:
            sc.blit(bj, (0, 0))
            sc.blit(text, (10, 583))
            sc.blit(text1, (570, 570))
            sc.blit(basket, (bx, 540))
            # 难度变化
            if score <= 50:
                speedy = 0.4
            if score > 100:
                speedy = 0.8
            if score > 150:
                speedy = 1.2
            if score > 200:
                speedy = 1.6
            for i in range(len(lx)):
                sc.blit(coin, (lx[i], ly[i] - 600))
                ly[i] += speedy
                if ly[i] > 610 + 600:
                    ly[i] = 600
                    lx[i] = random.randint(0, 540)
                    score -= 5
                    text1 = font.render(str(score), True, (255, 255, 255))
                # 玉兔的宽62 高 48
                # 碰撞判断
                if lx[i] + 24 > bx and \
                        lx[i] + 24 < bx + 62 and \
                        ly[i] >= 1120 and \
                        ly[i] <= 1140:
                    ly[i] = 600
                    lx[i] = random.randint(0, 586)
                    score += 10
                    text1 = font.render(str(score), True, (255, 255, 255))
            for i in range(len(fx)):
                sc.blit(bomb, (fx[i], fy[i] - 600))
                fy[i] += speedy
                if fy[i] > 610 + 600:
                    fy[i] = 600
                    fx[i] = random.randint(0, 545)
    
                if fx[i] + 24 > bx and \
                        fx[i] + 24 < bx + 62 and \
                        fy[i] >= 1120 and \
                        fy[i] <= 1140:
                    hp -= 1
                    fy[i] = 600
                    fx[i] = random.randint(0, 586)
    
            # 篮子跟随鼠标运动
            if event.type == pygame.MOUSEMOTION:
                mx, my = pygame.mouse.get_pos()
                bx = mx - 24
            if bx < 0:
                bx = 0
            if bx > 610 - 62:
                bx = 548
            # 通过键盘控制篮子
            keys = pygame.key.get_pressed()
            if keys[pygame.K_a] or \
                    keys[pygame.K_RIGHT]:
                bx += 5
            if keys[pygame.K_d] or \
                    keys[pygame.K_LEFT]:
                bx += -5
            for i in range(0, hp):
                sc.blit(ihp, (22 * i + 40, 585))
    
        # 重新开始游戏
        if hp == 0 or score < 0:
            # 重新初始化游戏
            bx = 0
            speedy = 1
            # 月饼生成的序列
            for i in range(len(lx)):
                lx[i] = random.randint(0, 586)
                ly[i] = (i - 1) * 150
    
            # 月亮生成的序列
            for i in range(len(fx)):
                fx[i] = random.randint(0, 586)
                fy[i] = (i - 1) * 300
            sc.blit(over, (0, 0))
            button.render()
            # 点击按钮后重新开始游戏
            if button.isPressed():
                hp = 3
                score = 0
                text1 = font.render(str(score), True, (255, 255, 255))
        pygame.display.update()
    
    

    素材

    框框里的是图片的名字,可以在网上找自己喜欢的素材替换,名字一致即可,下面有一些也提供了多个选择。

    素材放在pic文件夹中,有如下材料:

    basket.png

    bj.jpg

    bomb.png

    coin.png

    start.jpg

    over.jpg

    这里不想找了,所以就一样了,大家可以更换成自己喜欢的背景。

    hp.png

    btn_up.png

    btn_down.png

    bbtn_up.png

    bbtn_down.png

    结束语

    ”但愿人长久,千里共婵娟“,比起这对现实无奈的诗词,我更希望是:”但愿人长久,一起过中秋”

    中秋是一个月亮的狂欢,一群人月饼的孤单。

    如果你愿意一层一层地拨开我的心,你会发现,你会哭泣,因为网上个五仁月饼🤣🤣🤣

    给个三连吧,祝你诸邪避退、百事无忌、平安喜乐、万事胜意、中秋快乐😊😊😊

    最后给大家分享一套Python教程:代码总是学完就忘记?100个爬虫实战项目!让你沉迷学习丨学以致用丨下一个Python大神就是你!

    相关文章

      网友评论

        本文标题:用Python做一个中秋节嫦娥投食小游戏《千里婵娟》

        本文链接:https://www.haomeiwen.com/subject/yxbsnrtx.html