此篇文章主要是詳細(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è)就可以去了。(打手沖還要3個(gè)原素呢,想一想各是什么?)方位得話只需前后左右4個(gè)確定方位就行了。有最基本的算法設(shè)計(jì)和面向?qū)ο笥^念在這其中。游戲軟件開(kāi)發(fā)本身也要用到好多面向?qū)ο蠖x,而蛇的人體又是個(gè)純天然的“雙向鏈表”構(gòu)造,很適合用于訓(xùn)練算法設(shè)計(jì)了。此外較為有意思的地方在于,Python這個(gè)英語(yǔ)單詞在在英語(yǔ)中便是大蟒蛇的意味,貪食蛇算得上是“同名的手機(jī)游戲”了。很多高校里軟件開(kāi)發(fā)學(xué)科的工作都有貪食蛇的論文選題,也經(jīng)常會(huì)還有同學(xué)問(wèn)到有關(guān)的編號(hào)。(諾基亞對(duì)這款游戲都是十分偏愛(ài)。)之前我也做過(guò)一次《貪吃蛇大作戰(zhàn)》的Python版本號(hào),基于cocos2d-python開(kāi)發(fā)。但那個(gè)針對(duì)新手而言有一些太復(fù)雜了。
接下來(lái)我們做一個(gè)簡(jiǎn)要概述:
此編號(hào)依托于pygame研發(fā),因此運(yùn)作前請(qǐng)保證你自己的Python里已經(jīng)成功組裝pygame。之后直接運(yùn)行代碼中的game2.py即可開(kāi)始游戲。除開(kāi)最后的編號(hào)外,大家還特地溶解了兩個(gè)過(guò)程的py文件,供想讓自己研發(fā)的同學(xué)們參照。
大家首先來(lái)客觀分析,要寫(xiě)下這款游戲來(lái)需用注意些什么點(diǎn)。
1、蛇怎么表達(dá)?
我們能把整個(gè)游戲場(chǎng)地劃分為一個(gè)一個(gè)的方格,由1組連在一起方格構(gòu)成“蛇”,你可以用不一樣的顏色來(lái)描述,如上圖所述中,我用深顏色表達(dá)情況,淺色系表達(dá)“蛇”。
你可以用座標(biāo)來(lái)描述任何一個(gè)小方格,X軸和Y軸標(biāo)準(zhǔn)都是能夠定好的。通過(guò)一個(gè)目錄來(lái)儲(chǔ)存“雙角”的座標(biāo),那樣1條“蛇”就上來(lái)了,最終只需標(biāo)注的過(guò)程中以不一樣的顏色表達(dá)就可以了。
2、蛇怎么移動(dòng)?
首先想到的就是像泥鰍腸蠕動(dòng)相同,任何一個(gè)小三角往前面挪動(dòng)一個(gè),不過(guò)這樣完成下去非常麻煩。本身就是被這兒不動(dòng)了。
展開(kāi)想象大家玩過(guò)的游戲貪食蛇,每一次“蛇”移動(dòng)覺(jué)得上有總體往前面移動(dòng)了一個(gè),過(guò)濾掉腦袋中“蛇”的“行為”,仔細(xì)想挪動(dòng)時(shí)和挪動(dòng)后“蛇”位置變動(dòng),當(dāng)然除了首尾,其他部位根本沒(méi)有變。那么就輕松了,將下一個(gè)格的座標(biāo)導(dǎo)入到目錄打頭,并清除目錄的最后一個(gè)元素,就等于是蛇往前面移動(dòng)了一個(gè)。
3、怎樣判斷比賽終止?
“蛇”挪動(dòng)遠(yuǎn)遠(yuǎn)超過(guò)了游戲區(qū)域的范疇或是不小心碰到自身即便輸?shù)袅?,軸座標(biāo)的范疇是預(yù)先訂好,超出非常容易分辨。那樣怎么判斷遇到自己呢?
假如腦中想的就是“蛇”動(dòng)游戲界面,那簡(jiǎn)直較難了,但放進(jìn)編號(hào)中,我們自己的“蛇”是個(gè)目錄,那樣只需分辨下一個(gè)格的座標(biāo)是不是已經(jīng)包括在“蛇”的頁(yè)面上豈不是就行了?
梳理了各種問(wèn)題,大家就可以去編號(hào)了。
定義游戲元素及界面:
def main(): pygame.init() screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) pygame.display.set_caption('貪吃蛇') light=(100,100,100)#蛇的顏色 dark=(200,200,200)#食物顏色 font1=pygame.font.SysFont('SimHei',24)#得分的字體 font2=pygame.font.Font(None,72)#GAME OVER的字體 red=(200,30,30)#GAME OVER的字體顏色 fwidth,fheight=font2.size('GAME OVER') line_width=1#網(wǎng)格線寬度 black=(0,0,0)#網(wǎng)格線顏色 bgcolor=(40,40,60)#背景色 #方向,起始向右 pos_x=1 pos_y=0 #如果蛇正在向右移動(dòng),那么快速點(diǎn)擊向下向左,由于程序刷新沒(méi)那么快,向下事件會(huì)被向左覆蓋掉,導(dǎo)致蛇后退,直接GAME OVER #b變量就是用于防止這種情況的發(fā)生 b=True #范圍 scope_x=(0,SCREEN_WIDTH//SIZE-1) scope_y=(2,SCREEN_HEIGHT//SIZE-1) #蛇 snake=deque() #食物 food_x=0 food_y=0 初始化蛇及食物: #初始化蛇 def _init_snake(): nonlocal snake snake.clear() snake.append((2,scope_y[0])) snake.append((1,scope_y[0])) snake.append((0,scope_y[0])) #食物 def _create_food(): nonlocal food_x,food_y food_x=random.randint(scope_x[0],scope_x[1]) food_y=random.randint(scope_y[0],scope_y[1]) while(food_x,food_y)in snake: #為了防止食物出到蛇身上 food_x=random.randint(scope_x[0],scope_x[1]) food_y=random.randint(scope_y[0],scope_y[1]) _init_snake()
_create_food()
全部代碼:
""" 貪吃蛇小游戲 """ import random import sys import time import pygame from pygame.locals import* from collections import deque SCREEN_WIDTH=600 SCREEN_HEIGHT=480 SIZE=20 def print_text(screen,font,x,y,text,fcolor=(255,255,255)): imgText=font.render(text,True,fcolor) screen.blit(imgText,(x,y)) def main(): pygame.init() screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) pygame.display.set_caption('貪吃蛇') light=(100,100,100)#蛇的顏色 dark=(200,200,200)#食物顏色 font1=pygame.font.SysFont('SimHei',24)#得分的字體 font2=pygame.font.Font(None,72)#GAME OVER的字體 red=(200,30,30)#GAME OVER的字體顏色 fwidth,fheight=font2.size('GAME OVER') line_width=1#網(wǎng)格線寬度 black=(0,0,0)#網(wǎng)格線顏色 bgcolor=(40,40,60)#背景色 #方向,起始向右 pos_x=1 pos_y=0 #如果蛇正在向右移動(dòng),那么快速點(diǎn)擊向下向左,由于程序刷新沒(méi)那么快,向下事件會(huì)被向左覆蓋掉,導(dǎo)致蛇后退,直接GAME OVER #b變量就是用于防止這種情況的發(fā)生 b=True #范圍 scope_x=(0,SCREEN_WIDTH//SIZE-1) scope_y=(2,SCREEN_HEIGHT//SIZE-1) #蛇 snake=deque() #食物 food_x=0 food_y=0 #初始化蛇 def _init_snake(): nonlocal snake snake.clear() snake.append((2,scope_y[0])) snake.append((1,scope_y[0])) snake.append((0,scope_y[0])) #食物 def _create_food(): nonlocal food_x,food_y food_x=random.randint(scope_x[0],scope_x[1]) food_y=random.randint(scope_y[0],scope_y[1]) while(food_x,food_y)in snake: #為了防止食物出到蛇身上 food_x=random.randint(scope_x[0],scope_x[1]) food_y=random.randint(scope_y[0],scope_y[1]) _init_snake() _create_food() game_over=True start=False#是否開(kāi)始,當(dāng)start=True,game_over=True時(shí),才顯示GAME OVER score=0#得分 orispeed=0.5#原始速度 speed=orispeed last_move_time=None pause=False#暫停 while True: for event in pygame.event.get(): if event.type==QUIT: sys.exit() elif event.type==KEYDOWN: if event.key==K_RETURN: if game_over: start=True game_over=False b=True _init_snake() _create_food() pos_x=1 pos_y=0 #得分 score=0 last_move_time=time.time() elif event.key==K_SPACE: if not game_over: pause=not pause elif event.key in(K_w,K_UP): #這個(gè)判斷是為了防止蛇向上移時(shí)按了向下鍵,導(dǎo)致直接GAME OVER if b and not pos_y: pos_x=0 pos_y=-1 b=False elif event.key in(K_s,K_DOWN): if b and not pos_y: pos_x=0 pos_y=1 b=False elif event.key in(K_a,K_LEFT): if b and not pos_x: pos_x=-1 pos_y=0 b=False elif event.key in(K_d,K_RIGHT): if b and not pos_x: pos_x=1 pos_y=0 b=False #填充背景色 screen.fill(bgcolor) #畫(huà)網(wǎng)格線豎線 for x in range(SIZE,SCREEN_WIDTH,SIZE): pygame.draw.line(screen,black,(x,scope_y[0]*SIZE),(x,SCREEN_HEIGHT),line_width) #畫(huà)網(wǎng)格線橫線 for y in range(scope_y[0]*SIZE,SCREEN_HEIGHT,SIZE): pygame.draw.line(screen,black,(0,y),(SCREEN_WIDTH,y),line_width) if game_over: if start: print_text(screen,font2,(SCREEN_WIDTH-fwidth)//2,(SCREEN_HEIGHT-fheight)//2,'GAME OVER', red) else: curTime=time.time() if curTime-last_move_time>speed: if not pause: b=True last_move_time=curTime next_s=(snake[0][0]+pos_x,snake[0][1]+pos_y) if next_s[0]==food_x and next_s[1]==food_y: #吃到了食物 _create_food() snake.appendleft(next_s) score+=10 speed=orispeed-0.03*(score//100) else: if scope_x[0]<=next_s[0]<=scope_x[1]and scope_y[0]<=next_s[1]<=scope_y[1] and next_s not in snake: snake.appendleft(next_s) snake.pop() else: game_over=True #畫(huà)食物 if not game_over: #避免GAME OVER的時(shí)候把GAME OVER的字給遮住了 pygame.draw.rect(screen,light,(food_x*SIZE,food_y*SIZE,SIZE,SIZE),0) #畫(huà)蛇 for s in snake: pygame.draw.rect(screen,dark,(s[0]*SIZE+line_width,s[1]*SIZE+line_width, SIZE-line_width*2,SIZE-line_width*2),0) print_text(screen,font1,30,7,f'速度:{score//100}') print_text(screen,font1,450,7,f'得分:{score}') pygame.display.update() if __name__=='__main__': main()
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家?guī)?lái)幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/128828.html
摘要:由于年底發(fā)明,第一個(gè)公開(kāi)發(fā)行版發(fā)行于年。像語(yǔ)言一樣源代碼同樣遵循協(xié)議。官方宣布,年月日,停止的更新。被確定為最后一個(gè)版本。的設(shè)計(jì)具有很強(qiáng)的可讀性,相比其他語(yǔ)言經(jīng)常使用英文關(guān)鍵字,其他語(yǔ)言的一些標(biāo)點(diǎn)符號(hào),它具有比其他語(yǔ)言更有特色語(yǔ)法結(jié)構(gòu)。 ...
摘要:感覺(jué)游戲?qū)徍诵抡?shí)施后,國(guó)內(nèi)手游市場(chǎng)略冷清,是不是各家的新游戲都在排隊(duì)等審核。不過(guò)現(xiàn)在微信已經(jīng)悍然屏蔽了它的分享這個(gè)游戲就是現(xiàn)在免費(fèi)榜排名第一的貪吃蛇大作戰(zhàn)。不過(guò)這實(shí)在是一個(gè)挺好實(shí)現(xiàn)的游戲,于是一時(shí)技癢,拿做了一個(gè)實(shí)現(xiàn)。 感覺(jué)游戲?qū)徍诵抡?shí)施后,國(guó)內(nèi)手游市場(chǎng)略冷清,是不是各家的新游戲都在排隊(duì)等審核。媒體們除了之前競(jìng)相追捧《Pokemon Go》熱鬧了一把,似乎也聽(tīng)不到什么聲音了。直到最...
摘要:目錄引言環(huán)境需求分析代碼實(shí)現(xiàn)后記引言前幾天,星球有人提到貪吃蛇,一下子就勾起了我的興趣,畢竟在那個(gè)稱霸的年代,這款游戲可是經(jīng)典中的經(jīng)典啊而用蛇玩貪吃蛇,那再合適不過(guò)了 目錄0 引言1 環(huán)境2 需求分析3 代碼實(shí)現(xiàn)4 后記 0 引言 前幾天,星球有人提到貪吃蛇,一下子就勾起了我的興趣,畢竟在那個(gè)Nokia稱霸的年代,這款游戲可是經(jīng)典中的經(jīng)典?。《肞ython(蛇)玩Snake(貪吃蛇)...
摘要:基本介紹一款移動(dòng)端貪吃蛇大作戰(zhàn)游戲。主要的游戲邏輯有貪吃蛇移動(dòng)碰撞檢測(cè)貪吃蛇碰撞碰撞墻壁和吃食物。貪吃蛇的身體如何跟隨頭部移動(dòng)需要分為兩種情況,在單位時(shí)間內(nèi)貪吃蛇移動(dòng)一單位長(zhǎng)度和貪吃蛇移動(dòng)多單位長(zhǎng)度。 基本介紹 一款移動(dòng)端貪吃蛇大作戰(zhàn)游戲。(只支持移動(dòng)端) 這是一個(gè)臨近 deadline 的課設(shè)項(xiàng)目,為了方便地使用TS,我直接使用angular-cli生成了TypeScript的項(xiàng)...
閱讀 919·2023-01-14 11:38
閱讀 891·2023-01-14 11:04
閱讀 750·2023-01-14 10:48
閱讀 2039·2023-01-14 10:34
閱讀 956·2023-01-14 10:24
閱讀 833·2023-01-14 10:18
閱讀 506·2023-01-14 10:09
閱讀 583·2023-01-14 10:02