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

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


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

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

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

讯飞星火

讯飞星火给出的代码:

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

   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

   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))

完成代码

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编程的你,请继续

目录
相关文章
|
11月前
|
人工智能 自然语言处理 JavaScript
通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
通义灵码基于自然语言需求,快速生成完整Vue组件。例如,用Vue 2和JavaScript实现贪吃蛇游戏:包含键盘控制、得分系统、游戏结束判定与Canvas动态渲染。AI生成的代码符合规范,支持响应式数据与事件监听,还能进阶优化(如增加启停按钮、速度随分数提升)。传统需1小时的工作量,使用通义灵码仅10分钟完成,大幅提升开发效率。操作简单:安装插件、输入需求、运行项目即可实现功能。
524 4
 通义灵码2.5实战评测:Vue.js贪吃蛇游戏一键生成
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
718 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
214 6
|
12月前
|
Python 容器
[oeasy]python090_列表_构造_范围_range_start_end_step_步长
本文介绍了Python中列表的生成方法,重点讲解了`range()`函数的使用。通过`range(start, stop, step)`可生成一系列整数,支持正负步长,但不支持小数参数。文章从基础的列表追加、直接赋值到复杂的应用场景(如生成等宽字体的月份列表),结合实例演示了`range()`的灵活性与实用性。最后总结了`range()`的关键特性:前闭后开、支持负数步长,并提供了进一步学习的资源链接。
379 12
|
人工智能 小程序 程序员
【视频测评 DEMO 参考】VSCode 神级 AI 插件通义灵码:完全免费+实战教程+微信贪吃蛇小程序
VSCode 神级 AI 插件通义灵码:完全免费+实战教程+微信贪吃蛇小程序
1089 8
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
261 5
|
存储 弹性计算 搜索推荐
通义灵码实操—飞机大战游戏
在这个实践课程中,你将独立编写一个有趣的小游戏——“飞机大战”。借助通义灵码智能编程助手,你将从零开始,逐步构建一个个性化的游戏,体验编程的创造力和乐趣。通过学习 Pygame 库的使用,你不仅能掌握游戏开发的基本技能,还能深入了解游戏逻辑和图形界面的设计。快来加入我们,开启你的编程之旅吧!
352 11
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
484 7
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
191 3

推荐镜像

更多