0
点赞
收藏
分享

微信扫一扫

python贪吃蛇双人小游戏

你的益达233 2022-01-16 阅读 64

    今天看了别人的文章,自己也模仿做了一个相似的贪吃蛇游戏。

我也懒得解释了,直接上代码:

import pygame
import random
import time
import os
from pygame.locals import *
from sys import exit
grid_size=25
die1=True
die2=True
die1st=0
die2st=0
def init(d):
    r1=random.randint(3,37)*grid_size
    r2=random.randint(3,27)*grid_size
    if abs(d)>=2:
        s1b=[[r1,r2],[r1+25,r2],[r1+50*(-d),r2]]
    else:
        s1b=[[r1,r2],[r1+25*(-d),r2],[r1+50,r2]]
    return s1b
pygame.init()
screen = pygame.display.set_mode((1000,750))
pygame.display.set_caption("PVP")

yellow=(255,255,0)
state='START'
blue=(0,0,255)
green=(0,255,0)
cyan=(0,255,255)
red=(255,0,0)
orange=(225,175,0)
vel=0.25

def event():
    global state
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
        if event.type==KEYDOWN and event.key==K_SPACE:
            if state=='START':
                state='RUNNING'
        if event.type==KEYDOWN and event.key==K_w:
            if snake1.direction!=2:
                snake1.direction=-2
        if event.type==KEYDOWN and event.key==K_s:
            if snake1.direction!=-2:
                snake1.direction=2
        if event.type==KEYDOWN and event.key==K_a:
            if snake1.direction!=1:
                snake1.direction=-1
        if event.type==KEYDOWN and event.key==K_d:
            if snake1.direction!=-1:
                snake1.direction=1
        if event.type==KEYDOWN and event.key==K_UP:
            if snake2.direction!=2:
                snake2.direction=-2
        if event.type==KEYDOWN and event.key==K_DOWN:
            if snake2.direction!=-2:
                snake2.direction=2
        if event.type==KEYDOWN and event.key==K_LEFT:
            if snake2.direction!=1:
                snake2.direction=-1
        if event.type==KEYDOWN and event.key==K_RIGHT:
            if snake2.direction!=-1:
                snake2.direction=1
        if event.type==KEYDOWN and event.key==K_e:
            if len(snake1.body)>1:
                snake1.acc_st=time.time()
        if event.type==KEYDOWN and event.key==K_PAGEDOWN:
            if len(snake2.body)>1:
                snake2.acc_st=time.time()
def showscore():
    fillText('snake1:%s'%str(snake1.score),(0,0))
    fillText('snake2:%s'%str(snake2.score),(500,0))
class Bean():
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def draw(self):
        pygame.draw.rect(screen,yellow,(self.x,self.y,grid_size,grid_size),0)
beanlist=[Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size)]
class Magicbean():
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def draw(self):
        pygame.draw.rect(screen,blue,(self.x,self.y,grid_size,grid_size),0)
magicbeanlist=[Magicbean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size),Magicbean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size)]

a=0
class Snake():
    def __init__(self,body,firstcolor,color):
        self.body=body
        self.fc=firstcolor
        self.color=color
        self.direction=-1
        self.score=len(self.body)
        self.acc_st=0
        self.acc_et=time.time()
        self.vel=0.25
    def draw(self):
        for i in range(len(self.body)):
            if i==0:
                pygame.draw.rect(screen,self.fc,(self.body[i][0],self.body[i][1],grid_size,grid_size),0)
            else:
                pygame.draw.rect(screen,self.color,(self.body[i][0],self.body[i][1],grid_size,grid_size),0)
            pygame.draw.rect(screen,self.fc,(self.body[0][0],self.body[0][1],grid_size,grid_size),0)
    def run(self):
        if abs(self.direction)<2:
            self.body.insert(0,[self.body[0][0]+self.direction*grid_size,self.body[0][1]])
        else:
            self.body.insert(0,[self.body[0][0],self.body[0][1]+self.direction/2*grid_size])
        self.body.pop(-1)
    def die(self,s):
        self.score=len(self.body)
        if self.body[0][0]>1000 or self.body[0][0]<0 or self.body[0][1]>750 or self.body[0][1]<0:
            self.snakebean()
            self.body=init(self.direction)
        if self.body[0]==s.body[0]:
            self.snakebean()
            self.body=init(self.direction)
            s.snakebean()
            s.body=init(s.direction)
        for i in range(1,len(self.body)):
            if self.body[i]==self.body[0]:
                self.snakebean()
                self.body=init(self.direction)
                break
        for i in range(len(s.body)):
            if s.body[i]==self.body[0]:
                self.snakebean()
                self.body=init(self.direction)
                break
    def snakebean(self):
        for i in self.body:
            beanlist.append(Bean(i[0],i[1]))
    def accelerate(self):
        global vel
        self.acc_et=time.time()
        if self.acc_et-self.acc_st<5:
            if self.acc_et-self.acc_st>=3:
                self.vel=0.25
                self.body.pop()
                self.acc_st=0
            else:
                self.vel=0.15
snake1=Snake(init(1),cyan,green)
snake2=Snake(init(1),red,orange)
st1=time.time()
st2=time.time()

def EatAndDraw():
    global beanlist,a,magicbeanlist,die1,die2
    #bean
    while True:
        for i in range(len(beanlist)):
            if [beanlist[i].x,beanlist[i].y]==snake1.body[0]:
                snake1.body.append(snake1.body[-1])
                beanlist.pop(i)
                a=1
                break
            if [beanlist[i].x,beanlist[i].y]==snake2.body[0]:
                snake2.body.append(snake2.body[-1])
                beanlist.pop(i)
                a=1
                break
            beanlist[i].draw()
        if a==0:
            break
        a=0
    while len(beanlist)<10:
        beanlist.append(Bean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size))
    while len(beanlist)>100:
        beanlist.pop(0)
    #magicbean
    while True:
        
        for i in range(len(magicbeanlist)):
            if [magicbeanlist[i].x,magicbeanlist[i].y]==snake1.body[0]:
                b=random.randint(0,10)
                if b==1:
                    b=random.randint(3,10)
                elif b>=8:
                    die1=False
                else:
                    b=3
                for j in range(b):
                    snake1.body.append(snake1.body[-1])
                magicbeanlist.pop(i)
                a=1
                break
            if [magicbeanlist[i].x,magicbeanlist[i].y]==snake2.body[0]:
                b=random.randint(0,10)
                if b==1:
                    b=random.randint(3,10)
                elif b>=8:
                    die2=False
                else:
                    b=3
                for j in range(b):
                    snake2.body.append(snake2.body[-1])
                magicbeanlist.pop(i)
                a=1
                break
            magicbeanlist[i].draw()
        if a==0:
            break
        a=0
    while len(magicbeanlist)<2:
        magicbeanlist.append(Magicbean(random.randint(1,39)*grid_size,random.randint(1,29)*grid_size))
def fillText(text, position):
    # 设置字体
    TextFont = pygame.font.SysFont('微软雅黑', 40)
    # 设置字体其他样式
    newText = TextFont.render(text, True, (255, 0, 0))
    screen.blit(newText, position)
die1et=time.time()
die2et=time.time()
while True:
    if state=='RUNNING':
        et=time.time()
        if et-st1>=snake1.vel:
            pygame.draw.rect(screen,(0,0,0),(0,0,1000,750),0)
            snake1.run()
            snake1.draw()
            snake2.draw()
            st1=time.time()
            
        if et-st2>=snake2.vel:
            pygame.draw.rect(screen,(0,0,0),(0,0,1000,750),0)
            snake2.run()
            snake1.draw()
            snake2.draw()
            st2=time.time()
        snake1.accelerate()
        snake2.accelerate()
        if die1:
            snake1.die(snake2)
            die1st=time.time()
        else:
            
            die1et=time.time()
            if die1et-die1st>=5:
                die1=True
            fillText(('snake1 invincible'+str(6-int(die1et-die1st))+'second'),(0,50))
        if die2:
            snake2.die(snake1)
            die2st=time.time()
        else:
            
            die2et=time.time()
            if die2et-die2st>=5:
                die2=True
            fillText(('snake2 invincible'+str(6-int(die2et-die2st))+'second'),(500,50))
        EatAndDraw()
        showscore()
    event()
    pygame.display.update()
举报

相关推荐

0 条评论