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。
黄山市民网:https://www.huangshanshimin.com/