您的当前位置:首页正文

Ai 编程教程-Ai 教你用 Python 做游戏之贪吃蛇中秋升级版贪吃兔

2024-11-07 来源:个人技术集锦


大家好,前天让 Ai教学,把贪吃蛇做出来了,但是是十分简陋,昨天中秋看到有中秋元素,所以想着把贪吃蛇升级一下,做一个中秋版-贪吃兔~

原版本:

中秋版:

接下来跟大家分享一下我是怎么让 Ai 教我去升级这个游戏的;

一、前提准备

我现在明确就是想做一个特定背景,并且把蛇换成兔子,把食物换成月饼;所以可以直接把想法向 Ai提问:

  1. 准备素材

这里需要做的有两件事情,找到需要的图片素材,按照要求修改名称,并且新建一个“Images”文件夹;

这里可以给大家推荐一个找素材的网站:,这是华为旗下的一个素材网站,从大学用到现在了,十分好用,而且大部分还是免费的!直接搜素材+格式即可,然后右键保存你需要的素材,按照要求修改名称。

  1. 新建文件夹

直接在 Python 文件的文件夹新建一个 Images 文件夹即可,如果这里你找不到文件在哪,可以直接在 PyCharm 里面找到这个文件,使用访达打开即可

直接在这个文件夹里面新建“Images”文件夹,把图片放进去即可(这里理论上应该是每个 Pthon 文件要有个独立的文件夹才好管理,后面可以注意)

二、调试代码

  1. 添加代码

将生成的代码复制到源代码内,这里大家应该都知道怎么找代码里面的类和方法了,直接搜索,然后添加进去修改即可。(我这里发现图片尺寸不是 20*20,就让他改成自适应的了)

  1. 迭代优化

我运行代码后发现不是很灵敏,而且兔子和月饼都太小了,影响使用。我还想实现游戏结束后出现中秋快乐这个提示就让他继续优化了;

目前有一个问题和两个需求,希望你根据我的情况更改代码;
问题:有时候兔子对齐了月饼会直接穿过去,无法吃到月饼,怀疑是不是图片尺寸不是正方形问题,需要处理
需求:1、兔子和月饼的大小可以放大至2 倍,目前太小了;
2、游戏结束时,请调用本机电脑的字体,展示“中秋节快乐”,其他规则不变

但是运行之后我发现有报错,其实是因为我们这里的格式有问题,我们直接抛给 Ai 让他帮我们处理就可以了,大家有没有感觉很简单,有问题直接发给他,按照他给你的回复去修改就可以。

三、运行游戏

  1. 把上面的 bug 修改完之后,我发现游戏结束之后的提示不是我想要的那种,所以继续提了个需求,让他把文字换成我的图片,并且需要在屏幕居中展示;这里想跟大家说的是,这就是跟我们平时做产品一样,你可以根据效果去进行修改,这里不会有人跟你推脱说做不了或者不想做,你只要有想法,你就可以发给 Ai,让他帮你实现。最后我来给大家放一下最终的代码和效果图;

# -*- coding: utf-8 -*-
import pygame
import random
import os
import sys

# 初始化Pygame
pygame.init()

# 定义游戏窗口大小
WIDTH = 800
HEIGHT = 600

# 定义兔子和月饼的大小(现在是相对大小的2倍)
BLOCK_SIZE_RATIO = 0.066  # 约等于40/600,是原来的2倍

# 初始化游戏窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("中秋贪吃兔游戏")

# 计算实际的方块大小
BLOCK_SIZE = int(min(WIDTH, HEIGHT) * BLOCK_SIZE_RATIO)

# 获取当前脚本的目录
current_dir = os.path.dirname(os.path.abspath(__file__))

# 定义图片路径
image_dir = os.path.join(current_dir, "images")

# 加载图片函数
def load_image(filename):
    """加载图片并返回surface对象"""
    try:
        image_path = os.path.join(image_dir, filename)
        return pygame.image.load(image_path).convert_alpha()
    except pygame.error as e:
        print(f"无法加载图片 {filename}: {e}")
        surface = pygame.Surface((BLOCK_SIZE, BLOCK_SIZE), pygame.SRCALPHA)
        surface.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255), 255))
        return surface

# 缩放图片函数
def scale_image(image, size):
    """缩放图片到指定大小"""
    return pygame.transform.scale(image, size)

# 加载图片
background_original = load_image("mid_autumn_bg.png")
rabbit_head_original = load_image("rabbit_head.png")
rabbit_body_original = load_image("rabbit_body.png")
mooncake_original = load_image("mooncake.png")
mid_autumn_greeting = load_image("mid_autumn_greeting.png")

# 缩放图片
background = scale_image(background_original, (WIDTH, HEIGHT))
rabbit_head = scale_image(rabbit_head_original, (BLOCK_SIZE, BLOCK_SIZE))
rabbit_body = scale_image(rabbit_body_original, (BLOCK_SIZE, BLOCK_SIZE))
mooncake = scale_image(mooncake_original, (BLOCK_SIZE, BLOCK_SIZE))
mid_autumn_greeting = scale_image(mid_autumn_greeting, (400, 200))  # 增大图片尺寸

# 加载本地字体
try:
    if sys.platform == "win32":
        font_path = os.path.join(os.environ['WINDIR'], 'Fonts', 'msyh.ttc')
    elif sys.platform == "darwin":
        font_path = '/System/Library/Fonts/PingFang.ttc'
    else:
        font_path = '/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf'

    font = pygame.font.Font(font_path, 36)
except:
    print("无法加载本地字体,使用默认字体")
    font = pygame.font.Font(None, 36)

def draw_rabbit(rabbit_body_list):
    """绘制兔子"""
    screen.blit(rabbit_head, rabbit_body_list[0])
    for block in rabbit_body_list[1:]:
        screen.blit(rabbit_body, block)

def generate_food():
    """生成月饼"""
    food_x = round(random.randrange(0, WIDTH - BLOCK_SIZE) / BLOCK_SIZE) * BLOCK_SIZE
    food_y = round(random.randrange(0, HEIGHT - BLOCK_SIZE) / BLOCK_SIZE) * BLOCK_SIZE
    return food_x, food_y

def game_over_screen():
    """显示游戏结束画面并处理用户输入"""
    screen.blit(background, (0, 0))
    
    # 游戏结束文字
    game_over_text = font.render("游戏结束", True, (255, 0, 0))
    screen.blit(game_over_text, (WIDTH // 2 - game_over_text.get_width() // 2, 50))
    
    # 中秋快乐图片
    greeting_x = WIDTH // 2 - mid_autumn_greeting.get_width() // 2
    greeting_y = HEIGHT // 2 - mid_autumn_greeting.get_height() // 2
    screen.blit(mid_autumn_greeting, (greeting_x, greeting_y))
    
    # 添加提示文字
    hint_text = font.render("点击任意处继续,按ESC退出", True, (255, 255, 255))
    screen.blit(hint_text, (WIDTH // 2 - hint_text.get_width() // 2, HEIGHT - 50))
    
    pygame.display.flip()
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    return False  # 按ESC键退出游戏
                else:
                    return True  # 其他键继续游戏
            if event.type == pygame.MOUSEBUTTONDOWN:
                return True  # 鼠标点击继续游戏
    return False

def game_loop():
    """运行主游戏循环"""
    # 初始化兔子的位置和方向
    rabbit_x = WIDTH // 2
    rabbit_y = HEIGHT // 2
    rabbit_dx = BLOCK_SIZE
    rabbit_dy = 0

    # 初始化兔子身体
    rabbit_body = [[rabbit_x, rabbit_y]]

    # 生成第一个月饼
    food_x, food_y = generate_food()

    # 初始化游戏状态
    game_over = False
    clock = pygame.time.Clock()
    score = 0
    speed = 10

    while not game_over:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return score
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and rabbit_dx == 0:
                    rabbit_dx = -BLOCK_SIZE
                    rabbit_dy = 0
                elif event.key == pygame.K_RIGHT and rabbit_dx == 0:
                    rabbit_dx = BLOCK_SIZE
                    rabbit_dy = 0
                elif event.key == pygame.K_UP and rabbit_dy == 0:
                    rabbit_dy = -BLOCK_SIZE
                    rabbit_dx = 0
                elif event.key == pygame.K_DOWN and rabbit_dy == 0:
                    rabbit_dy = BLOCK_SIZE
                    rabbit_dx = 0

        # 移动兔子
        rabbit_x += rabbit_dx
        rabbit_y += rabbit_dy

        # 处理穿越屏幕边界
        if rabbit_x >= WIDTH:
            rabbit_x = 0
        elif rabbit_x < 0:
            rabbit_x = WIDTH - BLOCK_SIZE
        if rabbit_y >= HEIGHT:
            rabbit_y = 0
        elif rabbit_y < 0:
            rabbit_y = HEIGHT - BLOCK_SIZE

        # 检查是否吃到月饼(使用重叠检测)
        rabbit_rect = pygame.Rect(rabbit_x, rabbit_y, BLOCK_SIZE, BLOCK_SIZE)
        food_rect = pygame.Rect(food_x, food_y, BLOCK_SIZE, BLOCK_SIZE)
        if rabbit_rect.colliderect(food_rect):
            score += 1
            speed += 0.5
            food_x, food_y = generate_food()
        else:
            rabbit_body.pop()

        # 在兔子头部位置插入新的身体部分
        rabbit_body.insert(0, [rabbit_x, rabbit_y])

        # 检查是否撞到自己
        if [rabbit_x, rabbit_y] in rabbit_body[1:]:
            game_over = True

        # 绘制游戏元素
        screen.blit(background, (0, 0))
        draw_rabbit(rabbit_body)
        screen.blit(mooncake, (food_x, food_y))

        # 显示得分
        score_text = font.render(f"得分: {score}", True, (255, 255, 255))
        screen.blit(score_text, (10, 10))

        pygame.display.flip()

        # 控制游戏速度
        clock.tick(speed)

    return score

def main():
    """运行游戏的主函数"""
    running = True
    while running:
        score = game_loop()
        if not game_over_screen():
            running = False
    pygame.quit()

if __name__ == "__main__":
    main()

大家好,我是良逍,一个爱折腾的 95 后,目前是一个不知名的跨境电商产品经理,平时爱研究折腾一些新鲜事物也尝试过很多副业,也取得过一些成绩。后期将会在平台持续分享产品/Ai 编程/成长等相关内容,不一定都对,希望对大家有启发,可以一起讨论一起成长!如果觉得有用可以分享给朋友们一起看哦,或者悄悄点个关注,卷起来!

显示全文