趣学python3(28)-pygame-蛇身随机运动(可gameover )
生活随笔
收集整理的這篇文章主要介紹了
趣学python3(28)-pygame-蛇身随机运动(可gameover )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import sys, pygame
import random
from collections import deque
import numpy as np
import copydef getPositionFromMap(mapPos):return (mapPos[0]*snakeNodeW,mapPos[1]*snakeNodeH)pygame.init()
#code:劉興
snakeLen=6
size = width, height = 500, 500
black = 0, 0, 0gameMapSize=(50,50)
#gamemap
gameMap=np.zeros(gameMapSize,dtype=np.int16)
screen = pygame.display.set_mode(size)
#snake1node:
snakeNodeW=int(width/gameMapSize[0])
snakeNodeH=int(height/gameMapSize[1])
snakeNodeSize=(snakeNodeW,snakeNodeH)
snakeNodeImage = pygame.image.load("snake1.png")
snakeNode = pygame.transform.scale(snakeNodeImage,snakeNodeSize)
snakeNodeRect = snakeNode.get_rect()
#蛇節點隊列
snakeNodeDeque=deque([])
fpsClock = pygame.time.Clock()
#mappos
nowNodeMapPos=[gameMapSize[0]//2,gameMapSize[1]//2]
#nowsnakenode
nowSnakeNode=snakeNode
nowSnakeNodeRect=copy.deepcopy(snakeNodeRect)
nowNodePos=getPositionFromMap(nowNodeMapPos)
nowSnakeNodeRect.x=nowNodePos[0]
nowSnakeNodeRect.y=nowNodePos[1]
gameMap[tuple(nowNodeMapPos)]=1
#snakedeque
snakeNodeDeque.append((nowSnakeNode,nowSnakeNodeRect,nowNodeMapPos))print(nowNodeMapPos)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()runDirection=random.randint(1,4)#left,right,up,downisContiune=TruenewNodeMapPos=copy.deepcopy(nowNodeMapPos)for i in range(5): if runDirection==1:oldNodeMapPos=copy.deepcopy(nowNodeMapPos)newNodeMapPos[0]=nowNodeMapPos[0]-1if newNodeMapPos[0]<0:isContiune=TruenewNodeMapPos=oldNodeMapPoselif gameMap[tuple(newNodeMapPos)]==0:isContiune=Falseelif runDirection==2 :oldNodeMapPos=copy.deepcopy(nowNodeMapPos)newNodeMapPos[0]=nowNodeMapPos[0]+1if newNodeMapPos[0]>=gameMapSize[0]:isContiune=TruenewNodeMapPos=oldNodeMapPoselif gameMap[tuple(newNodeMapPos)]==0:isContiune=False elif runDirection==3 :oldNodeMapPos=copy.deepcopy(nowNodeMapPos)newNodeMapPos[1]=nowNodeMapPos[1]-1if newNodeMapPos[1]<0 :isContiune=TruenewNodeMapPos=oldNodeMapPoselif gameMap[tuple(newNodeMapPos)]==0:isContiune=False elif runDirection==4 :oldNodeMapPos=copy.deepcopy(nowNodeMapPos)newNodeMapPos[1]=nowNodeMapPos[1]+1 if newNodeMapPos[1]>=gameMapSize[1]:isContiune=TruenewNodeMapPos=oldNodeMapPoselif gameMap[tuple(newNodeMapPos)]==0:isContiune=False if not isContiune:print("===")print(nowNodeMapPos)print(newNodeMapPos)print("===") breakelse:print(f"前方受阻,第{i}次嘗試改變方向...")runDirection=i if isContiune: print("game over")pygame.quit()sys.exit()snakeNodeHeadNewRect= copy.deepcopy(nowSnakeNodeRect) newNodePos=getPositionFromMap(newNodeMapPos)snakeNodeHeadNewRect.x=newNodePos[0]snakeNodeHeadNewRect.y=newNodePos[1]snakeNodeHeadNew =nowSnakeNodesnakeNodeDeque.append((snakeNodeHeadNew,snakeNodeHeadNewRect,newNodeMapPos))gameMap[tuple(newNodeMapPos)]=1 nowNodeMapPos=copy.deepcopy(newNodeMapPos)nowSnakeLen=len(snakeNodeDeque) if nowSnakeLen>snakeLen: snakeNodeAbandon=snakeNodeDeque.popleft()snakeNodeAbandonPos=snakeNodeAbandon[2]print(f"---{snakeNodeAbandonPos}")print(snakeNodeDeque)gameMap[tuple(snakeNodeAbandonPos)]=0del snakeNodeAbandonelse:print(f"@@@{nowSnakeLen}@@@")screen.fill(black) for snakeNodeData in snakeNodeDeque:screen.blit(snakeNodeData[0],snakeNodeData[1])pygame.display.update()fpsClock.tick(5)
總結
以上是生活随笔為你收集整理的趣学python3(28)-pygame-蛇身随机运动(可gameover )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue-cli 项目打包布署(简单清晰)
- 下一篇: RedisTemplate常用集合使用说