Pygame开发贪吃蛇

news/2024/10/11 22:49:37 标签: pygame, python

Pygame专为Python设计,支持多平台(如Windows、Mac OS X、Linux、Android等),提供简单易用的API来创建2D游戏。它不仅仅局限于游戏开发,还可用于图形界面和音频应用。

Pygame提供了简洁的API,使得开发者可以快速上手并创建游戏原型。我花了几个小时学习,第二天就开发出了贪吃蛇的主体功能,代码不到100行。

我的设计思路和算法主要如下:

1、每次蛇移动,都先填充整个窗口背景,遮盖原来蛇的图形,然后在新的位置重新绘制,以达到蛇移动的视觉效果。

2、蛇身由多个小正方形组成,每次蛇移动,后面的小正方形便移动到前一个小正方形的当前位置上,以此类推,所以控制蛇身移动的方向,只要控制蛇头移动的方向即可。

3、当遇到窗口边缘时,蛇从另一边出来。

完整代码如下:

python">import pygame,sys
from random import randint

pygame.init()
screen = pygame.display.set_mode((800,600))
screen.fill((145,120,60))

alen = 20 #每一节蛇身体的边长
x_step = alen #x的步进值
y_step = 0  #y的步进值
food_rect = ()
#蛇身体由多个小正方形组成
snake = [(300,400,alen,alen),(280,400,alen,alen),(260,400,alen,alen),
         (240,400,alen,alen),(220,400,alen,alen),(200,400,alen,alen)]
last_snake=[]
    
def move_head():
    '''到达窗口边界就从另外一边出来'''
    r = snake[0]#蛇头
    if (r[0]==(screen.get_width())) and last_snake[1][0]+alen==r[0]: #向右到达右边界
        snake[0] = (0,r[1],r[2],r[3])   
    elif r[0]==0 and last_snake[1][0]==r[0]+alen: #向左到达左边界
        snake[0] = (screen.get_width()-alen,r[1],r[2],r[3])
    elif r[1]==(screen.get_height()) and last_snake[1][1]+alen==r[1]: #向下到达下边界
        snake[0] = (r[0],0,r[2],r[3])
    elif r[1]==0 and last_snake[1][1]==r[1]+alen: #向上到达上边界
        snake[0] = (r[0],screen.get_height()-alen,r[2],r[3])    
    else:
        snake[0] = (r[0]+x_step,r[1]+y_step,r[2],r[3])
    

def move():
    '''蛇前进,每一节蛇身体的下一个坐标是它的前一节身体的当前坐标'''
    global x_step,y_step,last_snake    
    pygame.time.delay(300)      
    last_snake = snake.copy()    
    for i in range(len(snake)-1,-1,-1):
        if i>0:
            snake[i] = snake[i-1]            
    move_head()                  
    draw_snake()
        
def draw_snake():
    for s in snake:
        pygame.draw.rect(screen,(0,0,255),s)
    
def draw_food():
    global food_rect
    if len(food_rect)==0:
        xf = randint(1,screen.get_width())//alen*alen  #食物出现的位置应被alen整除
        yf = randint(1,screen.get_height())//alen*alen
        food_rect = (xf,yf,alen,alen)
    pygame.draw.rect(screen,(255,0,0),food_rect)
    
def eat():
    global snake,last_snake,food_rect
    if snake[0]==food_rect:
        last_snake.insert(0,food_rect)
        snake = last_snake.copy()
        food_rect = ()
        return True
    else:
        return False

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:
                x_step = 0
                y_step = -alen
            elif event.key == pygame.K_RIGHT:
                x_step = alen
                y_step = 0
            elif event.key == pygame.K_LEFT:
                x_step = -alen
                y_step = 0
            elif event.key == pygame.K_DOWN:
                x_step = 0
                y_step = alen

    screen.fill((145,120,60)) #填充背景,抹掉上一次的绘图
    draw_food()
    if eat():
        draw_snake()
    else:
        move()
           
    pygame.display.flip()


http://www.niftyadmin.cn/n/5700324.html

相关文章

lnmp - RBAC方案设计与实现

概述 实践的是一套企业内部使用后台OA管理系统,对这套系统设计的RBAC(Role-Based Access Control,基于角色的访问控制),RBAC 方案旨在通过将后台用户与角色进行关联,再将角色与权限进行关联,实现对系统资源…

Android15之解决:Dex checksum does not match for dex:services.jar问题(二百三十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

CV方法再学习

轻量化模型 Mobile系列(V1~V3) MobileNetV1 MobileNetV1之所以轻量,与深度可分离卷积的关系密不可分 深度可分离卷积 主要是两种卷积变体组合使用,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise C…

Java的IO操作与文件的基本常识

首先什么是IO操作呢? IO操作其实解释操作硬盘 1. 文件系统操作 创建文件,删除文件,重命名文件,创建目录…操作 2. 文件内容操作 进行读与写操作 先来了解一下基本的文件知识方便学习接下来的IO操作 文件路径 文件路径是从数根节点触发,沿着树杈一直往下走,到达目标文件…

[SQL] 数据库增删改操作

一 增加 关键字: insert注意: 插入的数据如果是: 字符串和日期类型数据需要包含在单引号内。 1.1 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...); 1.2 给全部字段添加数据 不指定字段名时要添加所有字段并且值一一对应。即使…

『网络游戏』进入游戏主城UI跳转主城【26】

首先在Unity客户端中创建一个空节点重命名为MainCityWnd 设置父物体为全局 创建空节点钉在左上角作为角色信息UI 在钉子下创建Image 创建脚本:MainCityWnd.cs 编写脚本:MainCityWnd.cs 挂载脚本 创建脚本:MainCitySys.cs 编写脚本&#xff1a…

CDN绕过学习

1.什么是CDN? CDN就是分布在各个地区的服务器,这些服务器储存着数据的副本。 哪些服务器比较接近你,当你发起请求时,提前就会快速为你提供服务。 总结来说就是: 其实就是用来加速访问的,以及缓解压力&a…

vue基础语法的用法(API组合式风格)

一、项目文件结构 .vscode我们在那个编辑器中编辑时就会有对应的这个文件夹,不是固定的 进行编写代码前先把资源自带的页面删除,以防误导,可以像我一样的删除内容 vue文件结构 二、你好 vue el插值 script代码 v-text插值 script代码 三、…