專(zhuān)業(yè)網(wǎng)站建站公司合肥網(wǎng)站設(shè)計(jì)
Pygame專(zhuān)為Python設(shè)計(jì),支持多平臺(tái)(如Windows、Mac OS X、Linux、Android等),提供簡(jiǎn)單易用的API來(lái)創(chuàng)建2D游戲。它不僅僅局限于游戲開(kāi)發(fā),還可用于圖形界面和音頻應(yīng)用。
Pygame提供了簡(jiǎn)潔的API,使得開(kāi)發(fā)者可以快速上手并創(chuàng)建游戲原型。我花了幾個(gè)小時(shí)學(xué)習(xí),第二天就開(kāi)發(fā)出了貪吃蛇的主體功能,代碼不到100行。
我的設(shè)計(jì)思路和算法主要如下:
1、每次蛇移動(dòng),都先填充整個(gè)窗口背景,遮蓋原來(lái)蛇的圖形,然后在新的位置重新繪制,以達(dá)到蛇移動(dòng)的視覺(jué)效果。
2、蛇身由多個(gè)小正方形組成,每次蛇移動(dòng),后面的小正方形便移動(dòng)到前一個(gè)小正方形的當(dāng)前位置上,以此類(lèi)推,所以控制蛇身移動(dòng)的方向,只要控制蛇頭移動(dòng)的方向即可。
3、當(dāng)遇到窗口邊緣時(shí),蛇從另一邊出來(lái)。
完整代碼如下:
import pygame,sys
from random import randintpygame.init()
screen = pygame.display.set_mode((800,600))
screen.fill((145,120,60))alen = 20 #每一節(jié)蛇身體的邊長(zhǎng)
x_step = alen #x的步進(jìn)值
y_step = 0 #y的步進(jìn)值
food_rect = ()
#蛇身體由多個(gè)小正方形組成
snake = [(300,400,alen,alen),(280,400,alen,alen),(260,400,alen,alen),(240,400,alen,alen),(220,400,alen,alen),(200,400,alen,alen)]
last_snake=[]def move_head():'''到達(dá)窗口邊界就從另外一邊出來(lái)'''r = snake[0]#蛇頭if (r[0]==(screen.get_width())) and last_snake[1][0]+alen==r[0]: #向右到達(dá)右邊界snake[0] = (0,r[1],r[2],r[3]) elif r[0]==0 and last_snake[1][0]==r[0]+alen: #向左到達(dá)左邊界snake[0] = (screen.get_width()-alen,r[1],r[2],r[3])elif r[1]==(screen.get_height()) and last_snake[1][1]+alen==r[1]: #向下到達(dá)下邊界snake[0] = (r[0],0,r[2],r[3])elif r[1]==0 and last_snake[1][1]==r[1]+alen: #向上到達(dá)上邊界snake[0] = (r[0],screen.get_height()-alen,r[2],r[3]) else:snake[0] = (r[0]+x_step,r[1]+y_step,r[2],r[3])def move():'''蛇前進(jìn),每一節(jié)蛇身體的下一個(gè)坐標(biāo)是它的前一節(jié)身體的當(dāng)前坐標(biāo)'''global x_step,y_step,last_snake pygame.time.delay(300) last_snake = snake.copy() for i in range(len(snake)-1,-1,-1):if i>0:snake[i] = snake[i-1] move_head() draw_snake()def draw_snake():for s in snake:pygame.draw.rect(screen,(0,0,255),s)def draw_food():global food_rectif len(food_rect)==0:xf = randint(1,screen.get_width())//alen*alen #食物出現(xiàn)的位置應(yīng)被alen整除yf = randint(1,screen.get_height())//alen*alenfood_rect = (xf,yf,alen,alen)pygame.draw.rect(screen,(255,0,0),food_rect)def eat():global snake,last_snake,food_rectif snake[0]==food_rect:last_snake.insert(0,food_rect)snake = last_snake.copy()food_rect = ()return Trueelse:return Falsewhile True:for event in pygame.event.get():if event.type == pygame.QUIT:#關(guān)閉窗口pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:x_step = 0y_step = -alenelif event.key == pygame.K_RIGHT:x_step = aleny_step = 0elif event.key == pygame.K_LEFT:x_step = -aleny_step = 0elif event.key == pygame.K_DOWN:x_step = 0y_step = alenscreen.fill((145,120,60)) #填充背景,抹掉上一次的繪圖draw_food()if eat():draw_snake()else:move()pygame.display.flip()