python实现双人贪吃蛇小游戏
小编今天要给大家分享的是双人贪吃蛇,大家可以和自己的兄弟,姐妹,爸爸,妈妈等一起玩哟!我先介绍一下游戏:
运行游戏,进入初始界面,按下空格键。
玩家(1):w,a,s,d
玩家(2):↑,←,↓,→
玩家要争夺7个实物,直到吃完为止
游戏结束。
下面是小编写的代码:
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,然后回车键进行安装
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)