我试图在中断后消除编码锈,因此承担了创建简单纸牌游戏的任务。我知道我在犯一个菜鸟错误,但似乎找不到解决方法。
我正在尝试实现一些概念上的改组方法,其中一种方法是将平台清空为多个单独的堆栈,然后再次重新编译为平台。
我的deck
是List<T>
的标准Cards
。我的目标是从[0]
中取出顶牌'temp_deck'
并将其添加到堆/叠x
中,从而将其从temp_deck
的顶部移除。然后将最上面的卡片加到{/ {1}}堆,然后y
,直到z
没有更多的卡片。然后,我可以继续操纵这三堆并将它们添加回最后的甲板。
我的问题是,由于某种原因,它会将temp_deck
中的每个card
添加到每个堆中,因此每个堆temp_deck
都有52张卡片。我该如何解决这个问题,以便将清单分为这些堆而不是相乘?
这是我目前(第n次)划分列表的尝试:
x, y, z
答案 0 :(得分:2)
您的问题是,您要设置牌组y和z指向您一次创建的同一对象x。更改行:
Deck y = x;
Deck z = y;
到
Deck y = new Deck();
Deck z = new Deck();
您应该了解x,y,z是对对象的引用,当您指定y = x时,您将y指向与x指向的对象相同的事物。
答案 1 :(得分:2)
将一个对象分配给另一个对象时,并不是要创建另一个对象的副本,而是要说“让我的新对象指向与该现有对象相同的位置”。因此,您在代码中声明了4个新的牌组,但是x
,y
和z
都指向相同的存储位置,而temp_deck
指向相同的存储位置内存位置为deck
,因此实际上总共只有2个套牌,它们之间有5个引用。
相反,如果要使用全新的对象,则必须使用new
关键字(或调用一些返回新对象的方法)。
这是一个示例,可能有助于说明这一点。我们首先创建3个新卡片组,然后遍历卡片组中传递给方法的每个项目。在循环内部,我们创建了一个新的卡片组,该卡片组指向我们之前创建的三个卡片组的存储位置(由循环内部的“ i”索引值选择)。
基本上,我们采用索引(i
的值),加一个(因为它从零开始),然后除以3,得到余数。如果余数为1,则使用套牌{{1 }},如果余数为2,则使用副牌x
,否则(余数为0)使用副牌y
。
在每次迭代结束时,z
平台都消失了-它只是循环中的一个临时指针。最后,我们的三个甲板上同样都装有传入的甲板上的物品:
addTo
答案 2 :(得分:-2)