C# 交换两个图片盒

C# 交换两个图片盒,c#,.net,c#-4.0,C#,.net,C# 4.0,我正在尝试用C#制作游戏2048,但我在移动瓷砖时遇到了一个问题 我把瓷砖放在这里: picture = new PictureBox[4, 4] { {pic1,pic2,pic3,pic4}, {pic5,pic6,pic7,pic8}, {pic9,pic10,pic11,pic12}, {pic13,pic14,pic15,pic16} }; 当我按下“W”键时,

我正在尝试用C#制作游戏2048,但我在移动瓷砖时遇到了一个问题

我把瓷砖放在这里:

picture = new PictureBox[4, 4] {
               {pic1,pic2,pic3,pic4},
               {pic5,pic6,pic7,pic8}, 
               {pic9,pic10,pic11,pic12}, 
               {pic13,pic14,pic15,pic16} };
当我按下“W”键时,我将其向上移动:

public void Up()
    {
        for (int i = 1; i < picture.GetLength(0); i++)
            for (int j = 0; j < picture.GetLength(1); j++)
                if(picture[i,j].Image!=null && picture[i-1,j].Image==null)
                {
                    picture[i - 1, j].Image = picture[i, j].Image;
                    picture[i, j].Image = null;           
                    Up();       
                }

    }
public作废()
{
for(inti=1;i

但该代码仅交换picturebox中的图像,而不是picturebox本身。如何将picturebox与image及其所有属性交换?

C#中没有切换功能,因此您需要一个临时辅助变量

由您决定要切换的内容:

  • 数组中引用的pictureBoxes
  • 只是他们的位置
  • 他们的形象
  • 或任何组合
以下是交换引用及其位置的简单辅助函数示例:

void SwitchControls(PictureBox pb1, PictureBox pb2)
{
    PictureBox temp = pb1;
    Point tempLoc = pb1.Location;
    pb1 = pb2;
    pb2 = temp;
    pb1.Location = pb2.Location;
    pb2.Location = tempLoc ;
}
例如,您可以这样称呼它:

SwitchControls(picture[i - 1, j], picture[i, j]);
要交换图像,您可以将函数编写为

void SwitchImages(PictureBox pb1, PictureBox pb2)
{
    Image temp = pb1.Image;
    pb1.Image = pb2.Image;
    pb2.Image = temp.Image;
}

等等

为什么在图片框内交换
图像
s不够?如果您想移动图片框,则需要修改
图片框
位置
属性。当我尝试制作两个分幅的总和时,我需要精确的索引,如果我只更改图像,索引将保留到初始位置,则需要更好的“地图”数据格式除了二维数组的
PictureBox
es之外,很难判断PictureBox的价值(即使是反射和依赖变量的名称,如果你考虑过的话)。例如,您可以使用
int
s的二维数组。并对其进行操作<代码>变量映射=新的int[4,4]={{{1,1,1,0},…..}关于“交换”:了解如何使用反射克隆控件。您只需使用一个helper PictureBox变量,然后使用三个赋值进行编码:
ph=p1;p1=p2;p2=ph我尝试过,但失败了,你能给我一个更明确的代码吗?请注意,这不会切换GUI中的任何图像或任何东西,它只是交换这些变量所指向的
PictureBox
es(即切换引用)。不确定您希望这段代码为您做什么。如前所述,根据您希望发生的事情调整代码是您的责任。我添加了一个用于交换图像的变体。请注意,我们没有看到您的所有代码,因此PictureBoxes中可能还有其他感兴趣的属性。您还可以将第一个版本与另外更改位置相结合,以获得相同的视觉效果。。我已经扩展到第一个版本这样做!