【问题标题】:How to divide an array into two?如何将一个数组一分为二?
【发布时间】:2015-01-04 15:13:11
【问题描述】:

我是 C# 的初学者。我试图在纸牌游戏中向 2 名玩家发等量的牌。我必须将我的数组(卡片)分成两部分,以便每个玩家拥有相同数量的卡片。我已经使用my GetImages() 将所有(全部 40 个)图像随机化为 1 个pictureBox。所以接下来我必须将它分成两部分,并在我的表单加载时将它们放入pictureBox。 任何帮助将不胜感激,谢谢。

这是我的代码:

 public string[] GetImages(){
        string[] img = new string[40];

        img[0] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\1.png";
        img[1] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\2.png";
        img[2] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\3.png";
        img[3] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\5.png";
        img[4] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\6.png";
        img[5] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\7.png";
        img[6] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\9.png";
        img[7] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\10.png";
        img[8] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\11.png";
        img[9] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\13.png";
        img[10] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\14.png";
        img[11] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\15.png";
        img[12] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\17.png";
        img[13] = @"C:\Users\Student\Documents\APPD\Asgmt\Asgmt\Assignment\Assignment\handcards\18.png";
//so on and so forth
            return 
                img;
        }

    public void Form2_Load(object sender, EventArgs e)
    {
//the code I'm trying now:
        string[] Player1Array = GetImages(40/2);

【问题讨论】:

  • 您似乎还没有听说过循环...如果没有循环,编写拆分代码将非常困难。您可能想澄清您可以/不能用于此作业的内容。

标签: c# arrays


【解决方案1】:

假设您只需要将元素数组(或 List)拆分为前半部分/后半部分 - 通常会使用 Enumerable.Take/Enumerable.Skip 后跟 Enumerable.ToArray 在必要时转换为数组:

string[] Player1Array = GetImages().Take(20).ToArray();
string[] Player2Array = GetImages().Skip(20).ToArray();

【讨论】:

    【解决方案2】:

    首先,您必须认识到代码中的一个问题:您不能使用带参数的 getImages 函数(我指的是 40/2 ),因为它没有用参数定义。

    我对随机化卡片有不同的建议。 将两个数组传递给 getImg 函数,该函数会将牌随机分配给 player1。然后根据包含从 0 - 39 随机排列的数字的数组随机到 player2。此链接将帮助您了解如何生成一组随机的唯一数字(它使用列表,但您可以安全地将其替换为数组):

    https://codereview.stackexchange.com/questions/61338/generate-random-numbers-without-repetitions

    所以 getImg 函数将是这样的:

    public string [] GetImages(string [] player1Array, string [] player2Array){ 
     int [] randomArray=getRandomNembers(); //this call depends on how you define the function 
      player1Array[randomArray[0]]=" your location here";
      // so on until 
      player1Array[randomArray[19]]=" your location here";
      //then you start with player 2 
      player2Array[randomArray[20]]=" your location here";
      //and so on
    }
    

    【讨论】:

      【解决方案3】:

      阿列克谢死了。如果我们想变得更复杂,您可以执行以下操作:

      public static List<string[]> Partition(this string[] source, Int32 size)
          {
              var output = new List<string[]>();
              for (int i = 0; i < Math.Ceiling(source.Count() / (Double)size); i++)
                  output.Add(source.Skip(size * i).Take(size).ToArray());
              return output;
          }
      

      灵感来自C# - elegant way of partitioning a list?

      所以要使用它,你所要做的就是:

      var chunkSize = 40 / 4;
      var chunks = GetImages().GetImages(chunkSize);
      

      并且块中的每个元素都是原始的片段。每个块中有多少个字符串取决于块大小的参数。 40/4 会给你 4 块。第一项包含前 10 个。第二个包含下一个 10,依此类推到最后 10 个。这样您就可以轻松地根据需要对数组进行分段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2022-01-04
        • 1970-01-01
        • 2016-08-10
        • 2020-09-07
        • 1970-01-01
        相关资源
        最近更新 更多