前言
今天給大家分享貪吃蛇小游戲,廢話不多說,讓我們愉快地開始吧~
效果展示

開發工具
Python版本: 3.6.4
相關模塊:
pygame模塊;
以及一些Python自帶的模塊,
環境搭建
安裝Python并添加到環境變數,pip安裝需要的相關模塊即可,
原理簡介
貪吃蛇的游戲規則應該不需要我多做介紹了吧T_T,寫個貪吃蛇游戲其實還是很簡單的,首先,我們進行一下游戲初始化:
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Greedy Snake —— 微信公眾號:Charles的皮卡丘')
clock = pygame.time.Clock()
然后定義一個貪吃蛇類:
'''貪吃蛇類'''
class Snake(pygame.sprite.Sprite):
def __init__(self, cfg, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.cfg = cfg
self.head_coord = [random.randint(5, cfg.GAME_MATRIX_SIZE[0]-6), random.randint(5, cfg.GAME_MATRIX_SIZE[1]-6)]
self.tail_coords = []
for i in range(1, 3):
self.tail_coords.append([self.head_coord[0]-i, self.head_coord[1]])
self.direction = 'right'
self.head_colors = [(0, 80, 255), (0, 255, 255)]
self.tail_colors = [(0, 155, 0), (0, 255, 0)]
其中head_coord用來記錄蛇頭所在位置,而tail_coords是一個二維陣列,用來記錄所有蛇身的位置,一開始,貪吃蛇長為3,并且位置是隨機生成的,用戶通過↑↓←→鍵來控制貪吃蛇的行動:
# --按鍵檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
需要注意的是,貪吃蛇不能180°大拐彎,只能90°地拐彎,例如正在向左行動的貪吃蛇不能瞬間變成向右行動,具體而言,代碼實作如下:
'''設定方向'''
def setDirection(self, direction):
assert direction in ['up', 'down', 'right', 'left']
if direction == 'up':
if self.head_coord[1]-1 != self.tail_coords[0][1]:
self.direction = direction
elif direction == 'down':
if self.head_coord[1]+1 != self.tail_coords[0][1]:
self.direction = direction
elif direction == 'left':
if self.head_coord[0]-1 != self.tail_coords[0][0]:
self.direction = direction
elif direction == 'right':
if self.head_coord[0]+1 != self.tail_coords[0][0]:
self.direction = direction
然后,我們需要隨機生成一個食物,且需要保證該食物的位置不與貪吃蛇的位置相同:
'''食物類'''
class Apple(pygame.sprite.Sprite):
def __init__(self, cfg, snake_coords, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.cfg = cfg
while True:
self.coord = [random.randint(0, cfg.GAME_MATRIX_SIZE[0]-1), random.randint(0, cfg.GAME_MATRIX_SIZE[1]-1)]
if self.coord not in snake_coords:
break
self.color = (255, 0, 0)
'''畫到螢屏上'''
def draw(self, screen):
cx, cy = int((self.coord[0] + 0.5) * self.cfg.BLOCK_SIZE), int((self.coord[1] + 0.5) * self.cfg.BLOCK_SIZE)
pygame.draw.circle(screen, self.color, (cx, cy), self.cfg.BLOCK_SIZE//2-2)
# 隨機生成一個食物
apple = Apple(cfg, snake.coords)
在更新貪吃蛇的時候,如果它吃到了食物,則蛇身長加一,否則只是簡單的按照給定的方向行動而不改變蛇身長度:
'''更新貪吃蛇'''
def update(self, apple):
# 根據指定的方向運動
self.tail_coords.insert(0, copy.deepcopy(self.head_coord))
if self.direction == 'up':
self.head_coord[1] -= 1
elif self.direction == 'down':
self.head_coord[1] += 1
elif self.direction == 'left':
self.head_coord[0] -= 1
elif self.direction == 'right':
self.head_coord[0] += 1
# 判斷是否吃到了食物
if self.head_coord == apple.coord:
return True
else:
self.tail_coords = self.tail_coords[:-1]
return False
同時,當貪吃蛇吃到食物時,需要重新生成一個新的食物:
apple = Apple(cfg, snake.coords)
最后,當貪吃蛇碰到墻壁或者蛇頭碰到蛇身時,游戲結束:
'''判斷游戲是否結束'''
@property
def isgameover(self):
if (self.head_coord[0] < 0) or (self.head_coord[1] < 0) or \
(self.head_coord[0] >= self.cfg.GAME_MATRIX_SIZE[0]) or \
(self.head_coord[1] >= self.cfg.GAME_MATRIX_SIZE[1]):
return True
if self.head_coord in self.tail_coords:
return True
return False
并顯示一下游戲結束界面:
endInterface(screen, cfg)
文章到這里就結束了,感謝你的觀看,Python24個小游戲系列,下篇文章分享掃雷小游戲
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375130.html
標籤:其他
