【问题标题】:c# layering two arraysc# 将两个数组分层
【发布时间】:2012-12-27 18:10:39
【问题描述】:

我正在尝试创建一种“你击沉了我的战舰”的游戏。 到目前为止,我有两个数组: 1. 棋盘(桌子)——玩的表面 2. 船(Avion)——在这种情况下是飞机

我想要实现的是创建一个包含整个表面并将平原放在其中的第三个数组。

所以我有 飞机:

0 0 1 0 0
1 1 1 1 1
0 0 1 0 0
0 0 1 0 0
0 1 1 1 0

和表面:

  1 2 3 4 5 6 7 8 8 10
A 0 0 0 0 0 0 0 0 0 0
B 0 0 0 0 0 0 0 0 0 0
C 0 0 0 0 0 0 0 0 0 0
D 0 0 0 0 0 0 0 0 0 0
E 0 0 0 0 0 0 0 0 0 0
F 0 0 0 0 0 0 0 0 0 0
G 0 0 0 0 0 0 0 0 0 0
H 0 0 0 0 0 0 0 0 0 0
I 0 0 0 0 0 0 0 0 0 0
J 0 0 0 0 0 0 0 0 0 0

我想要实现的是:

  1 2 3 4 5 6 7 8 8 10
A 0 0 1 0 0 0 0 0 0 0
B 1 1 1 1 1 0 0 0 0 0
C 0 0 1 0 0 0 0 0 0 0
D 0 0 1 0 0 0 0 0 0 0
E 0 1 1 1 0 0 0 0 0 0
F 0 0 0 0 0 0 0 0 0 0
G 0 0 0 0 0 0 0 0 0 0
H 0 0 0 0 0 0 0 0 0 0
I 0 0 0 0 0 0 0 0 0 0
J 0 0 0 0 0 0 0 0 0 0

int counterAvion = 0;
        int counterTable = 0;

        int[,] Table = new int[10, 10];
        int[,] Avion = new int[5, 5];
        int[,] Combined = new int[10, 10];


        // Table[][]
        //rowA
        Table[0, 0] = 0; Table[0, 1] = 0; Table[0, 2] = 0; Table[0, 3] = 0; Table[0, 4] = 0;
        Table[0, 5] = 0; Table[0, 6] = 0; Table[0, 7] = 0; Table[0, 8] = 0; Table[0, 9] = 0;
        //rowB
        Table[1, 0] = 0; Table[1, 1] = 0; Table[1, 2] = 0; Table[1, 3] = 0; Table[1, 4] = 0;
        Table[1, 5] = 0; Table[1, 6] = 0; Table[1, 7] = 0; Table[1, 8] = 0; Table[1, 9] = 0;
        //rowC
        Table[2, 0] = 0; Table[2, 1] = 0; Table[2, 2] = 0; Table[2, 3] = 0; Table[2, 4] = 0;
        Table[2, 5] = 0; Table[2, 6] = 0; Table[2, 7] = 0; Table[2, 8] = 0; Table[2, 9] = 0;
        //rowD
        Table[3, 0] = 0; Table[3, 1] = 0; Table[3, 2] = 0; Table[3, 3] = 0; Table[3, 4] = 0;
        Table[3, 5] = 0; Table[3, 6] = 0; Table[3, 7] = 0; Table[3, 8] = 0; Table[3, 9] = 0;
        //rowE
        Table[4, 0] = 0; Table[4, 1] = 0; Table[4, 2] = 0; Table[4, 3] = 0; Table[4, 4] = 0;
        Table[4, 5] = 0; Table[4, 6] = 0; Table[4, 7] = 0; Table[4, 8] = 0; Table[4, 9] = 0;
        //rowF
        Table[5, 0] = 0; Table[5, 1] = 0; Table[5, 2] = 0; Table[5, 3] = 0; Table[5, 4] = 0;
        Table[5, 5] = 0; Table[5, 6] = 0; Table[5, 7] = 0; Table[5, 8] = 0; Table[5, 9] = 0;
        //rowG
        Table[6, 0] = 0; Table[6, 1] = 0; Table[6, 2] = 0; Table[6, 3] = 0; Table[6, 4] = 0;
        Table[6, 5] = 0; Table[6, 6] = 0; Table[6, 7] = 0; Table[6, 8] = 0; Table[6, 9] = 0;
        //rowH
        Table[7, 0] = 0; Table[7, 1] = 0; Table[7, 2] = 0; Table[7, 3] = 0; Table[7, 4] = 0;
        Table[7, 5] = 0; Table[7, 6] = 0; Table[7, 7] = 0; Table[7, 8] = 0; Table[7, 9] = 0;
        //rowI
        Table[8, 0] = 0; Table[8, 1] = 0; Table[8, 2] = 0; Table[8, 3] = 0; Table[8, 4] = 0;
        Table[8, 5] = 0; Table[8, 6] = 0; Table[8, 7] = 0; Table[8, 8] = 0; Table[8, 9] = 0;
        //rowJ
        Table[9, 0] = 0; Table[9, 1] = 0; Table[9, 2] = 0; Table[9, 3] = 0; Table[9, 4] = 0;
        Table[9, 5] = 0; Table[9, 6] = 0; Table[9, 7] = 0; Table[9, 8] = 0; Table[9, 9] = 0;

        // Avion[][]
        //head
        Avion[0, 0] = 0; Avion[0, 1] = 0; Avion[0, 2] = 1; Avion[0, 3] = 0; Avion[0, 4] = 0;
        //wings
        Avion[1, 0] = 1; Avion[1, 1] = 1; Avion[1, 2] = 1; Avion[1, 3] = 1; Avion[1, 4] = 1;
        //mid_1
        Avion[2, 0] = 0; Avion[2, 1] = 0; Avion[2, 2] = 1; Avion[2, 3] = 0; Avion[2, 4] = 0;
        //mid_2
        Avion[3, 0] = 0; Avion[3, 1] = 0; Avion[3, 2] = 1; Avion[3, 3] = 0; Avion[3, 4] = 0;
        //tail
        Avion[4, 0] = 0; Avion[4, 1] = 1; Avion[4, 2] = 1; Avion[4, 3] = 1; Avion[4, 4] = 0;



        // Output Avion[][]
        Console.WriteLine("\nAirplane:\n");
        foreach (var item in Avion)
        {
            counterAvion++;
            Console.Write(item.ToString() + "  ");
            if (counterAvion == 5)
            {
                Console.WriteLine("\n");
                counterAvion = 0;
            }
        }

        // Output Table[][]
        Console.WriteLine("\nTable:\n");
        Console.WriteLine("  1  2  3  4  5  6  7  8  9  10\n");
        int counterColumn = 1;
        foreach (var item in Table)
        {
            counterTable++;
            //Console.WriteLine(counterColumn);
            switch (counterColumn)
            {
                case 1:
                    Console.Write("A ");
                    break;
                case 12:
                    Console.Write("B ");
                    break;
                case 23:
                    Console.Write("C ");
                    break;
                case 34:
                    Console.Write("D ");
                    break;
                case 45:
                    Console.Write("E ");
                    break;
                case 56:
                    Console.Write("F ");
                    break;
                case 67:
                    Console.Write("G ");
                    break;
                case 78:
                    Console.Write("H ");
                    break;
                case 89:
                    Console.Write("I ");
                    break;
                case 100:
                    Console.Write("J ");
                    break;
                default:
                    break;
            }

            Console.Write(item.ToString() + "  ");
            if (counterTable == 10)
            {
                Console.WriteLine("\n");
                counterTable = 0;
                counterColumn++;
            }
            counterColumn++;
        }
Console.ReadLine();

我是 C# 新手,到目前为止我很喜欢它,但它.. 嗯.. 与我很久以前玩的 BorlandC 不同。

那么,关于如何实现这一点的任何想法?

我也知道到目前为止我的代码有点混乱,所以对此的任何输入都表示赞赏。

【问题讨论】:

  • 你试过Array.Copy()吗?
  • 1.数组的值被初始化为零,因此您不需要指定所有这些值。 2. 查找“集合初始化器”以获得用于初始化数组的更短语法,或者更好的是,从文件中读取初始值。 3. 你应该将你的行为部分提取到方法中,而不是把所有东西都扔到一个巨大的Main中。 4. 你不需要switch 来写出 A-J,只需将这些字母放入一个集合中并对其进行迭代或对其中的位置持有一个计数器。 5. 在提出 SO 问题时,尽量只包含您真正需要的代码。
  • @tpaksu 只有当它们的大小相同时才会起作用。事实上,由于一个是二维空间中另一个的子集Array.Copy 无法处理它(我认为)。
  • 我更喜欢使用面向对象编程
  • 正如我所说,这基本上是一个学习项目。感谢您的提示。我知道在那里构建代码的其他方法,但这是第一次出现,因为这是我在 c# 中的第二天

标签: c# arrays console layer


【解决方案1】:

复制这些值并不是特别难。如果您想创建第三个数组,则可以在开始时创建第一个数组的直接副本,然后对其进行修改。

public void Combine(int[,] first, int[,] second, int rowStart, int colStart)
{
    //TODO validate parameters, ensure arrays are all large enough, etc.

    for (int i = 0; i < second.GetLength(0); i++)
    {
        for (int j = 0; j < second.GetLength(1); j++)
        {
            first[colStart + i, rowStart + j] |= second[i, j];
        }
    }
}

【讨论】:

  • 当一个数组小于另一个数组时,这将引发 Index out of bounds 异常。获取两个数组的长度并使用最小值就可以了。示例:Math.Min(first.GetLength(0),second.GetLength(0))
  • 如果我可以使用&amp;= 而不是= 来实现覆盖而不是复制,请加倍+1! :)
  • 其实覆盖应该是|=。啊!
  • @MichaelBray 谢谢,已修复。
  • @Ragnagord 根据开头的评论,我故意避免边界检查。当您考虑偏移量时,它也会比您所拥有的更复杂。
【解决方案2】:

假设 Airplane 的尺寸永远不会大于表面,您可以循环遍历 Airplane,并为每个索引将表面设置为相同的值。

for(int i = 0; i < Airplane.length(0); i++){
    for(int j = 0; j < Airplane.length(1); j++){         
        surface[i,j] = Airplane[i,j]

如果不是,您可以轻松计算出偏移量。

【讨论】:

  • 假设您总是将子集放在左上角。如果您将其放置在偏移位置,则需要考虑这一点。
  • 这就是为什么我说“如果不是,你可以很容易地计算出偏移量可能是多少。”
  • 你提到飞机可能更大,我的意思是飞机可能更小,但在右下角,或者向下移动两个并向右移动,等等。
  • 啊对,没想到。我只是想为 Bigup 的工作提供一个基础。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 2011-08-16
  • 2019-05-03
  • 2012-04-13
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多