[关闭]
@Ding-feng 2017-11-30T13:59:27.000000Z 字数 4193 阅读 808

在此处输入标题

code


import pygame, sys, random  
from pygame.locals import*  

FPS = 10  
WINDOWWIDTH =640  
WINDOWHEIGHT = 480  
CELLSIZE = 20  
CELLWIDTH = WINDOWWIDTH / CELLSIZE  
CELLHEIGHT = WINDOWHEIGHT / CELLSIZE  

WHITE = (255, 255, 255)  
BLACK = (0, 0 , 0)  
RED = (255, 0, 0)  
GREEN = (0, 255, 0)  
DARKGREEN = (0, 155, 0)  
DARKGRAY = (40, 40, 40)  
BGCOLOR = BLACK  

UP = 'up'  
DOWN = 'down'  
LEFT = 'left'  
RIGHT = 'right'  

HEAD = 0 

#main function  
def main():   
    global FPSCLOCK, DISPLAYSURF, BASICFONT  

    pygame.init()  
    FPSCLOCK = pygame.time.Clock()  
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))  
    BASICFONT = pygame.font.Font('freesansbold.ttf', 18)  
    pygame.display.set_caption('贪吃蛇')   
    while True:  
        runGame()   #运行游戏  
        showGameOverScreen()    #显示游戏结束画面  

def runGame():  
    #设置蛇身开始在随机位置  
    startx = random.randint(5, CELLWIDTH-6)  
    starty = random.randint(5, CELLHEIGHT-6)  
    wormCoods = [{'x': startx, 'y': starty},  
                 {'x': startx-1, 'y': starty},  
                 {'x': startx-2, 'y': starty}]  
    direction = RIGHT  
    #蛇初始方向向右  

    #得到一个随机食物的位置  
    food = getRandomLocation()  

    while True:  
        for event in pygame.event.get():  
            if event.type == QUIT:  
                terminate()  
            elif event.type == KEYDOWN:     #处理蛇的移动方向  
                if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:  
                    direction = LEFT  
                elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:  
                    direction = RIGHT  
                elif (event.key == K_UP or event.key == K_w) and direction != DOWN:  
                    direction = UP  
                elif (event.key == K_DOWN or event.key == K_s) and direction != UP:  
                    direction = DOWN  
                elif event.key == K_ESCAPE:  
                    terminate()  
        #看蛇是否撞击到自己或四周墙壁  
        if wormCoods[HEAD]['x'] == -1 or wormCoods[HEAD]['x'] == CELLWIDTH or wormCoods[HEAD]['y'] == -1 or wormCoods[HEAD]['y'] == CELLHEIGHT:  
            return  #game over  
        for wormBody in wormCoods[1:]:  
            if wormBody['x'] == wormCoods[HEAD]['x'] and wormBody['y'] == wormCoods[HEAD]['y']:  
                return #game over  
        #蛇是否吃到食物  
        if wormCoods[HEAD]['x'] == food['x'] and wormCoods[HEAD]['y'] == food['y']:  
            #不删除蛇身尾段  
            food = getRandomLocation() #设置一个新的食物 
        else:  
            del wormCoods[-1] #删除蛇身尾段  
        #添加蛇身头段  
        if direction == UP:  
            newHead = {'x': wormCoods[HEAD]['x'], 'y': wormCoods[HEAD]['y']-1}  
        elif direction == DOWN:  
            newHead = {'x': wormCoods[HEAD]['x'], 'y': wormCoods[HEAD]['y']+1}  
        elif direction == LEFT:  
            newHead = {'x': wormCoods[HEAD]['x']-1, 'y': wormCoods[HEAD]['y']}  
        elif direction == RIGHT:  
            newHead = {'x': wormCoods[HEAD]['x']+1, 'y': wormCoods[HEAD]['y']}  
        wormCoods.insert(0,newHead)  
        DISPLAYSURF.fill(BGCOLOR)  
        drawGrid()          #画格子  
        drawWorm(wormCoods) #画蛇身  
        drawFood(food)      #画食物  
        drawScore(len(wormCoods) - 3)#显示得到分数  
        pygame.display.update()  
        FPSCLOCK.tick(FPS)  

#提示按键消息       
def drawPressKeyMsg():  
    pressKeySurf = BASICFONT.render('Press a key to play.', True, DARKGRAY)  
    pressKeyRect = pressKeySurf.get_rect()  
    pressKeyRect.topleft = (WINDOWWIDTH - 200, WINDOWHEIGHT-30)  
    DISPLAYSURF.blit(pressKeySurf, pressKeyRect)  

#检测按键     
def checkForKeyPress():  
    if len(pygame.event.get(QUIT)) > 0:  
        terminate()  
    keyUpEvents = pygame.event.get(KEYUP)  
    if len(keyUpEvents) == 0:  
        return None  
    if keyUpEvents[0].key == K_ESCAPE:  
        terminate()  
    return keyUpEvents[0].key  



#游戏结束  
def terminate():  
    pygame.quit()  
    sys.exit()  

#得到随机苹果位置  
def getRandomLocation():  
    return  {'x': random.randint(0, CELLWIDTH - 1), 'y': random.randint(0, CELLHEIGHT - 1)}  

#显示游戏结束画面  
def showGameOverScreen():  
    gameOverFont = pygame.font.Font('freesansbold.ttf', 150)  
    gameSurf = gameOverFont.render('GAME', True, WHITE)  
    overSurf = gameOverFont.render('OVER', True, WHITE)  
    gameRect = gameSurf.get_rect()  
    overRect = overSurf.get_rect()  
    gameRect.midtop = (WINDOWWIDTH / 2, 10)  
    overRect.midtop = (WINDOWWIDTH / 2, gameRect.height + 10 + 25)  

    DISPLAYSURF.blit(gameSurf, gameRect)  
    DISPLAYSURF.blit(overSurf, overRect)  
    drawPressKeyMsg()  
    pygame.display.update()  
    pygame.time.wait(500)  
    checkForKeyPress()  

    while True:  
        if checkForKeyPress():  
            pygame.event.get()  
            return  

def drawScore(score):  
    scoreSurf = BASICFONT.render('Score: %s' %(score), True, WHITE)  
    scoreRect = scoreSurf.get_rect()  
    scoreRect.topleft = (WINDOWWIDTH - 120, 10)  
    DISPLAYSURF.blit(scoreSurf, scoreRect)  

def drawWorm(wormCoods):  
    for coord in wormCoods:  
        x = coord['x'] * CELLSIZE  
        y = coord['y'] * CELLSIZE  
        wormSegmentRect = pygame.Rect(x, y, CELLSIZE, CELLSIZE)  
        pygame.draw.rect(DISPLAYSURF, DARKGREEN, wormSegmentRect)  
        wormInnerSegmentRect = pygame.Rect(x+4, y+4, CELLSIZE-8, CELLSIZE-8)  
        pygame.draw.rect(DISPLAYSURF, GREEN, wormInnerSegmentRect)  

def drawFood(coord):  
    x = coord['x'] * CELLSIZE  
    y = coord['y'] * CELLSIZE  
    appleRect = pygame.Rect(x, y, CELLSIZE, CELLSIZE)  
    pygame.draw.rect(DISPLAYSURF, RED, appleRect)  

def drawGrid():  
    for x in range(0, WINDOWWIDTH, CELLSIZE):  
        pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, WINDOWHEIGHT))  
    for y in range(0, WINDOWHEIGHT, CELLSIZE):  
        pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (WINDOWWIDTH, y))  

if __name__ == '__main__':  
    main()  
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注