人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

python實現(xiàn)雙人貪吃蛇小游戲

發(fā)布日期:2022-02-14 18:36 | 文章來源:腳本之家

小編今天要給大家分享的是雙人貪吃蛇,大家可以和自己的兄弟,姐妹,爸爸,媽媽等一起玩喲!我先介紹一下游戲:

運行游戲,進入初始界面,按下空格鍵。

玩家(1):w,a,s,d

玩家(2):↑,←,↓,→

玩家要爭奪7個實物,直到吃完為止

游戲結(jié)束。

下面是小編寫的代碼:

import math
import random
import pygame
from pygame.locals import *
 
running = False
playing = False
screen = None
timer = None
snk1 = None
snk2 = None
foods = None
remainFoods = 7
radiusFood = 8
 
'''
鏈表節(jié)點
'''
class Node:
 def __init__(self, data, prev = None, next = None):
  self.data = data
  self.prev = prev
  self.next = next
 
 def insert_front(self, node):
  if self.prev:
node.prev = self.prev
self.prev.next = node
self.prev = node
node.next = self
  else:
self.prev = node
node.next = self
  return node
 
 def insert_back(self, node):
  if self.next:
node.next = self.next
self.next.prev = node
self.next = node
node.prev = self
  else:
self.next = node
node.prev = self
  return node
 
 def remove(self):
  if self.next:
self.next.prev = self.prev
  if self.prev:
self.prev.next = self.next
 
'''
蛇
'''
class Snack:
 
 def __init__(self, surface, color, start_pos, end_pos, face):
  self.color = color
  self.surface = surface
  self.head = Node(start_pos)
  self.tail = Node(end_pos)
  self.head.insert_back(self.tail)
  self.length = self.distanceBetween(start_pos, end_pos)
  self.face = face
  self.speed = 120
  self.eat = 0
  self.grow = 0
  self.mapAngle = [
[0, math.pi * 3 / 2, math.pi / 2],
[0, math.pi * 7 / 4, math.pi / 4],
[math.pi, math.pi * 5 / 4, math.pi * 3 / 4]
  ]
 
 '''坐標(biāo)取整'''
 def intPos(self, pos):
  return (int(pos[0]), int(pos[1]))
 
 '''坐標(biāo)轉(zhuǎn)角度'''
 def pos2Angle(self, pos):
  return self.mapAngle[pos[0]][pos[1]]
 
 '''極坐標(biāo)位移'''
 def polarPos(self, pos, angle, dis):
  xx = pos[0] + dis * math.cos(angle)
  yy = pos[1] + dis * math.sin(angle)
  return (xx, yy)
 
 '''計算兩點間距離'''
 def distanceBetween(self, pos1, pos2):
  dx = pos2[0] - pos1[0]
  dy = pos2[1] - pos1[1]
  return math.sqrt(dx*dx + dy*dy)
 
 '''計算兩點間角度'''
 def angleBetween(self, pos1, pos2):
  dx = pos2[0] - pos1[0]
  dy = pos2[1] - pos1[1]
  return math.atan2(dy, dx)
 
 '''改變面向'''
 def changeFace(self, newFace):
  if newFace[0] == 0 and newFace[1] == 0:
return
  if newFace == self.face:
return
  xx = self.face[0] + newFace[0]
  yy = self.face[1] + newFace[1]
  if xx == 0 and yy == 0:
return
  self.face = newFace
  self.head = self.head.insert_front(Node(self.head.data))
 
 '''吃到食物'''
 def eatFood(self, grow):
  self.grow = grow
  self.eat += 1
 
 '''繪制蛇身'''
 def draw(self):
  node = self.head
  pygame.draw.circle(self.surface, self.color, self.intPos(node.data), 6, 6)
  while node:
n2 = node.next 
if not n2:
 break
pygame.draw.line(self.surface, self.color, self.intPos(node.data), self.intPos(n2.data), 6)
node = node.next
 
 '''每幀移動'''
 def walk(self, delta):
  dis = self.speed * delta / 1000
  self.head.data = self.polarPos(self.head.data, self.pos2Angle(self.face), dis)
  if self.grow >= dis:
self.grow -= dis
  else:
dis -= self.grow
self.grow = 0
self.cutTail(dis)
 
 '''收縮尾巴'''
 def cutTail(self, length):
  node = self.tail
  while length > 0:
n2 = node.prev
dis = self.distanceBetween(n2.data, node.data)
angle = self.angleBetween(node.data, n2.data)
if dis > length:
 node.data = self.polarPos(node.data, angle, length)
 length = 0
else:
 self.tail = node.prev
 node.remove()
 length -= dis
 
node = node.prev
 
'''屏幕指定位置繪制文字'''
def printText(surface, str, pos, size = 24, color = (255, 255, 255)):
 global screen
 font = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", size)
 text = font.render(str, True, color)
 w = text.get_width()
 h = text.get_height()
 surface.blit(text, (pos[0] - w / 2, pos[1] - h / 2))
 
'''添加食物'''
def addFood():
 global screen, snk1, snk2, foods, remainFoods
 if remainFoods <= 0:
  return
 w = screen.get_width()
 h = screen.get_height()
 while True:
  posX = random.randint(5, w - 5)
  posY = random.randint(5, h - 5)
  color = tuple(screen.get_at((posX, posY)))
  if color != snk1.color and color != snk2.color:
break
 remainFoods -= 1
 if not foods:
  foods = Node((posX, posY))
 else:
  foods = foods.insert_front(Node((posX, posY)))
 
'''刪除食物'''
def removeFood(node):
 global foods
 if node == foods:
  foods = foods.next
 else:
  node.remove()
 
'''檢測吃到食物'''
def checkEatFood():
 global foods, radiusFood, snk1, snk2
 node = foods
 while node:
  if snk1.distanceBetween(snk1.head.data, node.data) < (radiusFood + 4):
snk1.eatFood(50)
removeFood(node)
addFood()
break
  elif snk2.distanceBetween(snk2.head.data, node.data) < (radiusFood + 4):
snk2.eatFood(50)
removeFood(node)
addFood()
break
  else:
node = node.next
 
'''游戲初始界面'''
def logo():
 global screen, remainFoods
 w = screen.get_width()
 h = screen.get_height()
 printText(screen, "Snack V1.0", (w / 2, h / 3), 48)
 printText(screen, "任意鍵繼續(xù)", (w / 2, h / 2), 24, (55, 255, 55))
 printText(screen, str(remainFoods) + "個食物,搶完即止", (w / 2, h * 2 / 3), 32)
 
def quit():
 pygame.font.quit()
 
'''檢測游戲結(jié)束'''
def checkGameOver():
 global remainFoods, snk1, snk2, foods, playing, screen
 if remainFoods == 0 and foods == None:
  playing = False
  screen.fill((0,0,0))
  w = screen.get_width()
  h = screen.get_height()
  if snk1.eat > snk2.eat:
printText(screen, "玩家1 勝利", (w / 2, h / 2), 48)
  elif snk1.eat < snk2.eat:
printText(screen, "玩家2 勝利", (w / 2, h / 2), 48)
  else:
printText(screen, "平局", (w / 2, h / 2), 48)
 
'''鍵盤按鍵轉(zhuǎn)換成面向角度'''
def cmd():
 global snk1, snk2
 keys = pygame.key.get_pressed()
 x1 = x2 = y1 = y2 = 0
 if keys[pygame.K_RIGHT]:
  x2+=1
 if keys[pygame.K_LEFT]:
  x2-=1
 if keys[pygame.K_UP]:
  y2+=1
 if keys[pygame.K_DOWN]:
  y2-=1
 if keys[pygame.K_d]:
  x1+=1
 if keys[pygame.K_a]:
  x1-=1
 if keys[pygame.K_w]:
  y1+=1
 if keys[pygame.K_s]:
  y1-=1
 snk1.changeFace((x1, y1))
 snk2.changeFace((x2, y2))
 
'''游戲每幀更新'''
def play(delta):
 global playing, snk1, snk2
 if not playing:
  return
 cmd()
 snk1.walk(delta)
 snk2.walk(delta)
 checkEatFood()
 checkGameOver()
 
'''繪制'''
def draw():
 global snk1, snk2, playing, screen, radiusFood, remainFoods
 if not playing:
  return
 screen.fill((0,0,0))
 snk1.draw()
 snk2.draw()
 node = foods
 while node:
  color = (255, 255, 255)
  if remainFoods == 0:
color = (255, 0, 0)
  pygame.draw.circle(screen, color, node.data, radiusFood, radiusFood // 2 + 1)
  node = node.next
 
def start(width = 800, height = 600, fps = 60):
 global running, screen, timer, playing, snk1, snk2
 pygame.init()
 pygame.font.init()
 font = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", 20)
 pygame.display.set_caption("Snack V1.0")
 screen = pygame.display.set_mode((width, height))
 
 logo()
 snk1 = Snack(screen, (0, 150, 200), (100, 100), (0, 100), (1, 0))
 snk2 = Snack(screen, (255, 100, 0), (width * 5 // 6, height // 2), (width * 5 // 6 + 100, height // 2), (-1, 0))
 for i in range(3):
  addFood()
 
 timer = pygame.time.Clock()
 running = True
 while running:
  delta = timer.tick(fps)
  play(delta)
  draw()
  for event in pygame.event.get():
if event.type == pygame.QUIT:
 running = False
elif event.type == pygame.KEYDOWN:
 if event.key == pygame.K_SPACE and playing == False:
  screen.fill((0,0,0))
  playing = True
 
  pygame.display.flip()
 
 
if __name__ == "__main__":
 start()
 quit()

以上就是雙人貪吃蛇的代碼啦!

教大家pygame的安裝方式

在終端輸入

pip install pyame,然后回車鍵進行安裝

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。

美國服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部