基于Pygame實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
導(dǎo)入相關(guān)的包
import pygame, sys, random from pygame.locals import *
設(shè)置屏幕大小以及基本參數(shù)
設(shè)置屏幕大小為400*400,mainClock = pygame.time.Clock()用來(lái)設(shè)置時(shí)間同步,不會(huì)根據(jù)計(jì)算機(jī)的運(yùn)行來(lái)決定運(yùn)行多少次, mainClock.tick(1) 一秒只會(huì)運(yùn)行一次,設(shè)置了屏幕的底色為白色。
# 定義屏幕的寬高 WIDTH = 400 HEIGHT = 400 # 初始化屏幕 設(shè)置窗口標(biāo)題 surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32) pygame.display.set_caption('貪吃蛇') pygame.init() mainClock = pygame.time.Clock() # 定義使用的顏色 BLACK = (0, 0, 0) GREEN = (0, 255, 0) WHITE = (255, 255, 255) while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() surface.fill(WHITE) pygame.display.update() mainClock.tick(1)
設(shè)置貪吃蛇的位置,以及移動(dòng)的大小
這里設(shè)置了貪吃蛇的長(zhǎng)度和起始位置,和食物和蛇的寬度,這里必須設(shè)置為可以被食物和蛇的寬度整除的數(shù),這樣才能保證蛇能到任意的位置
# 設(shè)置蛇的初始長(zhǎng)度 snakeWidth = 4 # 設(shè)置蛇的起始位置為(40,40) snakeX = 40 snakeY = 40 # 食物和蛇的寬度設(shè)置為8 FOODSNAKEWIDTH = 8 # 定義四個(gè)方向 moveLeft = False moveRight = False moveUp = False moveDown = False # 定義初始的方向 moveRight = True def getSnake(): # 設(shè)置蛇的初始長(zhǎng)度為4,并設(shè)置蛇的初始位置為(40,40) # 因?yàn)樨澇陨邥?huì)拐彎,所以將蛇設(shè)置為一個(gè)列表 snake = [] for i in range(snakeWidth): snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH)) return snake # 貪吃蛇 snake = getSnake()
繪制蛇
surface.fill(WHITE) for s in snake: pygame.draw.rect(surface, BLACK, s)
讓蛇動(dòng)起來(lái)
這里將蛇列表最后一位移除,然后將第一位的位置根據(jù)方向加減坐標(biāo)
snake.pop() newTop = copy.deepcopy(snake[0]) # 改變蛇的位置 if moveRight: newTop.left += FOODSNAKEWIDTH if moveLeft: newTop.left -= FOODSNAKEWIDTH if moveUp: newTop.top -= FOODSNAKEWIDTH if moveDown: newTop.top += FOODSNAKEWIDTH snake.insert(0, newTop)
這樣會(huì)有一個(gè)問(wèn)題,如果超出屏幕呢,我們將超出屏幕,那么就會(huì)消失,我們只需要你移動(dòng)第一個(gè)元素的時(shí)候,如果超出則將元素移動(dòng)另一個(gè)位置。
# 改變蛇的位置 if moveRight: if newTop.right == WIDTH: newTop.left = 0 else: newTop.left += FOODSNAKEWIDTH if moveLeft: if newTop.left == 0: newTop.right == WIDTH else: newTop.left -= FOODSNAKEWIDTH if moveUp: if newTop.top == 0: newTop.bottom = HEIGHT else: newTop.top -= FOODSNAKEWIDTH if moveDown: if newTop.bottom == HEIGHT: newTop.top = 0 else: newTop.top += FOODSNAKEWIDTH
實(shí)現(xiàn)貪吃蛇拐彎
為了實(shí)現(xiàn)對(duì)應(yīng)的功能,我們將方向變量改為一個(gè)變量,這樣我們方便修改方向
# 定義四個(gè)方向 # moveLeft moveRight moveUp moveDown # 定義初始的方向 snakeDirection = "moveRight" ---- 省略的代碼 ---- for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_LEFT: if snakeDirection == "moveRight": snake.reverse() snakeDirection = "moveLeft" if event.key == K_RIGHT: if snakeDirection == "moveLeft": snake.reverse() snakeDirection = "moveRight" if event.key == K_UP: if snakeDirection == "moveDown": snake.reverse() snakeDirection = "moveUp" if event.key == K_DOWN: if snakeDirection == "moveUp": snake.reverse() snakeDirection = "moveDown"
為了方便看到效果,我將mainClock.tick(1) 設(shè)置為mainClock.tick(3)
實(shí)現(xiàn)隨機(jī)食物
這里用了很啰嗦的代碼,我自己也看不下去,有點(diǎn)含糊,這里為了簡(jiǎn)單只設(shè)計(jì)了一個(gè)食物,遍歷屏幕上不是貪吃蛇的可以放食物的集合,然后隨機(jī)生成一個(gè)食物。
if len(foods) < foodnum: canFoodColl = [] # 獲取當(dāng)前不是貪吃蛇的位置集合 for x in range(sizeNum): for y in range(sizeNum): foodExist = True for sn in snake: if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top: foodExist = False break if foodExist: canFoodColl.append({'x': x, 'y': y}) f = canFoodColl[random.randint(0, len(canFoodColl))] foods.append(pygame.Rect(f['x'], f['y'], FOODSNAKEWIDTH, FOODSNAKEWIDTH))
吃食物
這里用 colliderect判斷二者是否相撞,然后食物集合置空,不減去貪吃蛇集合的最后一個(gè)元素。
if len(foods) < foodnum: canFoodColl = [] # 獲取當(dāng)前不是貪吃蛇的位置集合 for x in range(sizeNum): for y in range(sizeNum): foodExist = True for sn in snake: if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top: foodExist = False break if foodExist: canFoodColl.append({'x': x, 'y': y}) f = canFoodColl[random.randint(0, len(canFoodColl))] foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH)) print(f['x']) print(f['y']) else: if newTop.colliderect(foods[0]): foods = [] eatFlg = True print('xxx')
完整代碼?
import pygame, sys, random from pygame.locals import * import copy # 定義屏幕的寬高 WIDTH = 400 HEIGHT = 400 # 初始化屏幕 設(shè)置窗口標(biāo)題 surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32) pygame.display.set_caption('貪吃蛇') pygame.init() mainClock = pygame.time.Clock() # 定義使用的顏色 BLACK = (0, 0, 0) GREEN = (0, 255, 0) WHITE = (255, 255, 255) # 設(shè)置蛇的初始長(zhǎng)度 snakeWidth = 4 # 設(shè)置蛇的起始位置為(40,40) snakeX = 40 snakeY = 40 # 食物和蛇的寬度設(shè)置為8 FOODSNAKEWIDTH = 8 # 定義四個(gè)方向 # moveLeft moveRight moveUp moveDown # 定義初始的方向 snakeDirection = "moveRight" # 食物區(qū)間 foods = [] # 用去寬度處以對(duì)應(yīng)的 大小,減去1 就是食物矩形起點(diǎn)可以存在的區(qū)間 #sizeNum = HEIGHT / FOODSNAKEWIDTH - 1 # 這里為了減少計(jì)算 sizeNum = 39 # 為了簡(jiǎn)單我們只設(shè)置一個(gè)食物 foodnum = 1 def getSnake(): # 設(shè)置蛇的初始長(zhǎng)度為4,并設(shè)置蛇的初始位置為(40,40) # 因?yàn)樨澇陨邥?huì)拐彎,所以將蛇設(shè)置為一個(gè)列表 snake = [] for i in range(snakeWidth): snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH)) return snake # 貪吃蛇 snake = getSnake() while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_LEFT: if snakeDirection == "moveRight": snake.reverse() snakeDirection = "moveLeft" if event.key == K_RIGHT: if snakeDirection == "moveLeft": snake.reverse() snakeDirection = "moveRight" if event.key == K_UP: if snakeDirection == "moveDown": snake.reverse() snakeDirection = "moveUp" if event.key == K_DOWN: if snakeDirection == "moveUp": snake.reverse() snakeDirection = "moveDown" surface.fill(WHITE) for s in snake: pygame.draw.rect(surface, BLACK, s) for f in foods: pygame.draw.rect(surface, GREEN, f) pygame.display.update() # 是否吃了食物 eatFlg = False newTop = copy.deepcopy(snake[0]) # 改變蛇的位置 if snakeDirection == "moveRight": if newTop.right == WIDTH: newTop.left = 0 else: newTop.left += FOODSNAKEWIDTH if snakeDirection == "moveLeft": if newTop.left == 0: newTop.right = WIDTH else: newTop.left -= FOODSNAKEWIDTH if snakeDirection == "moveUp": if newTop.top == 0: newTop.bottom = HEIGHT else: newTop.top -= FOODSNAKEWIDTH if snakeDirection == "moveDown": if newTop.bottom == HEIGHT: newTop.top = 0 else: newTop.top += FOODSNAKEWIDTH if len(foods) < foodnum: canFoodColl = [] # 獲取當(dāng)前不是貪吃蛇的位置集合 for x in range(sizeNum): for y in range(sizeNum): foodExist = True for sn in snake: if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top: foodExist = False break if foodExist: canFoodColl.append({'x': x, 'y': y}) f = canFoodColl[random.randint(0, len(canFoodColl))] foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH)) print(f['x']) print(f['y']) else: if newTop.colliderect(foods[0]): foods = [] eatFlg = True print('xxx') snake.insert(0, newTop) if not eatFlg: snake.pop() mainClock.tick(3)
以上就是基于Pygame實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的詳細(xì)內(nèi)容,更多關(guān)于Pygame 貪吃蛇游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)
- python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(一)
- 五分鐘學(xué)會(huì)怎么用Pygame做一個(gè)簡(jiǎn)單的貪吃蛇
- 使用Python第三方庫(kù)pygame寫個(gè)貪吃蛇小游戲
- python 使用pygame工具包實(shí)現(xiàn)貪吃蛇游戲(多彩版)
- pygame實(shí)現(xiàn)貪吃蛇游戲(下)
- pygame實(shí)現(xiàn)貪吃蛇游戲(上)
- PyGame貪吃蛇的實(shí)現(xiàn)代碼示例
- 使用pygame模塊編寫貪吃蛇的實(shí)例講解
- pygame實(shí)現(xiàn)貪吃蛇游戲
相關(guān)文章
python sort、sort_index方法代碼實(shí)例
這篇文章主要介紹了python sort、sort_index方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03pandas實(shí)現(xiàn)datetime64與unix時(shí)間戳互轉(zhuǎn)
這篇文章主要介紹了pandas實(shí)現(xiàn)datetime64與unix時(shí)間戳互轉(zhuǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06Python正則匹配判斷手機(jī)號(hào)是否合法的方法
今天小編就為大家分享一篇Python正則匹配判斷手機(jī)號(hào)是否合法的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Django admin實(shí)現(xiàn)TextField字段changelist頁(yè)面換行、空格正常顯示
本文主要介紹了Django admin實(shí)現(xiàn)TextField字段changelist頁(yè)面換行、空格正常顯示,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01教你使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易版Web服務(wù)器
這篇文章主要介紹了教你使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易版Web服務(wù)器,本篇文章將通過(guò)實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的Web服務(wù)器,幫助讀者理解Python網(wǎng)絡(luò)編程的基本概念和技巧,需要的朋友可以參考下2023-04-04在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法
本文主要介紹了在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07