当前位置:   article > 正文

python贪吃蛇小游戏(加入按钮、难度、音乐、得分功能)_python贪吃蛇代码如何让分数显示在屏幕上

python贪吃蛇代码如何让分数显示在屏幕上

贪吃蛇小游戏,可以显示出得分,又背景音乐,难度选择和开始重启按钮设置。
游戏实现效果如下:
后面有完整代码和解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import sys
import pygame
import random

class Button(object):#定义按钮类
    def __init__(self,begin1,begin2,restart1,restart2,position,position2):
        self.gamebegin1=pygame.image.load(begin1).convert_alpha()#导入开始和重启按钮图片
        self.gamebegin2=pygame.image.load(begin2).convert_alpha()
        self.gamerestart1=pygame.image.load(restart1).convert_alpha()
        self.gamerestart2=pygame.image.load(restart2).convert_alpha()
        self.position=position
        self.position2=position2
        
    def ifpress(self):
        point_x,point_y=pygame.mouse.get_pos()#找到鼠标光标所在位置
        x,y=self.position#指定的点击按钮位置
        w,h=self.gamebegin1.get_size()#定义按钮尺寸
        x-=w/2
        y-=h/2
        if_x=x-w/2<point_x<x+w/2#判断鼠标光标是否在按钮上
        if_y=y-h/2<point_y<y+h/2
        return if_x and if_y

    def ispress(self):
        x,y=self.position
        w,h=self.gamebegin1.get_size()
        x-=w/2
        y-=h/2
        if self.ifpress():#如果鼠标光标在按钮上,图片显示为gamebegin1,否则显示为gamebegin2
            screen.blit(self.gamebegin1,(x-w/2+8,y-h/2+7))            
        else:
            screen.blit(self.gamebegin2,(x-w/2,y-h/2))
    #定义重启按钮,方法同上
    def ifrepress(self):
        point_x,point_y=pygame.mouse.get_pos()
        x,y=self.position2
        w,h=self.gamerestart1.get_size()
        x-=w/2
        y-=h/2
        if_x=x-w/2<point_x<x+w/2
        if_y=y-h/2<point_y<y+h/2
        return if_x and if_y

    def isrepress(self):
        x,y=self.position2
        w,h=self.gamerestart1.get_size()
        x-=w/2
        y-=h/2
        if self.ifrepress():
            screen.blit(self.gamerestart1,(x-w/2,y-h/2))            
        else:
            screen.blit(self.gamerestart2,(x-w/2,y-h/2))
            
def choice():#定义选择难度
    screen.fill((0,0,0))#初始界面颜色设置为黑色
    Rect1=pygame.Rect(300,300,200,100)#设置按钮尺寸
    Rect2=pygame.Rect(300,450,200,100)
    pygame.draw.rect(screen,(136,189,186),Rect1)#创建按钮
    screen.blit(font.render('grade one:',-1,(255,255,255)),(300,300))
    pygame.draw.rect(screen,(136,189,186),Rect2)
    screen.blit(font.render('grade two:',-1,(255,255,255)),(300,450))
    pygame.display.flip()#显示到屏幕上
    point_x,point_y=pygame.mouse.get_pos()#找到鼠标光标所在位置
    global a,b#定义全局变量
    if 300<point_x<500 and 300<point_y<400:#判断光标是否在按钮上
        if pygame.mouse.get_pressed()[0]:#判断鼠标是否按下
            a=8#a表示没秒执行8次
            b=1#b表示设定的一个数,与后面判断执行时有关
    if 300<point_x<500 and 450<point_y<550:
        if pygame.mouse.get_pressed()[0]:
            a=12
            b=1
    pygame.display.update()#更新屏幕
            
            
        
        
    

def getResult():#游戏结束时出现得分结果和gameover
    final_text1='Game_Over'
    final_text2='Your final score is: '+str(score)
    ft1_font=pygame.font.SysFont('Arial',70)
    ft1_surf=font.render(final_text1,1,(242,3,36))
    screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,100])
    pygame.display.flip() 

def main():
    pygame.init()#初始化pygame
    clock=pygame.time.Clock()#定义时间
    pygame.font.init()#初始化字符
    #需要在其它定义中出现的参数,这里还需要定义全局变量一下
    global score,screen,font,button,status,x,y,direction,snackhead,snackbody,foodposition,state,a,b
    screen=pygame.display.set_mode((640,640))#设置屏幕尺寸
    screen.fill((0,0,0))#填充屏幕颜色
    #指明图片路径
    beginname1='D://picture//gamebegin1.png'
    beginname2='D://picture//gamebegin2.png'
    restartname1='D://picture//restart1.png'
    restartname2='D://picture//restart2.png'
    pygame.display.set_caption('sanckgame')
    font=pygame.font.SysFont('Arial',40)#定义字符种类和大小
    snackhead=[120,120]#定义初始蛇的头部位置
    foodposition=[360,360]#定义初始食物位置
    snackbody=[[120,120],[100,120],[80,120]]#定义蛇全身位置   
    score=0
    x=300
    y=300
    state=0
    a=1
    b=0
    food_eat=1#食物被吃为0,否则为1
    direction='right'#定义初始运动方向
    re_direction=direction#re_direction为变化后的方向
    button = Button(beginname1,beginname2,restartname1,restartname2,(330,300),(600,320))#定义按钮数值   
    pygame.display.update()

    
    while True:
            
        for event in pygame.event.get():#遍历可能出现的事件

            if event.type == pygame.QUIT:#点击关闭,程序关闭
                pygame.quit()
                sys.exit()
        button.ispress()#显示按钮
        pygame.display.update()
        if button.ifpress():
            if pygame.mouse.get_pressed()[0]:                   
                break  #点击按钮,结束这里的循环,进入游戏选择难度界面
    while True:
        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        choice()#运行choice()
        if b==1:#如果点击了按钮,结束循环,进入游戏运行界面
            break
    pygame.mixer.init()#初始化音乐
    pygame.mixer.music.load('D://music//Above Everything - Capo Productions.ogg')#导入音乐   
    pygame.display.update()
    status=True
    screen=pygame.display.set_mode((640,640))
    screen.fill((0,0,0))
    while status:
        clock.tick(a)#运行速度
        
        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_RIGHT or event.key == ord('d'):
                    re_direction='right'
                if event.key == pygame.K_LEFT or event.key == ord('a'):
                    re_direction='left'
                if event.key == pygame.K_UP or event.key == ord('w'):
                    re_direction='up'
                if event.key == pygame.K_DOWN or event.key == ord('s'):
                    re_direction='down'
        #跳出判断事件循环
        if re_direction=='right'and not direction =='left':
            direction=re_direction
        if re_direction=='left'and not direction =='right':
            direction=re_direction
        if re_direction=='up'and not direction =='down':
            direction=re_direction
        if re_direction=='down'and not direction =='up':
            direction=re_direction
        #头部坐标变化  
        if direction=='left':
            snackhead[0]-=20
        if direction=='right':
            snackhead[0]+=20
        if direction=='down':
            snackhead[1]+=20            
        if direction=='up':
            snackhead[1]-=20
        snackbody.insert(0,list(snackhead))#每移动一次,把头部新位置插入到最前面,形成新的头部
        
        if snackhead[0]==foodposition[0] and snackhead[1]==foodposition[1]:#判断蛇是否吃到了食物
            food_eat=0
            score+=1
            pygame.display.update()
        else:
            snackbody.pop()#没吃到则将位置变化前的尾部剔除出去,设的长度不变
        pygame.display.update()
        if food_eat==0:#迟到食物后生成新的食物
            x=random.randint(1,31)
            y=random.randint(1,31)
            for position in snackbody:#判断食物是否出现在蛇的身体处,出现则重新生成
                if not x == position[0] and not y == position[1]:
                    state=1
                else:
                    state=0
            if state ==1:
                foodposition=[int(x*20),int(y*20)]
                food_eat=1
            
        screen.fill((0,0,0))
        for position in snackbody:#画出蛇的身体和食物
            rect2=pygame.Rect(position[0],position[1],20,20)
            pygame.draw.rect(screen,(166,188,199),rect2)
            rect1=pygame.Rect(foodposition[0],foodposition[1],20,20)
            pygame.draw.rect(screen,(169,111,102),rect1)
        screen.blit(font.render('Score:'+str(score),-1,(255,255,255)),(100,50))#显示出得分
        pygame.display.update()
        #如果蛇撞到墙或自己的身体,则游戏结束
        if snackhead[0]<0 or snackhead[0]>620:
            restart()
        if snackhead[1]<0 or snackhead[1]>620:
            restart()
        for body in snackbody[1:]:
            if body[0]==snackhead[0]and body[1]==snackhead[1]:
                restart()       
        
        pygame.display.flip()
        pygame.display.update()
        if pygame.mixer.music.get_busy()==False:
            pygame.mixer.music.set_volume(0.3)
            pygame.mixer.music.play(-1)#音乐循环
    
def restart():#重新开始按钮
            
    getResult()#显示结果
    while True:
        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
          
            button.isrepress()
            pygame.display.update()
            if button.ifrepress():
                pygame.display.update()
                if pygame.mouse.get_pressed()[0]:
                    main()

main()  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244

按钮图片如下,可以自己画图做,音乐最好用ogg格式的,否则可能出问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/117270?site
推荐阅读
相关标签
  

闽ICP备14008679号