成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

PyGame貪吃蛇的實(shí)現(xiàn)

elisa.yang / 3139人閱讀

摘要:最近幫人做了個(gè)貪吃蛇的游戲交作業(yè)用,很簡(jiǎn)單,界面如下開(kāi)始界面游戲中界面是不是很簡(jiǎn)單樸素。代碼在這里賦值,而不是在事件的循環(huán)中賦值,避免按鍵太快

最近幫人做了個(gè)貪吃蛇的游戲(交作業(yè)用),很簡(jiǎn)單,界面如下:
開(kāi)始界面:

游戲中界面:

是不是很簡(jiǎn)單、樸素。(歡迎大家訪問(wèn)GitHub)


游戲是基于PyGame框架制作的,程序核心邏輯如下:

游戲界面分辨率是640*480,蛇和食物都是由1個(gè)或多個(gè)20*20像素的正方形塊兒(為了方便,下文用點(diǎn)表示20*20像素的正方形塊兒)組成,這樣共有32*24個(gè)點(diǎn),使用pygame.draw.rect來(lái)繪制每一個(gè)點(diǎn);

初始化時(shí)蛇的長(zhǎng)度是3,食物是1個(gè)點(diǎn),蛇初始的移動(dòng)的方向是右,用一個(gè)數(shù)組代表蛇,數(shù)組的每個(gè)元素是蛇每個(gè)點(diǎn)的坐標(biāo),因此數(shù)組的第一個(gè)坐標(biāo)是蛇尾,最后一個(gè)坐標(biāo)是蛇頭;

游戲開(kāi)始后,根據(jù)蛇的當(dāng)前移動(dòng)方向,將蛇運(yùn)動(dòng)方向的前方的那個(gè)點(diǎn)append到蛇數(shù)組的末位,再把蛇尾去掉,蛇的坐標(biāo)數(shù)組就相當(dāng)于往前挪了一位;

如果蛇吃到了食物,即蛇頭的坐標(biāo)等于食物的坐標(biāo),那么在第2點(diǎn)中蛇尾就不用去掉,就產(chǎn)生了蛇長(zhǎng)度增加的效果;食物被吃掉后,隨機(jī)在空的位置(不能與蛇的身體重合)再生成一個(gè);

通過(guò)PyGameevent監(jiān)控按鍵,改變蛇的方向,例如當(dāng)蛇向右時(shí),下一次改變方向只能向上或者向下;

當(dāng)蛇撞上自身或墻壁,游戲結(jié)束,蛇頭裝上自身,那么蛇坐標(biāo)數(shù)組里就有和舌頭坐標(biāo)重復(fù)的數(shù)據(jù),撞上墻壁則是蛇頭坐標(biāo)超過(guò)了邊界,都很好判斷;

其他細(xì)節(jié):做了個(gè)開(kāi)始的歡迎界面;食物的顏色隨機(jī)生成;吃到實(shí)物的時(shí)候有聲音提示等。


代碼:

#!/usr/bin/env python  
# -*- coding:utf-8 -*- 

""" 
@version: v1.0 
@author: Harp
@contact: [email protected] 
@software: PyCharm 
@file: MySnake.py 
@time: 2018/1/15 0015 23:40 
"""


import pygame
from os import path
from sys import exit
from time import sleep
from random import choice
from itertools import product
from pygame.locals import QUIT, KEYDOWN


def direction_check(moving_direction, change_direction):
    directions = [["up", "down"], ["left", "right"]]
    if moving_direction in directions[0] and change_direction in directions[1]:
        return change_direction
    elif moving_direction in directions[1] and change_direction in directions[0]:
        return change_direction
    return moving_direction


class Snake:

    colors = list(product([0, 64, 128, 192, 255], repeat=3))[1:-1]

    def __init__(self):
        self.map = {(x, y): 0 for x in range(32) for y in range(24)}
        self.body = [[100, 100], [120, 100], [140, 100]]
        self.head = [140, 100]
        self.food = []
        self.food_color = []
        self.moving_direction = "right"
        self.speed = 4
        self.generate_food()
        self.game_started = False

    def check_game_status(self):
        if self.body.count(self.head) > 1:
            return True
        if self.head[0] < 0 or self.head[0] > 620 or self.head[1] < 0 or self.head[1] > 460:
            return True
        return False

    def move_head(self):
        moves = {
            "right": (20, 0),
            "up": (0, -20),
            "down": (0, 20),
            "left": (-20, 0)
        }
        step = moves[self.moving_direction]
        self.head[0] += step[0]
        self.head[1] += step[1]

    def generate_food(self):
        self.speed = len(self.body) // 16 if len(self.body) // 16 > 4 else self.speed
        for seg in self.body:
            x, y = seg
            self.map[x//20, y//20] = 1
        empty_pos = [pos for pos in self.map.keys() if not self.map[pos]]
        result = choice(empty_pos)
        self.food_color = list(choice(self.colors))
        self.food = [result[0]*20, result[1]*20]


def main():
    key_direction_dict = {
        119: "up",  # W
        115: "down",  # S
        97: "left",  # A
        100: "right",  # D
        273: "up",  # UP
        274: "down",  # DOWN
        276: "left",  # LEFT
        275: "right",  # RIGHT
    }

    fps_clock = pygame.time.Clock()
    pygame.init()
    pygame.mixer.init()
    snake = Snake()
    sound = False
    if path.exists("eat.wav"):
        sound_wav = pygame.mixer.Sound("eat.wav")
        sound = True
    title_font = pygame.font.SysFont("arial", 32)
    welcome_words = title_font.render("Welcome to My Snake", True, (0, 0, 0), (255, 255, 255))
    tips_font = pygame.font.SysFont("arial", 24)
    start_game_words = tips_font.render("Click to Start Game", True, (0, 0, 0), (255, 255, 255))
    close_game_words = tips_font.render("Press ESC to Close", True, (0, 0, 0), (255, 255, 255))
    gameover_words = title_font.render("GAME OVER", True, (205, 92, 92), (255, 255, 255))
    win_words = title_font.render("THE SNAKE IS LONG ENOUGH AND YOU WIN!", True, (0, 0, 205), (255, 255, 255))
    screen = pygame.display.set_mode((640, 480), 0, 32)
    pygame.display.set_caption("My Snake")
    new_direction = snake.moving_direction
    while 1:
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type == KEYDOWN:
                if event.key == 27:
                    exit()
                if snake.game_started and event.key in key_direction_dict:
                    direction = key_direction_dict[event.key]
                    new_direction = direction_check(snake.moving_direction, direction)
            elif (not snake.game_started) and event.type == pygame.MOUSEBUTTONDOWN:
                x, y = pygame.mouse.get_pos()
                if 213 <= x <= 422 and 304 <= y <= 342:
                    snake.game_started = True
        screen.fill((255, 255, 255))
        if snake.game_started:
            snake.moving_direction = new_direction  # 在這里賦值,而不是在event事件的循環(huán)中賦值,避免按鍵太快
            snake.move_head()
            snake.body.append(snake.head[:])
            if snake.head == snake.food:
                if sound:
                    sound_wav.play()
                snake.generate_food()
            else:
                snake.body.pop(0)
            for seg in snake.body:
                pygame.draw.rect(screen, [0, 0, 0], [seg[0], seg[1], 20, 20], 0)
            pygame.draw.rect(screen, snake.food_color, [snake.food[0], snake.food[1], 20, 20], 0)
            if snake.check_game_status():
                screen.blit(gameover_words, (241, 310))
                pygame.display.update()
                snake = Snake()
                new_direction = snake.moving_direction
                sleep(3)
            elif len(snake.body) == 512:
                screen.blit(win_words, (33, 210))
                pygame.display.update()
                snake = Snake()
                new_direction = snake.moving_direction
                sleep(3)
        else:
            screen.blit(welcome_words, (188, 100))
            screen.blit(start_game_words, (236, 310))
            screen.blit(close_game_words, (233, 350))
        pygame.display.update()
        fps_clock.tick(snake.speed)


if __name__ == "__main__":
    main()

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44568.html

相關(guān)文章

  • python完成簡(jiǎn)單的貪吃蛇小游戲附編號(hào)

      此篇文章主要是詳細(xì)介紹了python完成簡(jiǎn)單的貪吃蛇小游戲附編號(hào),文章內(nèi)容緊扣主題進(jìn)行詳盡的基本介紹,具有很強(qiáng)的參考意義,需用的朋友可以學(xué)習(xí)一下  序言:  不知道有沒(méi)有同學(xué)們和我一樣,最開(kāi)始觸碰程序編程的動(dòng)機(jī)就是為了做一個(gè)游戲打?  接下來(lái)要跟大家分享是指一個(gè)pygame所寫(xiě)的貪食蛇手機(jī)游戲:  貪食蛇這一個(gè)手機(jī)游戲在編程設(shè)計(jì)里的熟客,由于:  簡(jiǎn)易,最基本游戲情節(jié)你只需要蛇和食物2個(gè)就可以...

    89542767 評(píng)論0 收藏0
  • 小白成長(zhǎng)日記:寫(xiě)個(gè)貪吃

    摘要:貪吃蛇并不是通過(guò)操作來(lái)完成移動(dòng)的,而是通過(guò)記錄貪吃蛇的路徑來(lái)將身體渲染出來(lái)。目前沒(méi)有內(nèi)置的操作符判斷對(duì)象的內(nèi)容是否相同。 還是用的vue,本來(lái)以為不合適,但想法錯(cuò)了。貪吃蛇并不是通過(guò)操作dom來(lái)完成移動(dòng)的,而是通過(guò)記錄貪吃蛇的路徑來(lái)將身體渲染出來(lái)。 一般移動(dòng)元素,我們都是變動(dòng)它的css達(dá)到目的,但我在寫(xiě)貪吃蛇的時(shí)候發(fā)現(xiàn)這樣很難以實(shí)現(xiàn),參考了網(wǎng)上的資源,發(fā)現(xiàn)大部分人是通過(guò)記錄貪吃蛇的路徑...

    archieyang 評(píng)論0 收藏0
  • 在手機(jī)或電腦瀏覽器上玩貪吃

    摘要:貪吃蛇源代碼地址在手機(jī)瀏覽器上的顯示效果貪吃蛇的基本框架首先確定蛇的移動(dòng)區(qū)域,由一組標(biāo)簽構(gòu)成,給予一個(gè)寬高,就組成了蛇的活動(dòng)區(qū)域。以最小寬度為基準(zhǔn)貪吃蛇的框架補(bǔ)全在里添加要?jiǎng)?chuàng)建個(gè)來(lái)作為貪吃蛇的活動(dòng)場(chǎng)所。 貪吃蛇 源代碼地址:https://github.com/jiaoshibo/... 在手機(jī)瀏覽器上的顯示效果 showImg(https://segmentfault.com/img...

    Big_fat_cat 評(píng)論0 收藏0
  • 在手機(jī)或電腦瀏覽器上玩貪吃

    摘要:貪吃蛇源代碼地址在手機(jī)瀏覽器上的顯示效果貪吃蛇的基本框架首先確定蛇的移動(dòng)區(qū)域,由一組標(biāo)簽構(gòu)成,給予一個(gè)寬高,就組成了蛇的活動(dòng)區(qū)域。以最小寬度為基準(zhǔn)貪吃蛇的框架補(bǔ)全在里添加要?jiǎng)?chuàng)建個(gè)來(lái)作為貪吃蛇的活動(dòng)場(chǎng)所。 貪吃蛇 源代碼地址:https://github.com/jiaoshibo/... 在手機(jī)瀏覽器上的顯示效果 showImg(https://segmentfault.com/img...

    zhangfaliang 評(píng)論0 收藏0
  • 不小心用js重做了一遍貪吃

    摘要:基于這個(gè)核心重新實(shí)現(xiàn)了一次貪吃蛇游戲,并且完善了游戲的關(guān)卡設(shè)計(jì),效果如下效果預(yù)覽詳細(xì)思路分析 貪吃蛇游戲想必沒(méi)人會(huì)感到陌生,這個(gè)游戲的js版本在網(wǎng)上也是一搜一大把,今天我要介紹的仍然是如何用js做一個(gè)貪吃蛇游戲,但在關(guān)鍵一步,蛇的運(yùn)動(dòng)的實(shí)現(xiàn)上略有不同。 貪吃蛇的js版本通常用連續(xù)的方塊元素來(lái)實(shí)現(xiàn)蛇身,蛇的運(yùn)動(dòng)處理一般是這樣的,讓蛇頭向運(yùn)動(dòng)方向偏移一格,其后的元素依次移向前一個(gè)元素的位置...

    kidsamong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<