今天呢,將分享乙個關於 遊戲製作的小案例;僅用不到 200 行**實現乙個貪吃蛇遊戲,作為 python遊戲 系列的第一篇文章,先看一下程式效果
關於程式具體實現部分,請看下文
工具庫程式中用到的 python 庫有:
sys
pygame
time
collection
time
random
其中核心庫為pygame;
實現細節
貪吃蛇 具體實現部分,大致分為三個模組來介紹:遊戲初始化、遊戲執行(蛇移動、吃掉食物)、遊戲結束
1,遊戲初始化
首先,需對遊戲中的蛇、食物、遊戲邊界、各元素顏色屬性、得分記錄、速度記錄等進行初始化,初始的視窗大小設為(600,480),通過寬度為 1 的黑線將遊戲視窗分為數個小方格(每個小方格大小為(20,20)
)
screen_width = 600 # 螢幕長
screen_height = 480 #螢幕寬
size = 20 # 小方格大小
line_width = 1 #網格線寬度;
#遊戲區域的座標範圍
scope_x = (0,screen_width//size-1)
scope_y = (0,screen_height//size-1)
#食物分值及顏色
food_style_list = [(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))]
light = (100,100,100)
dark = (200,200,200) #蛇的顏色
black = (0,0,0) #網格線顏色,黑色
red = (200,30,30) # 紅色,game over 字型顏色
bgcolor = (40,40,60) #背景色
初始化的蛇大小佔連續3個小方格;食物佔 1個小方格、初始時食物隨機放置在視窗內某一座標處(當然需要排除蛇身區域外)
# 初始化蛇
def init_snake():
snake = deque()
return snake
# 建立食物
def create_food(snake):
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])
return food_x,food_y
2,遊戲得分
當遊戲開始時需給與 **蛇 ** 運動方向設定為乙個初始引數 ,這裡以二維元組形式儲存,賦值給變數 p,共分為四種情況:
配合鍵盤事件響應,當使用者按下 上(w)、下(s)、左(a)、右(d)鍵時,程式會執行相應操作
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
snake = init_snake()
food = create_food(snake)
food_style = get_food_style()
pos = (1,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):
#判斷防止蛇向上移動時按了向下鍵,導致game over
if b and not pos[1]:
pos = (0,-1)
b = false
elif event.key in (k_s,k_down):
if b and not pos[1]:
pos =(0,1)
b = false
elif event.key in (k_a,k_left):
if b and not pos[0]:
pos = (-1,0)
b =false
elif event.key in (k_d,k_right):
if b and not pos[0]:
pos =(1,0)
b = false
蛇身移動程式將蛇所佔所有小方格座標依次儲存在乙個佇列中,移動一次,佇列完成一次進出操作:隊尾刪除乙個元素,對列頭部插入蛇頭所在的新方格座標;
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):
# 下個座標在範圍內
#依次進出元素
吃到食物
每吃到一次食物,蛇身多增加乙個小方格區域,其佇列插入乙個新元素、長度加一
,
next_s = (snake[0][0] + pos[0],snake[0][1] +pos[1])#蛇移動
if next_s == food:#吃到了食物
speed = orispeed - 0.03*(score//100) # 更新速度
food = create_food(snake)
food_style = get_food_style()
3,遊戲結束
遊戲終止的邊界條件為兩類
1,移動區域超出視窗邊界;
2,蛇頭碰到蛇身;
程式中用 布林變數 game_over來標識遊戲是否結束(true或者false),每次重新整理頁面之前預設為 false,當遊戲正常執行未發生以上兩類事件時設為true 遊戲執行,否則遊戲結束
if game_over:#遊戲結束
if start:
print_text(screen,font2,(screen_width-fwidth)//2,(screen_height-fheight)//2,'game over',red)
pygame.display.update()#重新整理頁面
為了提高遊戲體驗,程式中用 score 變數表示得分,speed 來表示移動速度,得分每增加100 更新一次移
動速度,隨著時間推移遊戲難度也不斷加大
score += food_style[0]
speed = orispeed - 0.03*(score//100) # 更新速度
小結
本次製作的這個貪吃蛇只是具備了一些基本功能,目前還有很大的改善空間,比如借助 pygame 的 mixer 模組在遊戲中一些特定事件處加入一些觸發音效,遊戲開始時增加乙個初始化頁面等;總的來說,這個小遊戲只適合學習不適合玩耍,想玩耍的話建議移步王者榮耀等高階遊戲區
原始碼獲取
一 貪吃蛇的製作
對於貪吃蛇 很多人都不陌生 但作為學程式設計的學生 如何在學完c語言後寫出一款控制台貪吃蛇呢?1首先,我們要明確要定義的標頭檔案 include include include windows程式設計標頭檔案 include include 控制台輸入輸出標頭檔案 include2其次,無論是遊戲還...
用MFC寫了個貪吃蛇
這幾天看侯sir的 深入淺出mfc 看完了覺得如果就這麼放下可能效果不好,就做了個貪吃蛇,本來打算做另乙個東西呢,結果發現現在知識儲備還不夠,還得看看書,再說吧!貪吃蛇實現得比較簡單,sdi,單執行緒,沒用位圖,因為我沒搞明白怎麼編輯和使用位圖,而且在網上看到乙個也沒用點陣圖的貪吃蛇範例,很好看,就...
c語言寫了乙個貪吃蛇
很簡單的 可能存在一些bug 大牛不要嘲笑 include stdafx.h include include head.h include include int x 1,y 1,m 0 m為蛇的長度 n為食物個數 int nx 1,ny 1,n 0 int chengji 0 void 遊戲開始 ...