如何将数组分成两部分?

时间:2015-01-04 06:00:13

标签: c# arrays

我是C#的初学者。我试图在纸牌游戏中向2名玩家发放等量的牌。我必须将我的阵列(卡片)分成两部分,以便每个玩家拥有相同数量的牌。我已经使用my GetImages()将ALL(全部是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);

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

首先,您必须识别代码中的问题:您无法使用带参数的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
}

答案 2 :(得分:0)

阿列克谢已经死了。如果我们想要更复杂,你可以做这样的事情:

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项。这样你就可以轻松地分割你需要的阵列。