如何合并列表或创建列表列表

时间:2019-05-30 18:45:55

标签: python-3.x

我有一个记忆游戏,您必须在其中找到具有相同图像的图块。我想修改游戏,以便您必须找到带有图像的图块和具有相应文本的图块。例如,找到带有猫图像的图块和带有文本“ cat”的图块。

要理解该问题,以下是我认为最相关的代码,该代码显示了我当前如何使用图像列表创建成对的瓷砖:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.ykb.hmn.cms.commission.datamodel.ICmsExemptRestrictDet"
        table="CMS_EXEMPT_RESTRICT_DET">
        <tuplizer class="com.ykb.hmn.inf.core.datamodel.IntfEntityTuplizer"
            entity-mode="pojo" />
        <id name="oid" type="java.lang.Long">
            <column name="ID" />
            <generator class="sequence">
                <param name="sequence">SEQ_CMS_EXEMPT_RESTRICT_DET</param>
            </generator>
        </id>

        <many-to-one name="cmsExemptRestrictDefinition" class="com.ykb.hmn.cms.commission.datamodel.ICmsExemptRestrictDef" fetch="select">
            <column name="ID" not-null="true" />
        </many-to-one>

        <property name="definitionId" type="java.lang.Long">
            <column name="DEFINITION_ID" />
        </property>
    </class>
</hibernate-mapping>

我不确定是否应该创建另一个文本列表,还是将图像列表更改为包含图像和文本的列表列表。

如果需要的话,下面是完整的代码:

class Tile(object):
    def __init__(self, canvas, x, y, image, cardback):
        self.image = image
        more stuff...

class MemGame(tk.Frame):
    def __init__(self, master):
        super(MemGame, self).__init__(master)

        self.images = [
            photoDog,
            more images...
        ]

        selected = []
        for i in range(10):
            randomInd = randint(0, len(self.images) - 1)
            animalImg = self.images[randomInd]
            selected.append(animalImg)
            selected.append(animalImg)
            del self.images[randomInd]
        shuffle(selected)
        self.flippedTiles = []
        NUM_COLS = 5
        NUM_ROWS = 4

        for x in range(0, NUM_COLS):
            for y in range(0, NUM_ROWS):
                self.tiles.append(Tile(self.canvas, x * 108 + 10, y * 108 + 40, selected.pop(), photoCardback))

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是:

  • 制作图像列表(完成)
  • 列出基于文本的对应图块(要做)
  • 合并以上两个列表,仅绘制一次图像,而不是像现在那样绘制两次(简单)
  • 制作一个可用于查找匹配项的字典(见下文)
  • 修改您的“检查图块”功能,以使用字典查看它们是否匹配(单行更改)

创建的字典可以双向使用,因此无论如何进行比较都可以找到匹配项。

In [6]: image_tiles = ['dog_img', 'cat_img', 'hen_img']                         

In [7]: tag_tiles = ['dog', 'cat', 'hen']                                       

In [8]: all_tiles = image_tiles + tag_tiles  # use this to draw tiles                                    

In [9]: matches = { k:v for (k, v) in zip(image_tiles, tag_tiles) }             

In [10]: # add opposite lookup                                                  

In [11]: matches.update([(k, v) for (k, v) in zip(tag_tiles, image_tiles)])     

In [12]: matches                                                                
Out[12]: 
{'dog_img': 'dog',
 'cat_img': 'cat',
 'hen_img': 'hen',
 'dog': 'dog_img',
 'cat': 'cat_img',
 'hen': 'hen_img'}