iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python实现双人贪吃蛇小游戏
  • 161
分享到

python实现双人贪吃蛇小游戏

python贪吃蛇 2022-06-03 13:06:55 161人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

小编今天要给大家分享的是双人贪吃蛇,大家可以和自己的兄弟,姐妹,爸爸,妈妈等一起玩哟!我先介绍一下游戏: 运行游戏,进入初始界面,按下空格键。 玩家(1):w,a,s,d 玩家(2):↑,←,↓,→ 玩家要争夺7个实

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

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

玩家(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,然后回车键进行安装

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

--结束END--

本文标题: python实现双人贪吃蛇小游戏

本文链接: https://www.lsjlt.com/news/11262.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现贪吃蛇小游戏(双人模式)
    简单用py写了一个贪吃蛇游戏,有单人、双人模式,比较简单,适合初学者练手。本上每行重要的语句都有注释,做了什么事一目了然 这里介绍双人模式 单人模式戳这里:Python简易贪吃蛇小游...
    99+
    2024-04-02
  • Python实现贪吃蛇小游戏(单人模式)
    简单用py写了一个贪吃蛇游戏,有单人、双人模式,比较简单,适合初学者练手。基本上每行重要的语句都有注释,做了什么事一目了然 这里先介绍单人模式 一、游戏设计要点 1.游戏主体窗口(尺...
    99+
    2024-04-02
  • JS实现贪吃蛇小游戏
    目录一、初始化结构二、渲染蛇的颜色 三、蛇的运动四、蛇死亡的判定方式 蛇有两种判定死亡的方式五、食物的创建六、蛇吃食物边长七、开始游戏功能八、暂停/继续游戏功能页面效果: 贪吃蛇游...
    99+
    2024-04-02
  • python实现简单贪吃蛇小游戏
    本文实例为大家分享了python实现简单贪吃蛇的具体代码,供大家参考,具体内容如下 1. 导入游戏库 import pgzrun import random 2.游戏初始化 # 窗口...
    99+
    2024-04-02
  • C语言如何实现双人贪吃蛇游戏
    这篇文章给大家分享的是有关C语言如何实现双人贪吃蛇游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获胜。  上源代码:&...
    99+
    2023-06-22
  • python实现贪吃蛇游戏
    文章目录 1、效果2、实现过程3、代码 1、效果 2、实现过程 导入 Pygame 和 random 模块。初始化 Pygame。设置游戏界面大小、背景颜色和游戏标题。定义颜色常量。...
    99+
    2023-09-29
    python 游戏 pygame
  • pygame实现贪吃蛇小游戏
    本文实例为大家分享了pygame实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 由于这段时间实在是太聊了,没什么事做,游戏也玩腻了,所以玩起来pygame。pygame是真的容...
    99+
    2024-04-02
  • C#实现贪吃蛇小游戏
    本文实例为大家分享了C#实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 之前一直想写一个贪吃蛇小游戏,上个周末终于有时间做了一个,现在和大家分享。 界面 界面比较简单,一个按钮...
    99+
    2024-04-02
  • 如何实现贪吃蛇Python小游戏
    这篇文章主要介绍“如何实现贪吃蛇Python小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何实现贪吃蛇Python小游戏”文章能帮助大家解决问题。贪吃蛇Python小游戏(源码+注释+粘贴即...
    99+
    2023-07-05
  • Java+JFrame实现贪吃蛇小游戏
    分享一个Java贪吃蛇小游戏,主要用到的是Java的JFrame,适合初学者。 首先创建一个合适大小的窗口,我这里是900*720 package com.lzijin;     ...
    99+
    2024-04-02
  • 用JS实现贪吃蛇小游戏
    本文实例为大家分享了JS实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 效果图: 完整代码如下: HTML <!DOCTYPE html> <html la...
    99+
    2024-04-02
  • Android Studio实现贪吃蛇小游戏
    项目目录 一、项目概述二、开发环境三、详细设计四、运行演示五、项目总结六、源码获取 一、项目概述 贪吃蛇是一款经典的街机游戏,不仅在电子游戏史上占有一席之地,也在很多人的童年回忆中留下了深...
    99+
    2023-10-01
    android studio android 安卓 安卓app android程序
  • JS+Canvas实现贪吃蛇小游戏
    今天呢,主要和小伙伴们分享一下一个贪吃蛇游戏从构思到实现的过程~因为我不是很喜欢直接PO代码,所以只copy代码的童鞋们请出门左转不谢。 按理说canvas与其应用是老生常谈了,可我...
    99+
    2024-04-02
  • C语言实现双人贪吃蛇游戏实例代码
    贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获胜。   上源代码: ​ #include <stdio.h> #include <...
    99+
    2024-04-02
  • Python贪吃蛇小游戏实例分享
    本文实例为大家分享了Python实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 使用的库 pygame 、random 、pyautogui 流程简述 1.设置初始参数 设置每...
    99+
    2024-04-02
  • JavaScript实现贪吃蛇游戏
    本文实例为大家分享了JavaScript实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 通过JavaScript,我们可以实现贪吃蛇游戏,具体功能如下: (1)通过按上下左右键来...
    99+
    2024-04-02
  • Java实现贪吃蛇游戏
    下面是一个简单的Java实现贪吃蛇游戏的示例代码:```javaimport javax.swing.*;import java.a...
    99+
    2023-08-09
    Java
  • QT实现贪吃蛇游戏
    为了熟悉QT的相关知识,我用了大约8个小时的时间用QT再次写了一遍贪吃蛇。 因为QT的机制和平时写的程序流程不同,所以程序中可能没有遵守代码规范。 运行效果: 程序内除了实现贪吃蛇...
    99+
    2024-04-02
  • python怎么实现贪吃蛇游戏
    要实现贪吃蛇游戏,可以使用Python中的pygame库来进行游戏界面的绘制和键盘事件的监听。以下是一个简单的贪吃蛇游戏的示例代码:...
    99+
    2023-08-09
    python
  • js怎么实现贪吃蛇小游戏
    这篇文章将为大家详细讲解有关js怎么实现贪吃蛇小游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。示例代码<!DOCTYPE html> <h...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作