文章目錄
- Python 貪吃蛇小游戲
- 1. 導包
- 2. 配置初始化引數
- 3. 主函式及運行主體
- 4. 畫食物的函式
- 5. 畫貪吃蛇的函式
- 6. 畫網格的函式(非必選,覺得多余的可以忽略此項)
- 7. 操縱貪吃蛇移動的函式
- 8. 判斷蛇是否死亡的函式
- 9.判斷蛇是否吃到食物的函式
- 10. 隨機生成食物
- 11. 游戲開始與結束的相關配置
- 12. 函式俱備,只欠main這個東風了
- 13.圖片和字體資源
- 14. 更多干貨分享(免費)
今天給大家免費分享一下Python飛機游戲的原始碼,
Python 貪吃蛇小游戲
(宣告:本文使用的原始碼非原創,17年在CSDN上用幣下載的資源,具體是哪位大佬的忘記了)
在此之前首先說一下環境
Python3.X (使用2.x的大佬自己稍微改動一下就行)
pygame 1.9.6(當然這個沒必要和我一樣)
1. 導包
## 匯入相關模塊
import random
import pygame
import sys
from pygame.locals import *
2. 配置初始化引數
snake_speed = 15 #貪吃蛇的速度
windows_width = 800
windows_height = 600 #游戲視窗的大小
cell_size = 20 #貪吃蛇身體方塊大小,注意身體大小必須能被視窗長寬整除
''' #初始化區
由于我們的貪吃蛇是有大小尺寸的, 因此地圖的實際尺寸是相對于貪吃蛇的大小尺寸而言的
'''
map_width = int(windows_width / cell_size)
map_height = int(windows_height / cell_size)
# 顏色定義
white = (255, 255, 255)
black = (0, 0, 0)
gray = (230, 230, 230)
dark_gray = (40, 40, 40)
DARKGreen = (0, 155, 0)
Green = (0, 255, 0)
Red = (255, 0, 0)
blue = (0, 0, 255)
dark_blue =(0,0, 139)
BG_COLOR = black #游戲背景顏色
# 定義方向
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4
HEAD = 0 #貪吃蛇頭部下標
3. 主函式及運行主體
#主函式
def main():
pygame.init() # 模塊初始化
snake_speed_clock = pygame.time.Clock() # 創建Pygame時鐘物件
screen = pygame.display.set_mode((windows_width, windows_height)) #
screen.fill(white)
pygame.display.set_caption("Python 貪吃蛇小游戲") #設定標題
show_start_info(screen) #歡迎資訊
while True:
running_game(screen, snake_speed_clock)
show_gameover_info(screen)
#游戲運行主體
def running_game(screen,snake_speed_clock):
startx = random.randint(3, map_width - 8) #開始位置
starty = random.randint(3, map_height - 8)
snake_coords = [{'x': startx, 'y': starty}, #初始貪吃蛇
{'x': startx - 1, 'y': starty},
{'x': startx - 2, 'y': starty}]
direction = RIGHT # 開始時向右移動
food = get_random_location() #實物隨機位置
while True:
for event in pygame.event.get():
if event.type == QUIT:
terminate()
elif event.type == KEYDOWN:
if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
direction = LEFT
elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
direction = RIGHT
elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
direction = UP
elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
direction = DOWN
elif event.key == K_ESCAPE:
terminate()
move_snake(direction, snake_coords) #移動蛇
ret = snake_is_alive(snake_coords)
if not ret:
break #蛇跪了. 游戲結束
snake_is_eat_food(snake_coords, food) #判斷蛇是否吃到食物
screen.fill(BG_COLOR)
#draw_grid(screen)
draw_snake(screen, snake_coords)
draw_food(screen, food)
draw_score(screen, len(snake_coords) - 3)
pygame.display.update()
snake_speed_clock.tick(snake_speed) #控制fps
4. 畫食物的函式
#將食物畫出來
def draw_food(screen, food):
x = food['x'] * cell_size
y = food['y'] * cell_size
appleRect = pygame.Rect(x, y, cell_size, cell_size)
pygame.draw.rect(screen, Red, appleRect)
5. 畫貪吃蛇的函式
#將貪吃蛇畫出來
def draw_snake(screen, snake_coords):
for coord in snake_coords:
x = coord['x'] * cell_size
y = coord['y'] * cell_size
wormSegmentRect = pygame.Rect(x, y, cell_size, cell_size)
pygame.draw.rect(screen, dark_blue, wormSegmentRect)
wormInnerSegmentRect = pygame.Rect( #蛇身子里面的第二層亮綠色
x + 4, y + 4, cell_size - 8, cell_size - 8)
pygame.draw.rect(screen, blue, wormInnerSegmentRect)
6. 畫網格的函式(非必選,覺得多余的可以忽略此項)
#畫網格(可選)
def draw_grid(screen):
for x in range(0, windows_width, cell_size): # draw 水平 lines
pygame.draw.line(screen, dark_gray, (x, 0), (x, windows_height))
for y in range(0, windows_height, cell_size): # draw 垂直 lines
pygame.draw.line(screen, dark_gray, (0, y), (windows_width, y))
7. 操縱貪吃蛇移動的函式
#移動貪吃蛇
def move_snake(direction, snake_coords):
if direction == UP:
newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] - 1}
elif direction == DOWN:
newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] + 1}
elif direction == LEFT:
newHead = {'x': snake_coords[HEAD]['x'] - 1, 'y': snake_coords[HEAD]['y']}
elif direction == RIGHT:
newHead = {'x': snake_coords[HEAD]['x'] + 1, 'y': snake_coords[HEAD]['y']}
snake_coords.insert(0, newHead)
8. 判斷蛇是否死亡的函式
#判斷蛇死了沒
def snake_is_alive(snake_coords):
tag = True
if snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \
snake_coords[HEAD]['y'] == map_height:
tag = False # 蛇碰壁啦
for snake_body in snake_coords[1:]:
if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:
tag = False # 蛇碰到自己身體啦
return tag
9.判斷蛇是否吃到食物的函式
#判斷貪吃蛇是否吃到食物
def snake_is_eat_food(snake_coords, food): #如果是串列或字典,那么函式內修改引數內容,就會影響到函式體外的物件,
if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']:
food['x'] = random.randint(0, map_width - 1)
food['y'] = random.randint(0, map_height - 1) # 實物位置重新設定
else:
del snake_coords[-1] # 如果沒有吃到實物, 就向前移動, 那么尾部一格刪掉
10. 隨機生成食物
#食物隨機生成
def get_random_location():
return {'x': random.randint(0, map_width - 1), 'y': random.randint(0, map_height - 1)}
11. 游戲開始與結束的相關配置
#開始資訊顯示
def show_start_info(screen):
font = pygame.font.Font('myfont.ttf', 40)
tip = font.render('按任意鍵開始游戲~~~', True, (65, 105, 225))
gamestart = pygame.image.load('gamestart.png')
screen.blit(gamestart, (140, 30))
screen.blit(tip, (240, 550))
pygame.display.update()
while True: #鍵盤監聽事件
for event in pygame.event.get(): # event handling loop
if event.type == QUIT:
terminate() #終止程式
elif event.type == KEYDOWN:
if (event.key == K_ESCAPE): #終止程式
terminate() #終止程式
else:
return #結束此函式, 開始游戲
#游戲結束資訊顯示
def show_gameover_info(screen):
font = pygame.font.Font('myfont.ttf', 40)
tip = font.render('按Q或者ESC退出游戲, 按任意鍵重新開始游戲~', True, (65, 105, 225))
gamestart = pygame.image.load('gameover.png')
screen.blit(gamestart, (60, 0))
screen.blit(tip, (80, 300))
pygame.display.update()
while True: #鍵盤監聽事件
for event in pygame.event.get(): # event handling loop
if event.type == QUIT:
terminate() #終止程式
elif event.type == KEYDOWN:
if event.key == K_ESCAPE or event.key == K_q: #終止程式
terminate() #終止程式
else:
return #結束此函式, 重新開始游戲
#畫成績
def draw_score(screen,score):
font = pygame.font.Font('myfont.ttf', 30)
scoreSurf = font.render('得分: %s' % score, True, Green)
scoreRect = scoreSurf.get_rect()
scoreRect.topleft = (windows_width - 120, 10)
screen.blit(scoreSurf, scoreRect)
#程式終止
def terminate():
pygame.quit()
sys.exit()


12. 函式俱備,只欠main這個東風了
main()
13.圖片和字體資源
這里放不了靜態資源,需要的朋友可以掃碼進入公眾號【大資料編程】后臺回復【snake】即可獲取,

14. 更多干貨分享(免費)
Python飛機大戰小游戲_完整原始碼免費分享
(求職/考研)精選簡歷模板!拿走不謝!
筆試必備!Java、Python、Scala 基礎演算法動圖詳解(值得收藏)
一鍵免費下載全套《阿里巴巴 Java 開發手冊》
Gof23種設計模式趣味詳解(三分鐘上手系列)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/58029.html
標籤:其他
上一篇:視頻存盤是否能再進一步優化
