欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁(yè) > 知識(shí)庫(kù) > python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)

python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)

熱門(mén)標(biāo)簽:廣告地圖標(biāo)注app 海南400電話如何申請(qǐng) 激戰(zhàn)2地圖標(biāo)注 騰訊外呼線路 白銀外呼系統(tǒng) 唐山智能外呼系統(tǒng)一般多少錢(qián) 陜西金融外呼系統(tǒng) 哈爾濱ai外呼系統(tǒng)定制 公司電話機(jī)器人

一、前言

在上一篇博客中,我們實(shí)現(xiàn)了基本的界面搭建,這次實(shí)現(xiàn)一下邏輯部分。

二、創(chuàng)建蛇

首先,先分析一下蛇的移動(dòng),不然我們一定會(huì)吃虧的(別問(wèn),問(wèn)就是自己寫(xiě)了一堆無(wú)效代碼)。

蛇的移動(dòng)其實(shí)并沒(méi)有想象中那樣復(fù)雜,每一個(gè)模塊都需要有一個(gè)方向,按照方向進(jìn)行移動(dòng)。
其實(shí)實(shí)際上就是一個(gè)出隊(duì)的感覺(jué),即每一個(gè)元素都取代上一個(gè)元素的位置,然后再按照貪吃蛇當(dāng)前的方向,移動(dòng)一下頭節(jié)點(diǎn)即可。
snake.py:

""""🐍類"""
import pygame
class Snake():
    def __init__(self,snake_color,snake_head_color,x,y,lattice_wh):
        self.color = snake_color
        self.head_color = snake_head_color
        # 格子的左上角坐標(biāo)
        self.pos = (x,y)
        self.lattice_wh = lattice_wh
        self.rect = pygame.Rect(x,y,self.lattice_wh,self.lattice_wh)

        self.move_distance = {
            0:(0,0),
            1:(0,-self.lattice_wh),
            2:(0, self.lattice_wh),
            3:(-self.lattice_wh,0),
            4:( self.lattice_wh,0)
        }
    
    def move(self,direction):
        self.rect.x += self.move_distance[direction][0]
        self.rect.y += self.move_distance[direction][1]
    
    def forecast(self,direction):
        return (self.rect.x+self.move_distance[direction][0],
        		self.rect.y+self.move_distance[direction][1])

創(chuàng)建蛇,需要給一個(gè)位置(坐標(biāo)),同時(shí)也需要輸入一個(gè)顏色。
這里為了區(qū)分頭節(jié)點(diǎn),我傳入了兩個(gè)顏色,一個(gè)為頭節(jié)點(diǎn)的顏色,另一個(gè)為身子部分的顏色。
(其實(shí)顏色不需要給在這里,在update傳入一個(gè)即可)

蛇的主要部分就是移動(dòng),這里我給出了兩個(gè)方法:

1.移動(dòng)方法,是針對(duì)頭節(jié)點(diǎn)的移動(dòng)
2.預(yù)測(cè)移動(dòng)位置方法,是判斷下一步蛇的移動(dòng)的位置,看看是否會(huì)撞到自己/墻壁,或者吃到食物。

為了方便我們針對(duì)方向進(jìn)行處理,我使用了哈希的方式(其實(shí)就是字典),將每一個(gè)方向移動(dòng)一次(x,y)坐標(biāo)變化量記錄好。

【那個(gè)方向0,是最開(kāi)始我們的蛇是固定的,所以我添加了一個(gè)(0,0)】

最開(kāi)始,我們?cè)趍ain文件中創(chuàng)建一個(gè)snakes列表,來(lái)存儲(chǔ)所有的蛇節(jié)點(diǎn),并且添加了最開(kāi)始的兩個(gè)節(jié)點(diǎn)(頭和第一部分的身子)

# 蛇頭1個(gè)蛇身
snakes = []
snakes.append(Snake(snake_color,snake_head_color,lattice_wh,24*lattice_wh,lattice_wh))
snakes.append(Snake(snake_color,snake_head_color,0,24*lattice_wh,lattice_wh))

效果:

(主要是左下角的兩個(gè)方塊,紫色為頭,綠色為身子,我是寫(xiě)完了才寫(xiě)的博客)

三、創(chuàng)建食物

這部分,主要就是隨機(jī)生成一個(gè)位置,然后保證這個(gè)位置不在蛇身上即可。
食物類:
傳入顏色、渲染的界面、一個(gè)格子的寬度以及坐標(biāo)
另外我還提供了一個(gè)繪制圓的方法(pos為坐標(biāo),radius為直徑)
circle函數(shù)參數(shù):界面screen,顏色,位置(元組形式),直徑,線條寬度。
這里我們將線條設(shè)置為直徑,就能繪制一個(gè)圓盤(pán)。(注意寬度一定要是int類型,需要強(qiáng)轉(zhuǎn))

"""食物類"""
import pygame
class Food():
    def __init__(self,food_color,screen,lattice_wh,x,y):
        self.screen = screen
        self.food_color = food_color
        self.lattice_wh = lattice_wh
        self.radius = lattice_wh/2
        self.x,self.y = x,y

    def draw(self):
        pos = (self.x+self.lattice_wh/2,self.y+self.lattice_wh/2)
        pygame.draw.circle(self.screen,self.food_color,pos,self.radius,int(self.radius))

fuc.py中,寫(xiě)了一個(gè)生成食物的函數(shù):

def create_food(food_color,screen,lattice_wh,snakes):
    success = 0
    x,y = 0,0
    while not success:
        x,y = randint(0,24),randint(0,24)
        x *= lattice_wh
        y *= lattice_wh
        for i in snakes:
            if (x,y) != (i.rect.x,i.rect.y):
                success = 1
                break
    food = Food(food_color,screen,lattice_wh,x,y)
    return food

randint生成一個(gè)整數(shù)位置,乘上格子的寬度,我們就能得到一個(gè)格子的左上角坐標(biāo),看看是否在蛇身上,不在就可以生成了。

四、蛇的移動(dòng)

之前只給出了方法,現(xiàn)在我們來(lái)實(shí)現(xiàn)一下。
蛇的移動(dòng)就三種情況:

  • 撞到自己或者邊界
  • 吃到食物
  • 正常移動(dòng)

如果是第一種,直接結(jié)束游戲,第三中我們就按照上面說(shuō)的,將身子向前移動(dòng)一位,修改一下頭節(jié)點(diǎn)即可。
但是第二種,涉及到了需要在snakes添加一個(gè)對(duì)象,我們就需要搞清楚添加的位置。

在即將碰到食物時(shí),我們將食物位置添加到列表首項(xiàng)。

實(shí)現(xiàn):
這里的game_stats為游戲種需要傳遞并需要被修改的項(xiàng),整合成一個(gè)列表好看一點(diǎn):
game_stats =[if_lose,direction,num,food]
游戲是否結(jié)束的狀態(tài)變量、蛇頭方向(1234:上下左右,0為靜止)、吃到的食物個(gè)數(shù)、食物的實(shí)例

def going(snakes,snake_color,snake_head_color,lattice_wh,game_stats,food_color,screen):
    """蛇的移動(dòng)和轉(zhuǎn)向問(wèn)題"""
    # 初始狀態(tài),不需要移動(dòng)
    if not game_stats[1]:
        return
    # 預(yù)測(cè)位置
    (x,y) = snakes[0].forecast(game_stats[1])
    # 撞到邊界
    if x == -lattice_wh or x == 25*lattice_wh or y == -lattice_wh or y == 25*lattice_wh:
        game_stats[0] = 0
        return
    # 吃到食物
    if (x,y) == (game_stats[3].x,game_stats[3].y):
        head = Snake(snake_color,snake_head_color,x,y,lattice_wh)
        snakes.insert(0,head)
        game_stats[2] += 1
        game_stats[3] = create_food(food_color,screen,lattice_wh,snakes)
        return
    # 撞到蛇身
    for i in snakes:
        if (x,y) == (i.rect.x,i.rect.y):
            game_stats[0] = 0
            return
    # 都沒(méi)有,就正常移動(dòng)
    for i in range(len(snakes)-1,0,-1):
        snakes[i].rect.x = snakes[i-1].rect.x
        snakes[i].rect.y = snakes[i-1].rect.y
    snakes[0].move(game_stats[1])

這里的正常移動(dòng),我們是否可以這樣寫(xiě)?
snake[i] = snakes[i-1
這樣是不行的,在python中,賦值是將地址賦值過(guò)去,所以實(shí)際上我們是將兩個(gè)實(shí)例指向一個(gè)地址。
對(duì)于snakes[1],當(dāng)我們指向snakes[0],然后修改snakes[0]之后,兩者會(huì)合并為一個(gè),而整個(gè)蛇身就會(huì)缺失一部分。

五、按鍵感應(yīng)

對(duì)于蛇方向的控制,我們是通過(guò)上下左右四個(gè)按鍵實(shí)現(xiàn)的,所以我們還需要修改一下check_events。

先說(shuō)明一下,這里我沒(méi)有使用正常的if-elif對(duì)每一個(gè)方向進(jìn)行判斷,其實(shí)都一樣的。

首先,蛇不能在向上的情況下按向下,所以是有一個(gè)方向沖突的,拿小本本記下來(lái)。

# 方向沖突
conflict = {
    pygame.K_RIGHT:4,
    pygame.K_LEFT :3,
    pygame.K_UP   :1,
    pygame.K_DOWN :2,
    0:0,	# 這個(gè)純屬湊數(shù),問(wèn)題不大
    1:2,
    2:1,
    3:4,
    4:3
}

事件檢測(cè):

def check_events(game_stats,conflict,snakes,snake_color,snake_head_color,
				 lattice_wh,food_color,screen):
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
        	# 按鍵匹配
            if event.key in conflict:
                ret = conflict[event.key]
                # 判斷我們輸入的方向和當(dāng)前方向是否沖突,不沖突就可以修改,然后賦值
                if conflict[ret] != game_stats[1]:
                    game_stats[1] = ret
                    # 調(diào)用移動(dòng)函數(shù)
                    going(snakes,snake_color,snake_head_color,
                    	  lattice_wh,game_stats,food_color,screen)
        elif event.type == pygame.QUIT:
            sys.exit()

(這部分,其實(shí)改變方向不使用going,也沒(méi)什么問(wèn)題)

六、整合部分

剩下的工作,就是將整體串起來(lái)。
換掉了之前的time.sleep,改成了設(shè)置幀率。

import pygame
from fuc import *
from snake import Snake
from time import sleep
from food import Food
# 基本屬性
lattice_wh = 20 #長(zhǎng)寬
snake_color = (84, 255, 159)
snake_head_color = (123, 104, 238)
food_color = (255, 64, 64)

# 繪制界面
pygame.init()
screen = pygame.display.set_mode((25*lattice_wh,25*lattice_wh))
pygame.display.set_caption('貪吃蛇')

# 設(shè)置幀率
FPS=10
level = 0.9     # 每吃掉一個(gè),間隔時(shí)間縮短系數(shù)
FPSClock=pygame.time.Clock()

if_lose = 1
if_food = 1

# 蛇的方向
direction = 0
# 得分,吃一個(gè)一分
num = 0

# 蛇頭1個(gè)蛇身
snakes = []
snakes.append(Snake(snake_color,snake_head_color,lattice_wh,24*lattice_wh,lattice_wh))
snakes.append(Snake(snake_color,snake_head_color,0,24*lattice_wh,lattice_wh))

# 食物
food = create_food(food_color,screen,lattice_wh,snakes)

# 游戲狀態(tài)打包
game_stats =[if_lose,direction,num,food]

# 方向沖突
conflict = {
    pygame.K_RIGHT:4,
    pygame.K_LEFT :3,
    pygame.K_UP   :1,
    pygame.K_DOWN :2,
    0:0,
    1:2,
    2:1,
    3:4,
    4:3
}

while game_stats[0]:
    update(screen,lattice_wh,snakes,game_stats)
    check_events(game_stats,conflict,snakes,snake_color,snake_head_color,
    			 lattice_wh,food_color,screen)
    going(snakes,snake_color,snake_head_color,lattice_wh,game_stats,food_color,screen)
    FPSClock.tick(FPS* level**num)

然后修改一下update函數(shù):

def update(screen,lattice_wh,snakes,game_stats):
    """屏幕刷新"""
    # 背景顏色
    screen.fill((255,255,255))
    # 畫(huà)蛇,需要先畫(huà),不然網(wǎng)格會(huì)被蓋住
    pygame.draw.rect(screen,snakes[0].head_color,snakes[0].rect)
    for i in range(1,len(snakes)):
        pygame.draw.rect(screen,snakes[i].color,snakes[i].rect)
    # 繪制網(wǎng)格
    for i in range(25):
        pygame.draw.line(screen,(105, 105, 105),(0,lattice_wh*i),(500,lattice_wh*i))
    for i in range(25):
        pygame.draw.line(screen,(105, 105, 105),(lattice_wh*i,0),(lattice_wh*i,500))
    # 繪制食物
    game_stats[3].draw()
    pygame.display.flip()

七、結(jié)語(yǔ)

本來(lái)還想添加一些其他的部分,比如在死亡時(shí)候顯示一下得分什么的,但是好象基本上都在這篇博客的彈窗顯示部分寫(xiě)過(guò)了,那么我們這個(gè)就先結(jié)束吧,然后開(kāi)新坑。

到此這篇關(guān)于python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)的文章就介紹到這了,更多相關(guān)pygame實(shí)現(xiàn)貪吃蛇游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python游戲開(kāi)發(fā)的五個(gè)案例分享
  • 總結(jié)Python圖形用戶界面和游戲開(kāi)發(fā)知識(shí)點(diǎn)
  • python游戲開(kāi)發(fā)之視頻轉(zhuǎn)彩色字符動(dòng)畫(huà)
  • 你喜歡籃球嗎?Python實(shí)現(xiàn)籃球游戲
  • 使用python+pygame開(kāi)發(fā)消消樂(lè)游戲附完整源碼
  • 憶童年!用Python實(shí)現(xiàn)憤怒的小鳥(niǎo)游戲
  • python用tkinter開(kāi)發(fā)的掃雷游戲
  • Python實(shí)現(xiàn)簡(jiǎn)單2048小游戲
  • 學(xué)會(huì)用Python實(shí)現(xiàn)滑雪小游戲,再也不用去北海道啦
  • 教你用Python實(shí)現(xiàn)一個(gè)輪盤(pán)抽獎(jiǎng)小游戲
  • python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(一)
  • python使用pgzero進(jìn)行游戲開(kāi)發(fā)

標(biāo)簽:益陽(yáng) 黑龍江 四川 上海 惠州 鷹潭 常德 黔西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)》,本文關(guān)鍵詞  python,實(shí)戰(zhàn),之,利用,pygame,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    欧美多人猛交狂配| 熟女高潮一区二区三区| 秋霞欧美一区二区三区视频免费| 91精品国产入口在线| 亚洲黄色尤物视频| 99免费精品在线观看| 91 在线视频| 国产精品人成在线观看免费| 国产精品一二三四五| 免费在线观看a视频| 欧美精品一区二区三区四区| 美女视频黄频大全不卡视频在线播放| 精品人妻一区二区三区日产| 欧美高清视频在线高清观看mv色露露十八 | 国产盗摄一区二区| 黄色免费一级视频| 国产午夜亚洲精品理论片色戒| 国产一区二区在线视频| 国产一区二区三区精品在线| 国产色91在线| 国产99精品视频| 麻豆网站免费观看| 看免费黄色录像| 亚洲欧美综合另类在线卡通| aaa亚洲精品| 欧美在线你懂得| 亚洲高清免费视频| 特级西西人体4444xxxx| 欧美va亚洲va在线观看蝴蝶网| 久久精品噜噜噜成人av农村| 国产探花视频在线| 国产精品国产三级国产aⅴ入口| 99视频在线精品| 欧美日韩国产综合一区二区| 人人爽香蕉精品| 国产视频三区四区| 国产精品久线观看视频| 亚洲国产综合av| 91精品国产一区二区三区香蕉 | 亚洲在线成人精品| 亚洲成人福利视频| 日韩欧美国产小视频| 国产麻豆9l精品三级站| 在线观看成人毛片| 亚洲妇熟xx妇色黄| 夫妇交换中文字幕| 亚洲人成伊人成综合网小说| 欧美一级片黄色| 久久久久久久电影| 91亚洲精华国产精华精华液| 欧美一级xxx| 国产精品一区二区免费不卡| 欧亚一区二区三区| 美女网站在线免费欧美精品| 麻豆天美蜜桃91| 亚洲国产一二三| 五月天婷婷丁香网| 亚洲影视在线播放| 国产又粗又长免费视频| 亚洲午夜久久久久| 国产欧美一区二区三区在线观看视频| 亚洲精品老司机| 日韩人妻无码精品综合区| 日韩美女啊v在线免费观看| 成人区人妻精品一区二| 欧美激情一区在线观看| 乱码一区二区三区| 国产欧美va欧美不卡在线| 成人欧美精品一区二区| 国产午夜亚洲精品理论片色戒| 色婷婷狠狠18禁久久| 亚洲国产高清在线| 色综合久久五月| 国产精品成人免费在线| 久久久久久亚洲中文字幕无码| 亚洲色图视频网站| 极品久久久久久久| 无吗不卡中文字幕| 色综合一个色综合亚洲| 久久av资源网| 欧美乱妇20p| 99在线热播精品免费| 久久久久久久性| 97精品人人妻人人| 国产精品久99| 91激情视频在线观看| 亚洲成人精品一区二区| 老女人性淫交视频| 精品一区二区影视| 91麻豆精品国产综合久久久久久 | 国产精品一级二级三级| 3atv在线一区二区三区| 北岛玲一区二区三区四区| 精品国产乱码久久| 亚洲婷婷在线观看| 亚洲精品乱码久久久久久| 手机在线免费看片| 国内精品国产成人| 日韩免费高清视频| 中文字幕乱视频| 亚洲自拍偷拍网站| 91国偷自产一区二区三区观看| 国产寡妇亲子伦一区二区| 精品久久久影院| 漂亮人妻被黑人久久精品| 亚洲一区中文日韩| 在线免费不卡视频| 成人免费毛片高清视频| 亚洲国产精品成人久久综合一区 | 午夜精品久久久久久久| 91福利精品第一导航| 成人avav在线| 国产精品女主播在线观看| 欧美巨胸大乳hitomi| 极品美女销魂一区二区三区 | 精品综合久久久久久8888| 欧美精品aⅴ在线视频| 91毛片在线观看| 亚洲视频中文字幕| 国产一二三四区| 国产精品66部| 久久午夜国产精品| 少妇av片在线观看| 精品无人区卡一卡二卡三乱码免费卡| 精品欧美一区二区三区精品久久| 一本色道综合久久欧美日韩精品| 日韩成人一级片| 91精品国产欧美日韩| 大乳护士喂奶hd| 日韩中文字幕区一区有砖一区 | 免费网站在线高清观看| 老司机精品视频导航| 精品欧美久久久| 一级片手机在线观看| 久久国产免费看| 久久精品一区二区| 午夜国产福利视频| 成人av手机在线观看| 亚洲精品视频在线| 欧美三级资源在线| 69亚洲乱人伦| 日本三级韩国三级欧美三级| 欧美zozo另类异族| 精品国产aaa| 国产aⅴ综合色| 亚洲人妖av一区二区| 欧美日韩激情一区二区三区| 69亚洲乱人伦| 麻豆精品一区二区| 国产日韩精品久久久| 国模无码国产精品视频| 亚洲AV无码久久精品国产一区| 亚洲午夜在线观看视频在线| 欧美一区二区网站| av电影网站在线观看| 国产99久久久国产精品| 亚洲综合激情网| 欧美一区二区三区视频免费| 一区二区精品免费| 丁香婷婷综合五月| 亚洲综合久久久| 亚洲精品在线观| 色综合亚洲欧洲| 黄色av网址在线观看| 国产中文字幕一区| 《视频一区视频二区| 91精品欧美福利在线观看| 免费一级做a爰片久久毛片潮| 国产激情一区二区三区四区| 亚洲精品免费播放| 日韩视频免费直播| 青花影视在线观看免费高清| 免费看91视频| 九一九一国产精品| 亚洲日本韩国一区| 欧美sm美女调教| 国产精品老熟女一区二区| 国产一级黄色录像| 国产在线精品一区二区夜色| 亚洲免费观看高清完整| 欧美一区二区高清| 麻豆明星ai换脸视频| 中文字幕在线播放视频| 岛国av在线一区| 日日摸夜夜添夜夜添精品视频 | 一本色道综合久久欧美日韩精品| 国产精品一区二区黑丝| 亚洲与欧洲av电影| 欧美精品一区二区三区蜜桃视频| 日本道免费精品一区二区三区| 疯狂揉花蒂控制高潮h| 成人视屏免费看| 日产国产欧美视频一区精品| 国产精品毛片久久久久久久| 91精品婷婷国产综合久久| 国产又黄又爽又无遮挡| xxxx日本黄色| 中文字幕99页| 岛国精品在线观看| 久久97超碰国产精品超碰|