• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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,然后回车键进行安装

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

    您可能感兴趣的文章:
    • Python贪吃蛇小游戏实例分享
    • python贪吃蛇游戏代码
    • Python写的贪吃蛇游戏例子
    • 使用Python写一个贪吃蛇游戏实例代码
    • Python 实现 贪吃蛇大作战 代码分享
    • Python贪吃蛇游戏编写代码
    • 利用python实现简易版的贪吃蛇游戏(面向python小白)
    • 教你一步步利用python实现贪吃蛇游戏
    • python实现贪吃蛇游戏
    • Python实现贪吃蛇小游戏(单人模式)
    上一篇:python切片中内存的注意事项总结
    下一篇:如何利用python脚本自动部署k8s
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python实现双人贪吃蛇小游戏 python,实现,双人,贪吃,蛇,