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函数做的相对简单的贪吃蛇。

  • 30
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值