www.887551.com今天要给大家分享的是双人贪吃蛇,大家可以和自己的兄弟,姐妹,爸爸,妈妈等一起玩哟!我先介绍一下游戏:

运行游戏,进入初始界面,按下空格键。

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

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

玩家要争夺7个实物,直到吃完为止

游戏结束。

下面是www.887551.com写的代码:

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
'''
链表节点
'''
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]
]
'''坐标取整'''
def intpos(self, pos):
return (int(pos[0]), int(pos[1]))
'''坐标转角度'''
def pos2angle(self, pos):
return self.mapangle[pos[0]][pos[1]]
'''极坐标位移'''
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, "任意键继续", (w / 2, h / 2), 24, (55, 255, 55))
printtext(screen, str(remainfoods) + "个食物,抢完即止", (w / 2, h * 2 / 3), 32)
def quit():
pygame.font.quit()
'''检测游戏结束'''
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)
'''键盘按键转换成面向角度'''
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,然后回车键进行安装

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。