讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?

同时向讯飞星火、文心一言和通义千问三个国产AI模型提个相同的问题:

"python 写一个贪吃蛇的游戏代码"

看哪一家AI写的程序直接能用,谁就胜出!

讯飞星火

讯飞星火给出的代码:

python 复制代码
import pygame
import sys
import random

# 初始化pygame
pygame.init()

# 设置屏幕大小
screen_size = (640, 480)
screen = pygame.display.set_mode(screen_size)

# 设置游戏标题
pygame.display.set_caption("贪吃蛇")

# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# 蛇的初始位置
snake_pos = [[100, 100], [80, 100], [60, 100]]

# 食物的初始位置
food_pos = [300, 300]

# 蛇的初始速度
snake_speed = [20, 0]

# 主循环
while True:
    # 处理游戏事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                snake_speed = [0, -20]
            elif event.key == pygame.K_DOWN:
                snake_speed = [0, 20]
            elif event.key == pygame.K_LEFT:
                snake_speed = [-20, 0]
            elif event.key == pygame.K_RIGHT:
                snake_speed = [20, 0]

    # 更新蛇的位置
    snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])

    # 检查蛇头是否碰到食物
    if snake_pos[0] == food_pos:
        food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]
    else:
        snake_pos.pop()

    # 检查蛇头是否碰到墙壁或者蛇身
    if snake_pos[0][0] < 0 or snake_pos[0][0] >= screen_size[0] or snake_pos[0][1] < 0 or snake_pos[0][1] >= screen_size[1] or snake_pos[0] in snake_pos[1:]:
        pygame.quit()
        sys.exit()

    # 绘制游戏界面
    screen.fill(WHITE)

    for pos in snake_pos:
        pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))

    pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))

    pygame.display.flip()

    # 控制游戏速度
    pygame.time.Clock().tick(10)

按F5执行,运行结果如下:

文心一言

文心一言给出的代码:

```

import pygame

import random

初始化pygame

pygame.init()

定义颜色

WHITE = (255, 255, 255)

定义屏幕大小

SCREEN_WIDTH = 400

SCREEN_HEIGHT = 400

创建屏幕

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

设置标题

pygame.display.set_caption("Snake Game")

创建时钟对象,用于控制游戏速度

clock = pygame.time.Clock()

创建蛇和食物的初始位置和大小

snake_parts = [[100, 50], [90, 50], [80, 50]]

snake_head = [70, 50]

food_x = random.randint(1, 19) * 20

food_y = random.randint(1, 19) * 20

snake_size = 20

food_size = 20

定义蛇和食物的运动方向和速度

snake_dir = [2, 0]

snake_speed = 10

food_speed = 5

定义游戏状态:进行中或结束

game_active = True

游戏循环

while game_active:

处理事件

for event in pygame.event.get():

if event.type == pygame.QUIT:

game_active = False

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_UP and snake_dir != [2, 0]: snake_dir = [0, -1]

elif event.key == pygame.K_DOWN and snake_dir != [2, 0]: snake_dir = [0, 1]

elif event.key == pygame.K_LEFT and snake_dir != [1, 0]: snake_dir = [-1, 0]

elif event.key == pygame.K_RIGHT and snake_dir != [3, 0]: snake_dir = [1, 0]

移动蛇头,如果碰到食物,则加长蛇身,并重新生成食物位置

snake_head[0] += snake_dir[0] * snake_speed

snake_head[1] += snake_dir[1] * snake_speed

if snake_head[0] == food_x and snake_head[1] == food_y:

food_x = random.randint(1, 19) * 20

food_y = random.randint(1, 19) * 20

snake_parts.insert(0, list(snake_head))

else:

snake_parts.pop()

如果蛇头超出屏幕边界,则游戏结束

if snake_head[0] < 0 or snake_head[0] >= SCREEN_WIDTH or snake_head[1] < 0 or snake_head[1] >= SCREEN_HEIGHT:

game_active = False

如果蛇头撞到自己的身体,则游戏结束

for part in snake_parts:

if part == list(snake_head): continue

if part[0] == snake_head[0] and part[1] == snake_head[1]:

game_active = False

break

将蛇身和食物绘制到屏幕上,刷新屏幕显示结果

screen.fill(WHITE)

for part in snake_parts:

pygame.draw.rect(screen, WHITE, pygame.Rect(part[0], part[1], snake_size, snake_size))

pygame.draw.rect(screen, WHITE, pygame.Rect(food_x, food_y, food_size, food_size))

pygame.display.flip()

控制游戏速度,避免程序运行过快导致游戏体验不佳,同时保证游戏运行流畅度,避免卡顿现象发生。

clock.tick(60) # 每秒60帧,即每秒游戏画面更新60次。

```

按F5执行,报以下错误:

pygame 2.5.0 (SDL 2.28.0, Python 3.11.0)

Hello from the pygame community. https://www.pygame.org/contribute.html

Traceback (most recent call last):

File "E:\.py\snake.py", line 59, in <module>

snake_parts.pop()

IndexError: pop from empty list

通义千问

通义千问给出的代码:

```python

import pygame

import sys

import random

初始化 Pygame

pygame.init()

设置屏幕大小和标题

screen = pygame.display.set_mode((400, 400))

pygame.display.set_caption('Snaky')

设置游戏速度

clock = pygame.time.Clock()

蛇体、食物的大小

cell_size = 10

蛇的初始位置、方向和长度

snake_x = 200

snake_y = 200

snake_direction = 'right'

snake_length = 3

食物的初始位置

food_x = random.randint(0, 380 - cell_size)

food_y = random.randint(0, 380 - cell_size)

蛇移动的方向向量

right = (1, 0)

left = (-1, 0)

up = (0, -1)

down = (0, 1)

游戏是否结束

game_over = False

游戏主循环

while not game_over:

处理事件

for event in pygame.event.get():

if event.type == pygame.QUIT:

game_over = True

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_UP and snake_direction != 'down':

snake_direction = 'up'

elif event.key == pygame.K_DOWN and snake_direction != 'up':

snake_direction = 'down'

elif event.key == pygame.K_LEFT and snake_direction != 'right':

snake_direction = 'left'

elif event.key == pygame.K_RIGHT and snake_direction != 'left':

snake_direction = 'right'

更新蛇的位置

if snake_direction == 'right':

snake_x += cell_size

elif snake_direction == 'left':

snake_x -= cell_size

elif snake_direction == 'up':

snake_y -= cell_size

elif snake_direction == 'down':

snake_y += cell_size

检查蛇是否碰到墙壁或自己的身体

if snake_x < 0 or snake_x >= 400 - cell_size or snake_y < 0 or snake_y >= 400 - cell_size:

game_over = True

for i in range(snake_length - 1, -1, -1):

if snake_x == snake_body[i][0] and snake_y == snake_body[i][1]:

game_over = True

检查蛇是否吃到食物

if snake_x == food_x and snake_y == food_y:

food_x = random.randint(0, 380 - cell_size)

food_y = random.randint(0, 380 - cell_size)

snake_length += 1

snake_body.append((snake_x, snake_y))

绘制蛇和食物

screen.fill((0, 0, 0))

for i in range(snake_length):

pygame.draw.rect(screen, (255, 255, 255), (snake_body[i][0], snake_body[i][1], cell_size, cell_size))

pygame.draw.rect(screen, (0, 255, 0), (food_x, food_y, cell_size, cell_size))

更新屏幕

pygame.display.flip()

clock.tick(10)

退出 Pygame

pygame.quit()

sys.exit()

```

按F5执行,报以下错误:

pygame 2.5.0 (SDL 2.28.0, Python 3.11.0)

Hello from the pygame community. https://www.pygame.org/contribute.html

Traceback (most recent call last):

File "E:\.py\snake.py", line 67, in <module>

if snake_x == snake_body[i][0] and snake_y == snake_body[i][1]:

NameError: name 'snake_body' is not defined. Did you mean: 'snake_y'?

讯飞星火胜出!

只有讯飞星火未做任何修改,代码直接拿来就能运行,胜出!

但只说明仅此一个问题的胜出,并非就说讯飞整体就比其它两家强哦!


代码改进

简单做了2个小的优化改进:

  1. 代码细分为多个函数 init() repaint() quit_game() ......

  2. 游戏界面增加了方格线,使用pygame.draw.lines(),快速布点是关键:

定义线段端点坐标时,根据规律分别写x,y坐标的数据列表

x,y = (-1,640,640,-1)*16, []

for i in range(36):

for _ in range(2):

y.append(19+i*20)

zip()整合x,y为坐标Pair

points = list(zip(x,y))

完成代码

python 复制代码
import pygame
import sys
import random

# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED  = (255, 0, 0)
GREY = (211, 211, 211)  # 淡灰色

def init():
    global screen, screen_size
    global snake_pos, food_pos, snake_speed

    # 初始化pygame
    pygame.init()

    # 设置屏幕大小
    screen_size = (640, 480)
    screen = pygame.display.set_mode(screen_size)

    # 设置游戏标题
    pygame.display.set_caption("贪吃蛇")

    # 蛇的初始位置
    snake_pos = [[100, 100], [80, 100], [60, 100]]

    # 食物的初始位置
    food_pos = [300, 300]

    # 蛇的初始速度
    snake_speed = [20, 0]

def repaint():
    # 绘制游戏界面
    screen.fill(WHITE)

    # 定义线段的端点坐标
    x,y = (-1,640,640,-1)*16, []
    for i in range(36):
        for _ in range(2):
            y.append(19+i*20)

    # 使用pygame.draw.lines()函数绘制线段
    points = list(zip(x,y))
    pygame.draw.lines(screen, GREY, False, points, 1) # 线宽为1
    points = list(zip(y,x))
    pygame.draw.lines(screen, GREY, False, points, 1)   

    # 重画蛇和食物
    for pos in snake_pos:
        pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))
    pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))
    pygame.display.flip()

def game_quit():
    pygame.quit()
    sys.exit()

def main():
    global screen, screen_size
    global snake_pos, food_pos, snake_speed
    
    # 主循环
    while True:
        # 处理游戏事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    snake_speed = [0, -20]
                elif event.key == pygame.K_DOWN:
                    snake_speed = [0, 20]
                elif event.key == pygame.K_LEFT:
                    snake_speed = [-20, 0]
                elif event.key == pygame.K_RIGHT:
                    snake_speed = [20, 0]

        # 更新蛇的位置
        snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])

        # 检查蛇头是否碰到食物
        if snake_pos[0] == food_pos:
            food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]
        else:
            snake_pos.pop()

        # 检查蛇头是否碰到墙壁或者蛇身
        if snake_pos[0][0] < 0 or snake_pos[0][0] >= screen_size[0] or snake_pos[0][1] < 0 or snake_pos[0][1] >= screen_size[1] or snake_pos[0] in snake_pos[1:]:
            game_quit()
            '''
            此处可增加与用户的交互,如:
            if askyesno('title','again?'):
                init() # Yes to Play again
            else:
                game_quit() # No to Exit
            '''

        # 重画界面及蛇和食物
        repaint()

        # 控制游戏速度
        pygame.time.Clock().tick(10)

if __name__ == "__main__":

    init()
    main()

更多改进思路:

增加游戏的生命值,比如初始有3条蛇,死完后提示用户"重来"还是"退出游戏";

增加游戏的得分,比如每吃到一个食物,得分增加10分;结束时写入排行榜;

增加游戏背景音乐和声效,提高游戏可玩性......


擅长pygame编程的你,请继续

相关推荐
数据智能老司机18 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机19 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机19 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机19 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i20 小时前
drf初步梳理
python·django
每日AI新事件20 小时前
python的异步函数
python
这里有鱼汤21 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook1 天前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室1 天前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三1 天前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试