如何确定所单击的卡是位于另一张卡的上方还是下方?

2024-06-01 00:40:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python制作一个纸牌游戏,使用PyGame。这将像一场52张卡片的捡牌游戏。正如你所能想象的,大多数纸牌游戏并不涉及完全或部分卡在其他卡之上。它要么是按一定顺序排列的牌,要么是将一张牌(不是放在另一张牌的上面或下面)拖放到另一个位置。如果我试图移除一张或多张其他卡片下面的一张卡片,那么我必须首先移除这些碎片。这让我难以置信

目前我能看到的只有:

  • 两张或更多的牌可以共享坐标
  • 当两张牌更直接地相互重叠时,每张牌的中心点更近,当两张牌相互覆盖较少时,相同的点之间的距离更远
  • 如果我能将一组坐标(x1,x2,y1,y2)映射到id,那么我可能能够更唯一地识别列表中的每一张卡

提前谢谢


Tags: id游戏距离列表pygame碎片x1x2
1条回答
网友
1楼 · 发布于 2024-06-01 00:40:32

我建议将UI层与逻辑层分开。根据纸牌的中心点来计算它们在你的游戏板上的位置以及在上面的位置听起来非常麻烦。虽然这些卡片可能直接位于彼此的顶部,或者重叠一半的卡片宽度,但基本逻辑是这样的,据我从你的问题中理解:你只能移动最上面的卡片

让我们假设你在游戏板上有四个地方可以放下牌——这些是我们的牌堆,你可以从中挑选或在上面放另一张牌。所有四个堆栈(S1、S2、S3、S4)可以包括许多卡(A1、A2、A3,…),但也可以是空的

UI层: 对于每个堆栈,决定如何以特定方式显示它们(重叠50%,重叠100%,等等)。如果单击堆栈,将自动选择最上面的卡,您可能会有一些动画(例如拖放)。要获得卡片的“内容”,我们需要查看“订单”层

“订单”-层: 我们不仅需要跟踪哪张卡在上面,还需要跟踪底层卡的顺序。我建议使用列表进行此操作。由于您将在游戏场上的不同位置上拥有多个“堆栈”牌,因此创建一个“堆栈”类可能非常有用,该类具有与一堆牌交互所需的所有功能。通过这种方式,您可以为每个可能的区域创建一个“Stack”类的实例,在这些区域中可以将牌放置在运动场上

例如:

import random
class Stack():   

    def __init__(showing=True, overlap=100):
        self.cards = ['A2', 'A4', 'A10', 'A1'] 
        self.overlap = overlap
        self.showing = True # do the cards face upward or are the contents hidden?
    
    def get_top_card_of_stack_one(self):
        return self.cards.pop()  # pop removes and returns the first element of a list
    
    def put_card_on_top_of_stack_one(self, card):
        self.cards.insert(0, card)

    def shuffle(self):
        random.shuffle(self.cards)

    def display_stack(self)
         if overlap = 100: # 100% overlap
               pass # test for self.showing and display the stack
         elif overlap = 50: # the cards are overlapping by 50% of their width, and you see how many there are
               pass # test for self.showing and display the stack

例如: 您有六叠卡片,例如,您创建了具有不同参数的类的六个实例

  • 玩家的手(显示=真,重叠=30%)
  • 其他玩家的手(3x)(显示=错误,重叠=30%)
  • 一张抽牌叠(显示=False,重叠=100%)-玩家从中抽新牌
  • 一张牌叠(显示=真,重叠=100%)-玩家将他们玩的牌放在哪里

enter image description here

相关问题 更多 >