猫史档案馆


【Python作品分享】tmp【作品秀】

用户:第五人格s1囚徒第五人格s1囚徒查看:0 回复:0 评论:0 创建时间:2021-05-28T18:26:13


【作品展示】

center_image

 

【作品介绍】

贪吃蛇游戏

 

【作品源代码】

import pygame
import random
import sys

a=random.randint(1,54)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
DARKGREEN = (0, 185, 0)
YELLOW = (255,255,0)

UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4

windowsWidth = 800
windowsHeight = 600

cellSize = 20                                #定义基础单位大小  
mapWidth = int(windowsWidth / cellSize)      #地图的宽
mapHeight = int(windowsHeight / cellSize)    #地图的高

HEAD = 0              #贪吃蛇头部下标
snakeSpeed = 7        #贪吃蛇的速度

def main():           #入口函数,程序从这里开始运行
    pygame.init()     # 模块初始化   
    screen = pygame.display.set_mode((windowsWidth, windowsHeight)) 
    pygame.display.set_caption("贪吃蛇") 
    screen.fill(WHITE)    
    snakeSpeedClock = pygame.time.Clock()

    startGame(screen)      #游戏开始 

    while True:
        music=pygame.mixer.Sound("snake.wav")
        music.play(-1)
        runGame(screen, snakeSpeedClock)
        music.stop()
        gameOver(screen)   #游戏结束


def startGame(screen):
    gameStart = pygame.image.load("gameStart.png")  
    screen.blit(gameStart, (70, 30))  

    font = pygame.font.SysFont("SimHei", 40) 
    tip = font.render("按任意键开始游戏", True, (65, 105, 225))   
    screen.blit(tip, (240, 550)) 

    pygame.display.update()

    while True:                                     #键盘监听事件
        for event in pygame.event.get():            #关闭窗口
            if event.type == pygame.QUIT: 
                terminate()    
            elif event.type == pygame.KEYDOWN:
                if (event.key == pygame.K_ESCAPE):  #按下ESC键
                    terminate() 
                else:
                    return 

def runGame(screen,snakeSpeedClock):     
    startX = random.randint(3, mapWidth - 8) 
    startY = random.randint(3, mapHeight - 8) 
    snakeCoords = [{"x": startX, "y": startY},  
                   {"x": startX - 1, "y": startY},
                   {"x": startX - 2, "y": startY}]
 
    direction = RIGHT       
 
    food = {"x": random.randint(0, mapWidth - 1), "y": random.randint(0, mapHeight - 1)}    

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                terminate()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and direction != RIGHT:
                    direction = LEFT                    
                elif event.key == pygame.K_RIGHT  and direction != LEFT:
                    direction = RIGHT                    
                elif event.key == pygame.K_UP and direction != DOWN:
                    direction = UP                    
                elif event.key == pygame.K_DOWN and direction != UP:
                    direction = DOWN      
                elif event.key == pygame.K_ESCAPE:                       
                    terminate()

        moveSnake(direction, snakeCoords)  #移动贪吃蛇

        isEattingFood(snakeCoords, food)   #判断贪吃蛇是否吃到食物
 
        ret = isAlive(snakeCoords)         #判断贪吃蛇是否还活着
        if not ret:
            break                          #贪吃蛇已经喵了,游戏结束
    
        gameRun = pygame.image.load("background.png")
        screen.blit(gameRun, (0, 0))
        drawFood(screen, food)
        drawSnake(screen, snakeCoords)
        drawScore(screen, len(snakeCoords) - 3)         
        
        pygame.display.update()
        snakeSpeedClock.tick(snakeSpeed)  #控制帧速率

def drawFood(screen, food):
    x = food["x"] * cellSize
    y = food["y"] * cellSize
    pygame.draw.rect(screen, YELLOW, (x, y, cellSize, cellSize))

def drawSnake(screen, snakeCoords):
    for coord in snakeCoords:
        x = coord["x"] * cellSize
        y = coord["y"] * cellSize
        pygame.draw.rect(screen, DARKGREEN, (x, y, cellSize, cellSize)) 
        pygame.draw.rect(screen, GREEN,(x + 4, y + 4, cellSize - 8, cellSize - 8))

def drawScore(screen,score):
    font = pygame.font.SysFont("SimHei", 30)
    scoreSurf = font.render("得分: %s" % score, True, WHITE)
    scoreRect = scoreSurf.get_rect()
    scoreRect.topleft = (windowsWidth - 200, 50)
    screen.blit(scoreSurf, scoreRect)

def moveSnake(direction, snakeCoords):
    if direction == UP:
        newHead = {"x": snakeCoords[HEAD][ "x"], "y": snakeCoords[HEAD][ "y"] - 1}
    elif direction == DOWN:
        newHead = {"x": snakeCoords[HEAD][ "x"], "y": snakeCoords[HEAD][ "y"] + 1}
    elif direction == LEFT:
        newHead = {"x": snakeCoords[HEAD][ "x"] - 1, "y": snakeCoords[HEAD][ "y"]}
    elif direction == RIGHT:
        newHead = {"x": snakeCoords[HEAD][ "x"] + 1, "y": snakeCoords[HEAD][ "y"]}

    snakeCoords.insert(0, newHead)

def isEattingFood(snakeCoords, food): 
    if snakeCoords[HEAD]["x"] == food["x"] and snakeCoords[HEAD]["y"] == food["y"]:
        food["x"] = random.randint(0, mapWidth - 1)
        food["y"] = random.randint(0, mapHeight - 1) 
    else:
        del snakeCoords[-1]
        
def isAlive(snakeCoords):
    tag = True
    if snakeCoords[HEAD]["x"] == -1 or snakeCoords[HEAD]["x"] == mapWidth or snakeCoords[HEAD]["y"] == -1 or snakeCoords[HEAD]["y"] == mapHeight:
        tag = False        # 贪吃蛇碰壁
    for snake_body in snakeCoords[1:]:
        if snake_body["x"] == snakeCoords[HEAD]["x"] and snake_body["y"] == snakeCoords[HEAD]["y"]:
            tag = False   # 贪吃蛇碰到自己身体
    return tag

def gameOver(screen):
    #加载游戏结束图片
    screen.fill(WHITE)
    gameOver = pygame.image.load("gameover.png")
    screen.blit(gameOver, (0, 0))
    #加载游戏结束提示信息
    font = pygame.font.SysFont("SimHei", 36)
    tip = font.render("按Q或者ESC退出游戏, 按其他键重新开始游戏", True, (65, 105, 225))
    screen.blit(tip, (30, 500))
   #显示Surface对象上的内容
    pygame.display.update()

    while True:  
        for event in pygame.event.get():  
            if event.type == pygame.QUIT:
                terminate()     
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE or event.key == pygame.K_q:  
                    terminate()
                else:
                    return #结束此函数, 重新开始游戏

def terminate():    
    pygame.quit()
    sys.exit()


main()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 0下一页