python编写小游戏之三入最最简陋简单贪食蛇编写2

紧接上回,已经完成了单独的贪食蛇的控制,但是呢,居然没有苹果可以吃,所以,非常简单的加入苹果,同时呢,修改一下主程序中贪食蛇的创建,单独编写一个贪食蛇身体生成函数,这样将来要做双蛇也很简单了。

#创建一条新的蛇
def create_new_snake():

    snake_body = []
    snake_x = random.randint(5, rows - 5)
    snake_y = random.randint(5, columns - 5)
    snake_body.append([snake_x, snake_y])
    snake_body.append([snake_x, snake_y + 1])
    snake_body.append([snake_x, snake_y + 2])
    return snake_body

把主程序中所有生成新蛇的地方换成

snake = create_new_snake()

创建新苹果,苹果不能出现在蛇的身体里,所以

def create_new_apple(snake_body):

    apple_in_game = False
    while not apple_in_game:
        apple_x = random.randint(0, rows - 1)
        apple_y = random.randint(0, columns - 1)
        # print(apple_x, apple_y)
        if (apple_x, apple_y) not in snake_body:
            new_apple = pygame.image.load('apple.png')

            new_apple = pygame.transform.scale(new_apple, (tile_size - 2, tile_size - 2))

            apple_x_location = apple_y * tile_size + x_margin/2
            apple_y_location = apple_x * tile_size + y_margin/2

            display.blit(new_apple, (apple_x_location, apple_y_location))
            apple_in_game = True
    return new_apple, (apple_x, apple_y), apple_x_location, apple_y_location

在主程序中,主循环之前创建一个苹果

if __name__ == '__main__':
    pygame.init()
    snake = create_new_snake()
    # 未按下按键时,默认的初识移动方向
    direction = directions[random.randint(0, 3)]

    # 创建一个小苹果
    apple, apple_location, apple_left, apple_top = create_new_apple(snake)
    # 吃到苹果标志
    apple_was_eaten = False

因为蛇与苹果之间有交互关系,如果蛇吃到苹果,那么蛇的身体会增加一格,也就是此次循环不删除列表的最后一个元素,所以定义了一格标志位。

在主循环中,与监测按键平级的地方,放入蛇与苹果关系检查。

        if apple_location in snake:
            apple, apple_location, apple_left, apple_top = create_new_apple(snake)
            apple_was_eaten = True
            my_score += 1

无论🐍的那个部分碰到苹果,都算迟到苹果,也可以考虑只有舌头碰到才算,这根据自己喜好吧。碰到苹果后,苹果消失,得分等等…

还需要修改删除最后一个列表元素位置,同时因为蛇的身体会变长了,所以单纯的碰到边界游戏才结束,已经不够了,我们还需要加入如果蛇头碰到自己的身体,游戏还是要结束。

        if snake[0] in snake[1:]:
            snake = create_new_snake()
            #print(snake)
        elif is_right_direction(snake, new_body_location[0], new_body_location[1]):
            snake.insert(0, new_body_location)
            if not apple_was_eaten:
                del snake[-1]
            else:
                apple_was_eaten = False

如果不想结束的太突然,祭出万年不变的结束动画。

#游戏结束时特效
def game_over_animation(color=white, animation_speed=50):
    orig_surf = display.copy()
    flash_surf = pygame.Surface(display.get_size())
    flash_surf = flash_surf.convert_alpha()
    r, g, b = color
    for i in range(3):
        for start, end, step in ((0, 255, 1), (255, 0, -1)):
            for alpha in range(start, end, animation_speed * step):
                # 先铺一层新的界面,包含老界面所有内容
                display.blit(orig_surf, (0, 0))
                # flash界面填充颜色,开始很淡,越来越浓,然后越来越淡
                flash_surf.fill((r, g, b, alpha))
                # 把flash界面加载到display中
                display.blit(flash_surf, (0, 0))
                # draw_game_board(maze)
                # 刷新看效果
                pygame.display.update()
                fps_clock.tick(fps)

把动画放到程序中。即可欣赏结束动画。因为结束动画使用alpha时用到了颜色的RGB三色,这里需要把while的定义改为三色(255, 255, 255),而不是’white’。

还可以加入得分系统。

def make_score():
    score = pygame.font.Font('Kaiti.ttc', 20)
    score_surf = score.render('得分: %d' % my_score, True, text_color, bg_color)
    score_rect = score_surf.get_rect()
    score_rect.topleft = (screen_width-100, y_margin/8)
    return score_surf, score_rect

这个Kaiti.ttc字体是我从苹果系统字体里导出到工程里的,目前发现如果想要显示中文,这样比较方便,pygame自带的字体中,不知道那些可以正常显示。

在循环中加入

display.blit(score_display, score_rect)

然后运行游戏

请添加图片描述

虽然简陋,但是难看的贪食蛇完成了。我们还可以进一步增加难度,根据得分的增加,提高fps率,也就是提高了贪食蛇的移动速度。这个就不提了。还可以增加开始结束画面,暂停功能,声音,音效等等…

如果增加了这些,就不符合简陋的定义了,所以就不增加了,本身这些也太简单了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您解答关于python编写贪食蛇游戏的问题。您可以参考以下代码: ```python import pygame import time import random pygame.init() white = (255, 255, 255) black = (0, 0, 0) red = (213, 50, 80) green = (0, 255, 0) blue = (50, 153, 213) display_width = 800 display_height = 600 gameDisplay = pygame.display.set_mode((display_width, display_height)) pygame.display.set_caption('Slither') clock = pygame.time.Clock() block_size = 10 def snake(block_size, snakeList): for XnY in snakeList: pygame.draw.rect(gameDisplay, green, [XnY[0], XnY[1], block_size, block_size]) def message_to_screen(msg, color): font = pygame.font.SysFont(None, 25) screen_text = font.render(msg, True, color) gameDisplay.blit(screen_text, [display_width/6, display_height/2]) def gameloop(): gameExit = False gameOver = False lead_x = display_width / 2 lead_y = display_height / 2 lead_x_change = 0 lead_y_change = 0 snakeList = [] snakeLength = 1 randAppleX = round(random.randrange(0, display_width - block_size) / 10.0) * 10.0 randAppleY = round(random.randrange(0, display_height - block_size) / 10.0) * 10.0 while not gameExit: while gameOver == True: gameDisplay.fill(white) message_to_screen("Game over, press C to play again or Q to quit", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: gameExit = True gameOver = False if event.key == pygame.K_c: gameloop() for event in pygame.event.get(): if event.type == pygame.QUIT: gameExit = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: lead_x_change = -block_size lead_y_change = 0 elif event.key == pygame.K_RIGHT: lead_x_change = block_size lead_y_change = 0 elif event.key == pygame.K_UP: lead_y_change = -block_size lead_x_change = 0 elif event.key == pygame.K_DOWN: lead_y_change = block_size lead_x_change = 0 if lead_x >= display_width or lead_x < 0 or lead_y >= display_height or lead_y < 0: gameOver = True lead_x += lead_x_change lead_y += lead_y_change gameDisplay.fill(white) pygame.draw.rect(gameDisplay, red, [randAppleX, randAppleY, block_size, block_size]) snakeHead = [] snakeHead.append(lead_x) snakeHead.append(lead_y) snakeList.append(snakeHead) if len(snakeList) > snakeLength: del snakeList[0] for eachSegment in snakeList[:-1]: if eachSegment == snakeHead: gameOver = True snake(block_size, snakeList) pygame.display.update() if lead_x == randAppleX and lead_y == randAppleY: randAppleX = round(random.randrange(0, display_width - block_size) / 10.0) * 10.0 randAppleY = round(random.randrange(0, display_height - block_size) / 10.0) * 10.0 snakeLength += 1 clock.tick(15) pygame.quit() quit() gameloop() ``` 希望这个例子能帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值