鱼C论坛

 找回密码
 立即注册
查看: 858|回复: 40

[作品展示] 【10次鱼币】贪吃蛇

[复制链接]
发表于 2025-8-2 18:32:49 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 尉尉的可乐 于 2025-8-2 21:24 编辑

贪吃蛇
  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()
复制代码


评分一下,给作者一些动力吧!

评分

参与人数 3荣誉 +13 鱼币 +13 贡献 +9 收起 理由
pyzyd + 5 + 5 + 3 鱼C有你更精彩^_^
cjjJasonchen + 5 + 5 + 3
sfqxx + 3 + 3 + 3

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2025-8-2 18:37:59 | 显示全部楼层
贪吃蛇游戏功能:移动、吃食物、加速减速、暂停和重新开始。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-20 20:46:16 | 显示全部楼层

我测试一下 MarkDown。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-9-20 20:28:14 | 显示全部楼层
sfqxx 发表于 2025-9-20 19:39
$x$ $GB$

$0123456789$

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

使用道具 举报

发表于 2025-9-20 19:39:53 | 显示全部楼层
本帖最后由 sfqxx 于 2025-9-20 20:48 编辑

$x$ $GB$

$0123456789$
$ABCDEFGHIJKLMN$

$OPQRSTUVWXYZ$

$(-\infty,+\infty)$
$[\pi,+\infty)$

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2025-8-8 17:41:33 | 显示全部楼层
这要学到什么时候才能写出这样的代码呀?

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-8 14:27:28 | 显示全部楼层
厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2025-8-4 09:30:55 | 显示全部楼层
sfqxx 发表于 2025-8-3 17:32
你听懂我的意思了吗

我设定就是这样的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-3 17:32:00 | 显示全部楼层
尉尉的可乐 发表于 2025-8-3 13:27
贪吃蛇不都这样吗?

你听懂我的意思了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-3 13:27:32 | 显示全部楼层
sfqxx 发表于 2025-8-2 21:32
改了,然后一这么操作就自动结束游戏了,我也不知道为什么

贪吃蛇不都这样吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-3 11:42:31 | 显示全部楼层
FishC 发表于 2025-8-2 20:21
我注意到您提到了"附件",但在本平台中无法直接接收文件附件。不过,我可以为您提供完整的贪吃蛇游戏解 ...

不要捣乱了,你真是让我哭笑不得
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-2 21:32:31 | 显示全部楼层
尉尉的可乐 发表于 2025-8-2 21:26
你没玩过贪吃蛇吗
他横过来的时候是不能调整左右方向的
当然如果你想的话可以改一改

改了,然后一这么操作就自动结束游戏了,我也不知道为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-2 21:31:50 | 显示全部楼层
Bug 反馈:自己碰到自己会结束游戏。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-2 21:27:04 | 显示全部楼层
尉尉的可乐 发表于 2025-8-2 21:26
你没玩过贪吃蛇吗
他横过来的时候是不能调整左右方向的

哦.确实没怎么玩过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-2 21:26:32 | 显示全部楼层
sfqxx 发表于 2025-8-2 21:25
我的意思是,横向运动时按←或→没反应.
比如这样:
你在这种情况下按我上述操作给我拍一下


你没玩过贪吃蛇吗
他横过来的时候是不能调整左右方向的
当然如果你想的话可以改一改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-2 21:25:17 | 显示全部楼层

回帖奖励 +1 鱼币



我的意思是,横向运动时按←或→没反应.
比如这样: 屏幕截图 2025-08-02 212340.png
你在这种情况下按我上述操作给我拍一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-2 21:23:28 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-2 21:22:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-8-2 21:22:35 | 显示全部楼层

你说得对,但是我是 Windows
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-8-2 21:22:15 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-7 06:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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