pygame制作贪吃蛇

这篇具有很好参考价值的文章主要介绍了pygame制作贪吃蛇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

综述

制作前的分析

面向对象和面向过程

对象相关(地图,蛇,食物)

地图和墙体的绘制

蛇的绘制

食物的绘制

总结

代码

游戏的基础(gamebase.py)

引用

一些基础参数的设置

颜色

点类(方块元素)

文本类

游戏主体(snake.py)

引用

基础参数(其实可以加到gamebase里)

一些函数

食物生成

画图

方块

圆形

初始化函数

游戏主体

暂停功能

死亡判断

正常游戏操作

按键监听相关

吃东西相关

移动和检测

渲染和绘制

完整代码

gamebase.py

snake.py

总结


综述

Pygame是一个简单而强大的Python库,用于开发2D游戏。它提供了一系列工具和函数,帮助开发者轻松实现游戏的图形渲染、鼠标键盘事件处理、音频播放等功能。

而笔者今天分享的就是一个简单的贪吃蛇小游戏,也是适合很多python新手刚开始做的项目实践。

笔者python能力有限,主要更多的是学习c#和unity相关,可能会有一些考虑不周全的地方,希望大家批评指正。

另外就是代码管理上确实有很大的问题,希望大家见谅,因为这是初学的时候弄的,有些习惯没养成好。

制作前的分析

编程之前我们先来了解一下什么事面向过程和面向对象的区别。

面向对象和面向过程

面向对象和面向过程是两种不同的编程思想。面向对象是一种以对象为中心的编程方式,它将程序视为一组相互作用的对象,每个对象都有自己的属性和方法。面向过程则是一种以过程为中心的编程方式,它将程序视为一系列的步骤或者过程,通过控制流来实现功能。

具体来说,面向对象的编程语言(如Java、C++)提供了类和对象的概念,允许开发者通过定义类来创建对象,并以对象之间的交互来实现程序的功能。面向对象编程的特点包括封装、继承和多态,它能够更好地模拟和解决现实世界中的问题。

而面向过程的编程语言(如C)则更加注重算法和步骤的流程,通过函数或过程来实现功能。面向过程的特点包括过程的顺序执行和数据的共享,它更适合处理一些简单的、线性的问题。

总体而言,面向对象的编程方式更加灵活、可扩展,能够更好地应对大型项目的开发,而面向过程则更加简单、直观,适用于一些简单的问题。不同的编程任务和需求会决定选择哪种编程方式。

而我们在本次项目的开展的时候也会运用到一些面向对象的思路,面相对象的本质其实是提高写代码和分析需求的效率。

对象相关(地图,蛇,食物)

地图和墙体的绘制

对于这样一个游戏,我们肯定要优先构造一个画布,也就是背景板,然后我们再来进行不管是墙体还是蛇或者食物的绘制。

学习了python我们自然而然就会联想到turtle函数,那样当然也可以,但是相对pygame来说有些功能就不能轻松实现。

蛇的绘制

然后就是我们的主人公蛇,它需要达到的功能有哪些:首先是移动,然后是能够吃食物,吃食物还会变长,如果可能我们还可以引入计分,撞墙或者撞自己会死。

食物的绘制

食物需要实现的功能比较简单:要能出现在地图上,要能被吃,吃了要随机生成。如果你想我们还可以加入不同的果子进行游戏性的提高。

总结

不难发现,其实我们从一开始就可以把地图分为一个个方块,然后将每一个方块当成组成所有东西的元素。

那么我们要开发的思路就有了:

1.游戏开始,生成地图并生成墙;
2.生成蛇,包括初始化蛇位置、长度和初始运动方向;
3.生成食物,可以加入几种不同的食物;
4.接收到玩家改变运动方向的指令;
5.当蛇头下一步就要吃到食物时,蛇的长度加一,同时生成新的食物;
6.引入计分板还有提示板,可以让玩家重启游戏,和暂停游戏。

代码

游戏的基础(gamebase.py)

引用

import pygame
from time import sleep

一些基础参数的设置

颜色

具体要用什么颜色也可以自己去查一查

bg_color=(255,255,255) #背景颜色 白色
apple_color=(255,0,0) #红色
snake_color=(200,200,200) #灰
blueberry_color=(0,0,255) #蓝色
score_text_color=(0,0,0)
orange_color=(255,166,0)
head_color=(0,0,0) #黑色
tip_text_color=(255,10,10)#不一样的红

点类(方块元素)

设置方块的长宽,以及拷贝的基础行为

class Point:
       row=0
       col=0
       def __init__(self,row,col):
            self.row=row
            self.col=col
       def copy(self):#拷贝,跟蛇的复制有关
              return Point(row=self.row,col=self.col)

文本类

既然我们要使用计分板和提示信息这种东西,必然有一个写文字的需求,所以我们一并在这里设置了。

关于那个字体,你想用啥就用啥,可能很多朋友没有我用的这种字体。

class Label(object):
      ###标签文本###

      def __init__(self,size=40,score=True):
            ###初始化标签信息###
            self.font = pygame.font.SysFont('方正仿宋gbk',size,italic=True)
            self.score = score

      def draw(self,window,text):
            ###绘制当前对象的内容###
            ###渲染字体,形成图片

            color = score_text_color if self.score else tip_text_color
            text_surface = self.font.render(text,True,color)
            ###获取文本矩形
            text_rect=text_surface.get_rect()
            ###获取窗口矩形
            window_rect=window.get_rect()
            ###修改位置
            '''text_rect.y=window_rect.height-text_rect.height
               text_rect.x=window_rect.width-text_rect.width
               意思相同
               '''

            if self.score:
                  text_rect.bottomright=window_rect.bottomright
            else:
                  text_rect.center=window_rect.center

            ###true对应的抗锯齿,一般文本的抗锯齿对现在的电脑要求不大,所以开启
            window.blit(text_surface,text_rect)

游戏主体(snake.py)

引用

import pygame
import random
from gamebase import *
from time import sleep

基础参数(其实可以加到gamebase里)

snake用的是一个数组在装,然后相关的特殊函数如果有不理解建议去查询一下,或者多看注释。

###初始化,定义,或者参数
pygame.init()
W=800
H=600
#定义坐标
Row=60
Col=80
score_label=Label()
score=0
t=20##运行速度相关
is_run=True###游戏是否正常运行的判断
is_pause=False###游戏是否暂停的判断
tip_label=Label(50,False)
dead=False
berry_jugement=0###蓝莓的生成判定
orange_jugement=0###橘子的生成判定
FOOD_UPDATE_EVENT=pygame.USEREVENT###蓝莓更新事件标志
Orange_UPDATE_EVENT=pygame.USEREVENT+1####
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('贪吃蛇 0.03')

direct='left'  ###left,right,up,down
head=Point(row=int(Row/2),col=int(Col/2))
snakes=[Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+2)]

一些函数

食物生成

食物生成的时候应该和蛇的身体遍历判断一下是否重合,如果重合,就应该重新生成

###食物生成
def gen_food():
       while 1:
            pos=Point(row=random.randint(0,Row-1),col=random.randint(0,Col-1))
            is_coll=False

            if head.row==pos.row and head.col==pos.col:
                   is_coll=True
            for snake in snakes:
                   if snake.row==pos.row and snake.col==pos.col:
                          is_coll=True
                          break
            if not is_coll:
                   break
       return pos
###下面的不是函数,但是也是和食物生成相关的,所以都放在这里了
apple=gen_food()
orange=gen_food()
pygame.time.set_timer(FOOD_UPDATE_EVENT,8000)
pygame.time.set_timer(Orange_UPDATE_EVENT,2000)

画图

使用类进行一些基础的构造便于使用

方块

##画图函数定义
def rect(point,color):
       cell_width=(W/Col)
       cell_hegiht=(H/Row)
       left=point.col*cell_width
       top=point.row*cell_hegiht

       pygame.draw.rect(window,color,(left,top,cell_width,cell_hegiht))

圆形

def rect_circle(point,color):
       width=5
       radius=5
       cell_width=(W/Col)
       cell_hegiht=(H/Row)
       left=point.col*cell_width
       top=point.row*cell_hegiht

       pygame.draw.circle(window,color,(left+5,top+5), radius,width)

初始化函数

可以写清楚一点变量,我这里偷了懒,只有一些赋值。

def reset_game():
      a = 0
      b = 0
      c = True
      d = False
      e = 0
      return a,b,c,d,e

游戏主体

大致分为三个版块开发,接下来笔者会每个版块都进行讲解,其实这些都可以适当封装成函数,不过因为笔者的管理能力不够,导致当初开发的时候没有注意到这个问题,见谅。

clock=pygame.time.Clock()#用于时间事件的监控
while True:
    if is_pause:...
    if dead:...
    while not is_pause and not dead:...

暂停功能

if is_pause:
              for event in pygame.event.get():
                     if event.type==pygame.QUIT:
                            print("点击了关闭按钮")#用于调试
                            quit()
                     elif event.type==pygame.KEYDOWN:
                            if event.key==pygame.K_SPACE:
                                          is_pause=not is_pause

死亡判断

if dead:
              for event in pygame.event.get():
                     if event.type==pygame.QUIT:
                            print("点击了关闭按钮")
                            quit()
                     elif event.type==pygame.KEYDOWN:
                            if event.key==pygame.K_SPACE:#游戏结束后的初始化
                                          dead= not dead
                                          berry_jugement,score,is_run,is_pause,orange_jugement=reset_game()#
                                          head=Point(row=int(Row/2),col=int(Col/2))
                                          snakes=[Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+2)]
                                          direct='left'

正常游戏操作

       while not is_pause and not dead:
                     for event in pygame.event.get():
                            if event.type==pygame.QUIT:
                                   print("点击了关闭按钮")
                                   quit()
                            elif event.type==pygame.KEYDOWN:
                                   print(event)
                    #移动的键盘控制
                                   if event.key==pygame.K_ESCAPE:
                                          print("按下了ESC键")
                                          quit()
                                   if event.key==pygame.K_SPACE:

                                          if is_run==False:
                                                 print("按下空格游戏重新开始")
                                                 ###重置原始数据
                                                 berry_jugement,score,is_run,is_pause,orange_jugement=reset_game()
                                                 head=Point(row=int(Row/2),col=int(Col/2))
                                                 snakes=[Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+2)]
                                                 direct='left'
                                          else: 
                                                 is_pause=not is_pause          
                                             
                                   if event.key==119 or event.key==1073741906:
                                          if direct=='left' or direct=='right':
                                                 direct='up'
                                   if event.key==115 or event.key==1073741905:
                                          if direct=='left' or direct=='right':
                                                 direct='down'
                                   if event.key==97 or event.key==1073741904:
                                          if direct=='up' or direct=='down':
                                                 direct='left'
                                   if event.key==100 or event.key==1073741903:
                                          if direct=='up' or direct=='down':
                                                 direct='right'
                            if is_run and not is_pause and berry_jugement==4:
                                   if event.type==FOOD_UPDATE_EVENT:
                                          apple=gen_food()
                                          berry_jugement=0
                            if is_run and not is_pause and orange_jugement==9:
                                   if event.type==Orange_UPDATE_EVENT:
                                          orange=gen_food()

                                          
              #暂停的键盘控制和鼠标控制                           
              ###elif pygame.MOUSEBUTTONDOWN:
                
              #吃东西
                     eat=(head.row==apple.row and head.col==apple.col)
                     eat_orange=(head.row==orange.row and head.col==orange.col)

                     if eat:
                            score+=1
                            berry_jugement+=1
                            if orange_jugement<9:
                                   orange_jugement+=1
                            if berry_jugement==5:
                                   score+=5
                                   berry_jugement=0
                            apple=gen_food()
                            if orange_jugement==9:
                                   orange=gen_food()
                     if eat_orange:
                            score+=15
                            orange_jugement=0




                     #先处理身子
                     #1.把原来点头插入到snake的头上
                     snakes.insert(0,head.copy())
                     #2.尾巴删掉
                     if not eat:
                            snakes.pop()

                     #移动
                     if direct=='left':
                            head.col-=1
                     elif direct=='right':
                            head.col+=1
                     elif direct=='up':
                            head.row-=1
                     elif direct=='down':
                            head.row+=1
                     #检测
                     #1.撞墙(日后可能要修改成程序设定的墙体,而不是程序边框,而当蛇到达边框的时候,应该从另一头出来)
                     if head.col<0 or head.col>=Col or head.row<0 or head.row>=Row:
                            dead=True
                     #2.撞自己
                     for snake in snakes:
                            if head.col==snake.col and head.row==snake.row:
                                   dead=True
                                   break
                     if dead:
                            is_run=False
                            dead=True
              

                     #渲染——画出来
                     #背景
                     pygame.draw.rect(window,bg_color,(0,0,W,H))

                     ###绘制得分板
                     score_label.draw(window,"得分:%d"%score)

                     ###绘制暂停标签
                     if is_run==False:
                            tip_label.draw(window,"按下空格游戏重新开始")
                     if is_pause:
                            tip_label.draw(window,"游戏暂停,按下空格,游戏重新开始")

                     #蛇
                     for snake in snakes:
                            rect(snake,snake_color)
                     if not dead:
                            rect(head,head_color)
                     else:
                            rect(head,apple_color)
                     #生成食物
                     if berry_jugement<=3:
                            rect_circle(apple,apple_color)
                     #蓝莓会在一定的时间后消失然后重新生成,需要加入一个时钟来判断和计分,属于奖励机制,如果可能,需要学习闪烁或者缩放的表现形式
                     else:
                            rect_circle(apple,blueberry_color)
                     if orange_jugement==9:
                            rect_circle(orange,orange_color)
                     #更新画面到屏幕上
                     pygame.display.flip()

                     #设置帧频
                     clock.tick(20) #

因为这一块的东西最多,接下来做细节的拆解

按键监听相关

目前暂时只能实现关闭还有暂停以及基本的移动,如果考虑改良,可以加入加速还有鼠标控制。

for event in pygame.event.get():
                            if event.type==pygame.QUIT:
                                   print("点击了关闭按钮")
                                   quit()
                            elif event.type==pygame.KEYDOWN:
                                   print(event)
                    #移动的键盘控制
                                   if event.key==pygame.K_ESCAPE:
                                          print("按下了ESC键")
                                          quit()
                                   if event.key==pygame.K_SPACE:

                                          if is_run==False:
                                                 print("按下空格游戏重新开始")
                                                 ###重置原始数据
                                                 berry_jugement,score,is_run,is_pause,orange_jugement=reset_game()
                                                 head=Point(row=int(Row/2),col=int(Col/2))
                                                 snakes=[Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+2)]
                                                 direct='left'
                                          else: 
                                                 is_pause=not is_pause          
                                             #键盘↑,↓,←,→,w,s,a,d的设置
                                   if event.key==119 or event.key==1073741906:
                                          if direct=='left' or direct=='right':
                                                 direct='up'
                                   if event.key==115 or event.key==1073741905:
                                          if direct=='left' or direct=='right':
                                                 direct='down'
                                   if event.key==97 or event.key==1073741904:
                                          if direct=='up' or direct=='down':
                                                 direct='left'
                                   if event.key==100 or event.key==1073741903:
                                          if direct=='up' or direct=='down':
                                                 direct='right'
                                        ###特殊食物;蓝莓和橘子的判断
                            if is_run and not is_pause and berry_jugement==4:
                                   if event.type==FOOD_UPDATE_EVENT:#如果超时,蓝莓会消失
                                          apple=gen_food()
                                          berry_jugement=0
                            if is_run and not is_pause and orange_jugement==9:
                                   if event.type==Orange_UPDATE_EVENT:
                                          orange=gen_food()
              #鼠标控制思路:                           
              ###elif pygame.MOUSEBUTTONDOWN:

吃东西相关

              #吃东西
                     eat=(head.row==apple.row and head.col==apple.col)#判断位置是否重合
                     eat_orange=(head.row==orange.row and head.col==orange.col)

                     if eat:#分数相关
                            score+=1
                            berry_jugement+=1
                            if orange_jugement<9:
                                   orange_jugement+=1
                            if berry_jugement==5:
                                   score+=5
                                   berry_jugement=0
                            apple=gen_food()
                            if orange_jugement==9:
                                   orange=gen_food()
                     if eat_orange:
                            score+=15
                            orange_jugement=0
                     #先处理身子
                     #1.把原来点头插入到snake的头上
                     snakes.insert(0,head.copy())
                     #2.尾巴删掉
                     if not eat:
                            snakes.pop()

移动和检测

移动思路其实就是变换坐标,然后死亡机制有两种,一种是撞你设定的墙(我们这里没有就用的边界,如果以后你要自己绘制地图可以重新用类定义一个墙出来),一种是撞自己,就是通过遍历检测头的坐标是否和身体重合。

如果你想实现切换模式,其实很简单,做一个菜单供选择,然后无墙体模式需要考虑的就是穿墙,其实就是把头的坐标移到屏幕最左侧。

模式切换相当于一个分支。

#移动
                     if direct=='left':
                            head.col-=1
                     elif direct=='right':
                            head.col+=1
                     elif direct=='up':
                            head.row-=1
                     elif direct=='down':
                            head.row+=1
                     #检测
                     #1.撞墙(日后可能要修改成程序设定的墙体,而不是程序边框,而当蛇到达边框的时候,应该从另一头出来)
                     if head.col<0 or head.col>=Col or head.row<0 or head.row>=Row:
                            dead=True
                     #2.撞自己
                     for snake in snakes:
                            if head.col==snake.col and head.row==snake.row:
                                   dead=True
                                   break
                     if dead:
                            is_run=False
                            dead=True

渲染和绘制

目前为止我们只是在逻辑上实现贪吃蛇的行为,但是还没有画出来,而最后这个版块就是关键的显示。

#渲染——画出来
                     #背景
                     pygame.draw.rect(window,bg_color,(0,0,W,H))

                     ###绘制得分板
                     score_label.draw(window,"得分:%d"%score)

                     ###绘制暂停标签
                     if is_run==False:
                            tip_label.draw(window,"按下空格游戏重新开始")
                     if is_pause:
                            tip_label.draw(window,"游戏暂停,按下空格,游戏重新开始")

                     #蛇
                     for snake in snakes:
                            rect(snake,snake_color)
                     if not dead:
                            rect(head,head_color)
                     else:
                            rect(head,apple_color)
                     #生成食物
                     if berry_jugement<=3:
                            rect_circle(apple,apple_color)
                     #蓝莓会在一定的时间后消失然后重新生成,需要加入一个时钟来判断和计分,属于奖励机制,如果可能,需要学习闪烁或者缩放的表现形式
                     else:
                            rect_circle(apple,blueberry_color)
                     if orange_jugement==9:
                            rect_circle(orange,orange_color)
                     #更新画面到屏幕上
                     pygame.display.flip()

                     #设置帧频
                     clock.tick(20) #
                     
              #收尾工作

完整代码

到了你们最喜欢的环节

tips:因为我是进行了迭代的开发,之前用的turtle库写的,所以有些部分是老版本的,你要学会自己辨析。

gamebase.py

from turtle import *
import pygame
from time import sleep

###turtle 函数初代版本,留作纪念
def square(x,y,size,color_name):
    up()
    goto(x,y)
    down()
    color(color_name)
    begin_fill()

    forward(size)
    left(90)
    forward(size)
    left(90)
    forward(size)
    left(90)
    forward(size)
    left(90)

    end_fill()
    """填充"""


#gamepy 贪吃蛇主要函数
bg_color=(255,255,255) #背景颜色 白色
apple_color=(255,0,0) #红色
snake_color=(200,200,200) #灰
blueberry_color=(0,0,255) #蓝色
score_text_color=(0,0,0)
orange_color=(255,166,0)
head_color=(0,0,0) #黑色
tip_text_color=(255,10,10)#不一样的红

class Point:
       row=0
       col=0
       def __init__(self,row,col):
            self.row=row
            self.col=col
       def copy(self):#拷贝,跟蛇的复制有关
              return Point(row=self.row,col=self.col)
        
class Label(object):
      ###标签文本###

      def __init__(self,size=40,score=True):
            ###初始化标签信息###
            self.font = pygame.font.SysFont('方正仿宋gbk',size,italic=True)
            self.score = score

      def draw(self,window,text):
            ###绘制当前对象的内容###
            ###渲染字体,形成图片

            color = score_text_color if self.score else tip_text_color
            text_surface = self.font.render(text,True,color)
            ###获取文本矩形
            text_rect=text_surface.get_rect()
            ###获取窗口矩形
            window_rect=window.get_rect()
            ###修改位置
            '''text_rect.y=window_rect.height-text_rect.height
               text_rect.x=window_rect.width-text_rect.width
               意思相同
               '''

            if self.score:
                  text_rect.bottomright=window_rect.bottomright
            else:
                  text_rect.center=window_rect.center

            ###true对应的抗锯齿,一般文本的抗锯齿对现在的电脑要求不大,所以开启
            window.blit(text_surface,text_rect)


    

snake.py

import pygame
import random
from gamebase import *
from time import sleep

###初始化,定义,或者参数
pygame.init()
W=800
H=600
#定义坐标
Row=60
Col=80
score_label=Label()
score=0
t=20
is_run=True###游戏是否正常运行的判断
is_pause=False###游戏是否暂停的判断
tip_label=Label(50,False)
dead=False
berry_jugement=0
orange_jugement=0###等待开发
FOOD_UPDATE_EVENT=pygame.USEREVENT###蓝莓更新事件标志
Orange_UPDATE_EVENT=pygame.USEREVENT+1####
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('贪吃蛇 0.03')

direct='left'  ###left,right,up,down
head=Point(row=int(Row/2),col=int(Col/2))
snakes=[Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+2)]
###食物生成
def gen_food():
       while 1:
            pos=Point(row=random.randint(0,Row-1),col=random.randint(0,Col-1))
            is_coll=False

            if head.row==pos.row and head.col==pos.col:
                   is_coll=True
            for snake in snakes:
                   if snake.row==pos.row and snake.col==pos.col:
                          is_coll=True
                          break
            if not is_coll:
                   break
       return pos
apple=gen_food()
orange=gen_food()
pygame.time.set_timer(FOOD_UPDATE_EVENT,8000)
pygame.time.set_timer(Orange_UPDATE_EVENT,2000)

##画图函数定义
def rect(point,color):
       cell_width=(W/Col)
       cell_hegiht=(H/Row)
       left=point.col*cell_width
       top=point.row*cell_hegiht

       pygame.draw.rect(window,color,(left,top,cell_width,cell_hegiht))

def rect_circle(point,color):
       width=5
       radius=5
       cell_width=(W/Col)
       cell_hegiht=(H/Row)
       left=point.col*cell_width
       top=point.row*cell_hegiht

       pygame.draw.circle(window,color,(left+5,top+5), radius,width)
       
def reset_game():
      a = 0
      b = 0
      c = True
      d = False
      e = 0
      return a,b,c,d,e
      

###游戏循环
clock=pygame.time.Clock()
while True:
       #处理事件,事件监听
       if is_pause:
              for event in pygame.event.get():
                     if event.type==pygame.QUIT:
                            print("点击了关闭按钮")
                            quit()
                     elif event.type==pygame.KEYDOWN:
                            if event.key==pygame.K_SPACE:
                                          is_pause=not is_pause
       if dead:
              for event in pygame.event.get():
                     if event.type==pygame.QUIT:
                            print("点击了关闭按钮")
                            quit()
                     elif event.type==pygame.KEYDOWN:
                            if event.key==pygame.K_SPACE:
                                          dead= not dead
                                          berry_jugement,score,is_run,is_pause,orange_jugement=reset_game()
                                          head=Point(row=int(Row/2),col=int(Col/2))
                                          snakes=[Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+2)]
                                          direct='left'
       while not is_pause and not dead:
                     for event in pygame.event.get():
                            if event.type==pygame.QUIT:
                                   print("点击了关闭按钮")
                                   quit()
                            elif event.type==pygame.KEYDOWN:
                                   print(event)
                    #移动的键盘控制
                                   if event.key==pygame.K_ESCAPE:
                                          print("按下了ESC键")
                                          quit()
                                   if event.key==pygame.K_SPACE:

                                          if is_run==False:
                                                 print("按下空格游戏重新开始")
                                                 ###重置原始数据
                                                 berry_jugement,score,is_run,is_pause,orange_jugement=reset_game()
                                                 head=Point(row=int(Row/2),col=int(Col/2))
                                                 snakes=[Point(row=head.row,col=head.col+1),Point(row=head.row,col=head.col+2),Point(row=head.row,col=head.col+2)]
                                                 direct='left'
                                          else: 
                                                 is_pause=not is_pause          
                                             
                                   if event.key==119 or event.key==1073741906:
                                          if direct=='left' or direct=='right':
                                                 direct='up'
                                   if event.key==115 or event.key==1073741905:
                                          if direct=='left' or direct=='right':
                                                 direct='down'
                                   if event.key==97 or event.key==1073741904:
                                          if direct=='up' or direct=='down':
                                                 direct='left'
                                   if event.key==100 or event.key==1073741903:
                                          if direct=='up' or direct=='down':
                                                 direct='right'
                            if is_run and not is_pause and berry_jugement==4:
                                   if event.type==FOOD_UPDATE_EVENT:
                                          apple=gen_food()
                                          berry_jugement=0
                            if is_run and not is_pause and orange_jugement==9:
                                   if event.type==Orange_UPDATE_EVENT:
                                          orange=gen_food()

                                          
              #暂停的键盘控制和鼠标控制                           
              ###elif pygame.MOUSEBUTTONDOWN:
                
              #吃东西
                     eat=(head.row==apple.row and head.col==apple.col)
                     eat_orange=(head.row==orange.row and head.col==orange.col)

                     if eat:
                            score+=1
                            berry_jugement+=1
                            if orange_jugement<9:
                                   orange_jugement+=1
                            if berry_jugement==5:
                                   score+=5
                                   berry_jugement=0
                            apple=gen_food()
                            if orange_jugement==9:
                                   orange=gen_food()
                     if eat_orange:
                            score+=15
                            orange_jugement=0




                     #先处理身子
                     #1.把原来点头插入到snake的头上
                     snakes.insert(0,head.copy())
                     #2.尾巴删掉
                     if not eat:
                            snakes.pop()

                     #移动
                     if direct=='left':
                            head.col-=1
                     elif direct=='right':
                            head.col+=1
                     elif direct=='up':
                            head.row-=1
                     elif direct=='down':
                            head.row+=1
                     #检测
                     #1.撞墙(日后可能要修改成程序设定的墙体,而不是程序边框,而当蛇到达边框的时候,应该从另一头出来)
                     if head.col<0 or head.col>=Col or head.row<0 or head.row>=Row:
                            dead=True
                     #2.撞自己
                     for snake in snakes:
                            if head.col==snake.col and head.row==snake.row:
                                   dead=True
                                   break
                     if dead:
                            is_run=False
                            dead=True
              

                     #渲染——画出来
                     #背景
                     pygame.draw.rect(window,bg_color,(0,0,W,H))

                     ###绘制得分板
                     score_label.draw(window,"得分:%d"%score)

                     ###绘制暂停标签
                     if is_run==False:
                            tip_label.draw(window,"按下空格游戏重新开始")
                     if is_pause:
                            tip_label.draw(window,"游戏暂停,按下空格,游戏重新开始")

                     #蛇
                     for snake in snakes:
                            rect(snake,snake_color)
                     if not dead:
                            rect(head,head_color)
                     else:
                            rect(head,apple_color)
                     #生成食物
                     if berry_jugement<=3:
                            rect_circle(apple,apple_color)
                     #蓝莓会在一定的时间后消失然后重新生成,需要加入一个时钟来判断和计分,属于奖励机制,如果可能,需要学习闪烁或者缩放的表现形式
                     else:
                            rect_circle(apple,blueberry_color)
                     if orange_jugement==9:
                            rect_circle(orange,orange_color)
                     #更新画面到屏幕上
                     pygame.display.flip()

                     #设置帧频
                     clock.tick(20) #
                     
              #收尾工作

总结

其实有很多大的小的问题,代码冗杂也好还是开发思路不完整,其实都是因为初学的原因,希望大家也能从我这个不太完善的小项目里得到一点收获吧。如果有什么问题也欢迎在评论区和我讨论。

后续我可能更多会更新面向游戏的一些代码帖子(比如c#),主要还是想通过告诉别人来提升自己,能力有限。

当然我还是希望你们在写这些项目的时候,除了思考怎么实现的,更多的是去思考怎么做的更好,那样才会有真正的水平提高。

如果感觉很难,可以看我另一个博客,里面有一个turtle函数做的相对简单的贪吃蛇。文章来源地址https://www.toymoban.com/news/detail-860836.html

到了这里,关于pygame制作贪吃蛇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 100个Python实战项目(九)制作贪吃蛇游戏(评论抽奖送书)

    💂 个人网站:【海拥】【摸鱼小游戏】【开发文档导航】 🤟 风趣幽默的人工智能学习网站:👉人工智能 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 💬 免费且实用的计算机相关知识题库:👉进来逛逛 给大家安利一个免费且实用的 Python 刷题(面经大全

    2024年02月01日
    浏览(49)
  • Python制作AI贪吃蛇,很多很多细节、思路都写下来了!

    前提:本文实现AI贪吃蛇自行对战,加上人机对战,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都一样) 1.智能模式:电脑自己玩(自己吃食物) 2.人机对战:电脑和人操作(在上步的基础上加一个键盘控制的贪吃蛇即可

    2024年02月05日
    浏览(29)
  • 【python】 pygame学习示例 --飞机大战小游戏制作

    python版本:3.8.5 所需模块:pygame random os pygame版本:20.1 开发环境:pycharm专业版 硬件环境:win11 8G内存以上 使用python的第三方库–pygame 制作飞机大战小游戏 小游戏的内容包括: 玩家player的移动 子弹的发射 陨石的随机掉落(包括旋转 大小 下落角度) 玩家 子弹 陨石的碰撞交互

    2024年02月04日
    浏览(41)
  • Python学习之pygame模块介绍并制作代码雨

    对Python游戏有所了解的朋友都知道,在2D的游戏制作中,经常会用到一个模块pygame,他能帮助我们实现很多方便使用的功能,例如绘制窗口,反馈键盘鼠标信息,播放音频文件,渲染图片文字等等功能。 今天咱们通过pygame模块实现一个代码雨的简单示例,顺便讲解下子模块中

    2024年02月10日
    浏览(46)
  • 使用 Python 和 Pygame 制作游戏:第九章到第十章

    原文: inventwithpython.com/pygame/chapter9.html 译者:飞龙 协议:CC BY-NC-SA 4.0           推星星是 Sokoban 或“箱子推动者”的克隆。玩家位于一个房间,里面有几颗星星。房间中的一些瓷砖精灵上有星星标记。玩家必须想办法将星星推到有星星标记的瓷砖上。如果墙壁或其他星星

    2024年01月22日
    浏览(51)
  • 使用 Python 和 Pygame 制作游戏:第一章到第五章

    原文: inventwithpython.com/pygame/chapter1.html 译者:飞龙 协议:CC BY-NC-SA 4.0 在阅读本书之前,如果您了解一些 Python 编程知识(或者知道如何使用 Python 之外的其他语言进行编程),可能会有所帮助;但是即使您没有,您仍然可以阅读本书。编程并不像人们想象的那么难。如果您遇

    2024年01月17日
    浏览(48)
  • Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码)

    Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码) 又是一年中秋至一花好月 圆夜,佳文当共鉴。Python+ pygame制作拼图小游戏; 制作一个自己的拼图小游戏,看看几步可以观赏到月亮。 官方活动入口 ​ 本文档是对Python语言制作拼图小游戏界面功能需求进行分析归

    2023年04月09日
    浏览(35)
  • 小游戏实战丨基于PyGame的贪吃蛇小游戏

    本期内容:基于pygame的贪吃蛇小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700188 实验环境 python3.11及以上 pycharm pygame 安装pygame的命令: pygame是一个开源的Python模块,专门用于编写电子游戏。它使用简单、功能强大,因此非常适合初学者入门。pygame的主要特点包括图

    2024年02月03日
    浏览(37)
  • ChatGPT4写贪吃蛇游戏(Notion)[pygame的学习]

    这里我使用的是Notion写出来的贪吃蛇,开始使用百度的文心一言来试下效果,生成了好几次的代码都是有bug,所以生成代码这块还得是ChatGPT。这篇主要就是了解下 pygame 库的一些方法,当然在没有安装这个库的,需要先安装,安装的时候还是一直都推荐的安装方法,带上国内

    2023年04月27日
    浏览(32)
  • 游戏开发丨基于Pygame的AI版贪吃蛇小游戏

    本期内容 基于pygame的AI版贪吃蛇小游戏 所需环境 python pycharm或anaconda pygame 下载地址 https://download.csdn.net/download/m0_68111267/88789665 本游戏使用Pygame模块开发,不需要玩家操纵贪吃蛇,贪吃蛇会自动吃掉屏幕上随机出现的食物,每吃一个食物贪吃蛇长度增加一节。如果贪吃蛇撞到

    2024年02月20日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包