鱼C论坛

 找回密码
 立即注册
查看: 225|回复: 7

ai求助

[复制链接]
发表于 2025-9-18 23:14:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎么用python写贪吃蛇啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-9-18 23:15:47 | 显示全部楼层
当然!用Python写贪吃蛇是一个很好的练习项目,它能帮你巩固编程基础。下面是一个使用 pygame 库实现的简单贪吃蛇游戏教程。

第一步:安装pygame
如果你还没有安装pygame,请先安装它:

  1. pip install pygame
复制代码


第二步:编写贪吃蛇游戏代码
将以下代码保存为 snake_game.py


  1. import pygame
  2. import random

  3. # 初始化pygame
  4. pygame.init()

  5. # 定义颜色
  6. white = (255, 255, 255)
  7. black = (0, 0, 0)
  8. red = (213, 50, 80)
  9. green = (0, 255, 0)
  10. blue = (50, 153, 213)

  11. # 设置游戏窗口
  12. dis_width = 800
  13. dis_height = 600
  14. dis = pygame.display.set_mode((dis_width, dis_height))
  15. pygame.display.set_caption('贪吃蛇游戏')

  16. # 设置游戏时钟
  17. clock = pygame.time.Clock()

  18. # 蛇的大小和速度
  19. snake_block = 10
  20. snake_speed = 15

  21. # 设置字体
  22. font_style = pygame.font.SysFont(None, 50)
  23. score_font = pygame.font.SysFont(None, 35)

  24. # 显示得分
  25. def your_score(score):
  26.     value = score_font.render("得分: " + str(score), True, white)
  27.     dis.blit(value, [0, 0])

  28. # 绘制蛇
  29. def our_snake(snake_block, snake_list):
  30.     for x in snake_list:
  31.         pygame.draw.rect(dis, green, [x[0], x[1], snake_block, snake_block])

  32. # 显示消息
  33. def message(msg, color):
  34.     mesg = font_style.render(msg, True, color)
  35.     dis.blit(mesg, [dis_width / 6, dis_height / 3])

  36. # 游戏主循环
  37. def gameLoop():
  38.     game_over = False
  39.     game_close = False

  40.     # 初始化蛇的位置
  41.     x1 = dis_width / 2
  42.     y1 = dis_height / 2

  43.     # 初始化蛇的移动方向
  44.     x1_change = 0
  45.     y1_change = 0

  46.     # 初始化蛇的身体
  47.     snake_List = []
  48.     Length_of_snake = 1

  49.     # 随机生成食物位置
  50.     foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  51.     foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0

  52.     while not game_over:

  53.         while game_close == True:
  54.             dis.fill(black)
  55.             message("游戏结束! 按Q退出或C重新开始", red)
  56.             your_score(Length_of_snake - 1)
  57.             pygame.display.update()

  58.             for event in pygame.event.get():
  59.                 if event.type == pygame.KEYDOWN:
  60.                     if event.key == pygame.K_q:
  61.                         game_over = True
  62.                         game_close = False
  63.                     if event.key == pygame.K_c:
  64.                         gameLoop()

  65.         for event in pygame.event.get():
  66.             if event.type == pygame.QUIT:
  67.                 game_over = True
  68.             if event.type == pygame.KEYDOWN:
  69.                 if event.key == pygame.K_LEFT:
  70.                     x1_change = -snake_block
  71.                     y1_change = 0
  72.                 elif event.key == pygame.K_RIGHT:
  73.                     x1_change = snake_block
  74.                     y1_change = 0
  75.                 elif event.key == pygame.K_UP:
  76.                     y1_change = -snake_block
  77.                     x1_change = 0
  78.                 elif event.key == pygame.K_DOWN:
  79.                     y1_change = snake_block
  80.                     x1_change = 0

  81.         # 检查是否撞墙
  82.         if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
  83.             game_close = True

  84.         # 更新蛇的位置
  85.         x1 += x1_change
  86.         y1 += y1_change
  87.         dis.fill(black)
  88.         pygame.draw.rect(dis, red, [foodx, foody, snake_block, snake_block])
  89.         
  90.         snake_Head = []
  91.         snake_Head.append(x1)
  92.         snake_Head.append(y1)
  93.         snake_List.append(snake_Head)
  94.         
  95.         if len(snake_List) > Length_of_snake:
  96.             del snake_List[0]

  97.         # 检查是否撞到自己
  98.         for x in snake_List[:-1]:
  99.             if x == snake_Head:
  100.                 game_close = True

  101.         our_snake(snake_block, snake_List)
  102.         your_score(Length_of_snake - 1)

  103.         pygame.display.update()

  104.         # 检查是否吃到食物
  105.         if x1 == foodx and y1 == foody:
  106.             foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
  107.             foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
  108.             Length_of_snake += 1

  109.         clock.tick(snake_speed)

  110.     pygame.quit()
  111.     quit()

  112. gameLoop()
复制代码


第三步:运行游戏
在终端中运行:

  1. python snake_game.py
复制代码


游戏操作说明:
- 使用方向键控制蛇的移动
- 吃到红色食物可以增加长度和得分
- 撞到墙壁或自己的身体游戏结束
- 游戏结束后按Q退出或C重新开始

代码说明:
1. 使用pygame创建游戏窗口和图形
2. 通过列表来存储蛇的身体坐标
3. 使用随机数生成食物位置
4. 检测键盘事件来控制蛇的移动方向
5. 实现碰撞检测(墙壁和自身)
6. 计分系统显示当前得分

你可以根据自己的喜好修改颜色、速度和游戏难度。希望这个简单的贪吃蛇游戏对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-18 23:16:36 | 显示全部楼层
FishC 发表于 2025-9-18 23:15
当然!用Python写贪吃蛇是一个很好的练习项目,它能帮你巩固编程基础。下面是一个使用 pygame 库实现的简单 ...

你的模型是?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-19 06:26:45 | 显示全部楼层

它居然不告诉你~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-19 07:37:53 | 显示全部楼层
文心试着做一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2025-9-19 10:51:06 | 显示全部楼层
  1. import tkinter as tk
  2. import random

  3. class SnakeGame:
  4.     def __init__(self, width=800, height=600):
  5.         self.width = width
  6.         self.height = height
  7.         self.block_size = 20
  8.         self.speed = 100

  9.         self.root = tk.Tk()
  10.         self.root.title("贪吃蛇游戏")
  11.         self.root.resizable(False, False)
  12.         self.root.focus_force()

  13.         self.canvas = tk.Canvas(self.root, width=self.width, height=self.height, bg="black")
  14.         self.canvas.pack()

  15.         self.reset_game()
  16.         self.root.bind("<KeyPress>", self.on_key_press)

  17.         self.score_text = self.canvas.create_text(50, 20, text=f"分数: {self.score}", fill="white", font=("Arial", 14))
  18.         self.speed_text = self.canvas.create_text(150, 20, text=f"速度: {self.get_speed_display()}", fill="white", font=("Arial", 14))
  19.         self.info_text = self.canvas.create_text(self.width//2, 20, text="+/=加速 | -减速 | ↑↓←→移动 | P暂停 | Space重新开始", fill="white", font=("Arial", 12))

  20.         self.game_loop()
  21.         self.root.mainloop()
  22.    
  23.     def get_speed_display(self):
  24.         max_speed = 30
  25.         min_speed = 150
  26.         speed_range = min_speed - max_speed
  27.         level = 10 - int((self.speed - max_speed) / speed_range * 9)
  28.         return f"{level}/10"
  29.    
  30.     def reset_game(self):
  31.         self.snake = [(100, 100), (80, 100), (60, 100)]
  32.         self.direction = "Right"
  33.         self.next_direction = "Right"
  34.         self.food = self.create_food()
  35.         self.score = 0
  36.         self.game_over = False
  37.         self.paused = False
  38.         self.speed = 100
  39.         self.canvas.delete("all")
  40.    
  41.     def create_food(self):
  42.         while True:
  43.             x = random.randint(1, (self.width - self.block_size) // self.block_size) * self.block_size
  44.             y = random.randint(1, (self.height - self.block_size) // self.block_size) * self.block_size
  45.             if (x, y) not in self.snake:
  46.                 return (x, y)
  47.    
  48.     def move_snake(self):
  49.         if self.game_over or self.paused:
  50.             return
  51.             
  52.         self.direction = self.next_direction
  53.         head_x, head_y = self.snake[0]
  54.         
  55.         if self.direction == "Up":
  56.             head_y -= self.block_size
  57.         elif self.direction == "Down":
  58.             head_y += self.block_size
  59.         elif self.direction == "Left":
  60.             head_x -= self.block_size
  61.         elif self.direction == "Right":
  62.             head_x += self.block_size
  63.             
  64.         if (head_x < 0 or head_x >= self.width or head_y < 0 or head_y >= self.height):
  65.             self.game_over = True
  66.             return
  67.             
  68.         if (head_x, head_y) in self.snake[1:]:
  69.             self.game_over = True
  70.             return
  71.             
  72.         self.snake.insert(0, (head_x, head_y))
  73.         
  74.         if self.snake[0] == self.food:
  75.             self.score += 10
  76.             self.food = self.create_food()
  77.         else:
  78.             self.snake.pop()
  79.    
  80.     def on_key_press(self, event):
  81.         key = event.keysym
  82.         
  83.         if key == "Up" and self.direction != "Down":
  84.             self.next_direction = "Up"
  85.         elif key == "Down" and self.direction != "Up":
  86.             self.next_direction = "Down"
  87.         elif key == "Left" and self.direction != "Right":
  88.             self.next_direction = "Left"
  89.         elif key == "Right" and self.direction != "Left":
  90.             self.next_direction = "Right"
  91.         elif key == "p" or key == "P":
  92.             self.paused = not self.paused
  93.         elif key == 'space':
  94.             self.reset_game()
  95.             self.root.focus_force()
  96.         elif (key == "plus" or key == "equal") and self.speed > 30:
  97.             self.speed -= 10
  98.             self.update_speed_display()
  99.         elif key == "minus" and self.speed < 150:
  100.             self.speed += 10
  101.             self.update_speed_display()
  102.    
  103.     def update_speed_display(self):
  104.         self.canvas.itemconfig(self.speed_text, text=f"速度: {self.get_speed_display()}")
  105.    
  106.     def draw(self):
  107.         self.canvas.delete("all")
  108.         
  109.         for i, segment in enumerate(self.snake):
  110.             x, y = segment
  111.             fill_color = "darkgreen" if i == 0 else "green"
  112.             self.canvas.create_rectangle(x, y, x + self.block_size, y + self.block_size, fill=fill_color, outline="")
  113.         
  114.         x, y = self.food
  115.         self.canvas.create_oval(x, y, x + self.block_size, y + self.block_size, fill="red", outline="")
  116.         
  117.         self.canvas.create_text(50, 20, text=f"分数: {self.score}", fill="white", font=("Arial", 14))
  118.         self.canvas.create_text(150, 20, text=f"速度: {self.get_speed_display()}", fill="white", font=("Arial", 14))
  119.         self.canvas.create_text(self.width//2, 20, text="+/=加速 | -减速 | ↑↓←→移动 | P暂停 | space重新开始", fill="white", font=("Arial", 12))
  120.         
  121.         if self.game_over:
  122.             self.canvas.create_text(self.width//2, self.height//2, text="游戏结束!按Space键重新开始", fill="white", font=("Arial", 24, "bold"))
  123.         if self.paused:
  124.             self.canvas.create_text(self.width//2, self.height//2, text="游戏暂停!按P键继续", fill="white", font=("Arial", 24, "bold"))
  125.    
  126.     def game_loop(self):
  127.         if not self.game_over and not self.paused:
  128.             self.move_snake()
  129.         self.draw()
  130.         self.root.after(self.speed, self.game_loop)

  131. if __name__ == "__main__":
  132.     game = SnakeGame()
复制代码

能给最佳答案吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-20 19:38:19 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-21 07:34:51 | 显示全部楼层
越看越迷
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-4 04:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表