大家好,前天让 Ai教学,把贪吃蛇做出来了,但是是十分简陋,昨天中秋看到有中秋元素,所以想着把贪吃蛇升级一下,做一个中秋版-贪吃兔~
原版本:
中秋版:
接下来跟大家分享一下我是怎么让 Ai 教我去升级这个游戏的;
我现在明确就是想做一个特定背景,并且把蛇换成兔子,把食物换成月饼;所以可以直接把想法向 Ai提问:
准备素材
这里需要做的有两件事情,找到需要的图片素材,按照要求修改名称,并且新建一个“Images”文件夹;
这里可以给大家推荐一个找素材的网站:,这是华为旗下的一个素材网站,从大学用到现在了,十分好用,而且大部分还是免费的!直接搜素材+格式即可,然后右键保存你需要的素材,按照要求修改名称。
新建文件夹
直接在 Python 文件的文件夹新建一个 Images 文件夹即可,如果这里你找不到文件在哪,可以直接在 PyCharm 里面找到这个文件,使用访达打开即可
直接在这个文件夹里面新建“Images”文件夹,把图片放进去即可(这里理论上应该是每个 Pthon 文件要有个独立的文件夹才好管理,后面可以注意)
将生成的代码复制到源代码内,这里大家应该都知道怎么找代码里面的类和方法了,直接搜索,然后添加进去修改即可。(我这里发现图片尺寸不是 20*20,就让他改成自适应的了)
我运行代码后发现不是很灵敏,而且兔子和月饼都太小了,影响使用。我还想实现游戏结束后出现中秋快乐这个提示就让他继续优化了;
目前有一个问题和两个需求,希望你根据我的情况更改代码;
问题:有时候兔子对齐了月饼会直接穿过去,无法吃到月饼,怀疑是不是图片尺寸不是正方形问题,需要处理
需求:1、兔子和月饼的大小可以放大至2 倍,目前太小了;
2、游戏结束时,请调用本机电脑的字体,展示“中秋节快乐”,其他规则不变
但是运行之后我发现有报错,其实是因为我们这里的格式有问题,我们直接抛给 Ai 让他帮我们处理就可以了,大家有没有感觉很简单,有问题直接发给他,按照他给你的回复去修改就可以。
把上面的 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 编程/成长等相关内容,不一定都对,希望对大家有启发,可以一起讨论一起成长!如果觉得有用可以分享给朋友们一起看哦,或者悄悄点个关注,卷起来!