C# 无法获取循环数组

C# 无法获取循环数组,c#,C#,基本上,我想把J和下一张抽出来的牌进行比较,问题是每次我列出一张清单来得到它时,我立刻得到所有的13张,而不是一张。 我的目标是从牌组(52)中得到一张牌,给他们最高的值1-13(13),并在每次抽牌时进行比较 internal class Kort { //datamedlemmar public int siffra; public Image bild; //konstruktor public Kort(int nr, Image card)

基本上,我想把J和下一张抽出来的牌进行比较,问题是每次我列出一张清单来得到它时,我立刻得到所有的13张,而不是一张。 我的目标是从牌组(52)中得到一张牌,给他们最高的值1-13(13),并在每次抽牌时进行比较

internal class Kort
{
    //datamedlemmar
    public int siffra;
    public Image bild;

    //konstruktor
    public Kort(int nr, Image card)
    {
        this.siffra = nr;
        this.bild = card;
    }
}

public partial class Form1 : Form
{
    private Kort old; //gamla kortet
    private Kort ny; //nuvarande
    private Kort[] kortlek = new Kort[52]; //Kort array
    private Random slump = new Random(); //Randomizer
    private bool[] usedPictures; //Bool array gjord för att kolla fall korten har dragits
    private int plats = 0;
    private List<int> myList = new List<int>();
    private List<int> myList2 = new List<int>();
    private List<int> myList3 = new List<int>();
    private List<int> myList4 = new List<int>();

    public Form1()
    {
        InitializeComponent();

        for (int i = 0, j = 1; i < 13; i++, j++)
        {
            myList.Add(j);
            kortlek[i] = new Kort(j, Image.FromFile("Bilder/h" + j + ".png"));
        }

        for (int i = 13, j = 1; i < 26; i++, j++)
        {
            myList2.Add(j);
            kortlek[i] = new Kort(j, Image.FromFile("Bilder/c" + j + ".png"));
        }

        for (int i = 26, j = 1; i < 39; i++, j++)
        {
            myList3.Add(j);
            kortlek[i] = new Kort(j, Image.FromFile("Bilder/d" + j + ".png"));
        }

        for (int i = 39, j = 1; i < 52; i++, j++)
        {
            myList4.Add(j);
            kortlek[i] = new Kort(j, Image.FromFile("Bilder/s" + j + ".png"));
        }

        usedPictures = new bool[kortlek.Length];
        BackgroundImage = Image.FromFile("Bilder/deck_background.png");
    }

    private void btnDraKort_Click(object sender, EventArgs e)
    {
        plats = slump.Next(1, usedPictures.Length);

        //kontrollera om kortet dragits mha usedPictures
        while (usedPictures[plats])
        {
            plats = slump.Next(1, usedPictures.Length);
        }

        ny = kortlek[plats];
        usedPictures[plats] = true;

        if (old == null)
        {
            old = ny;
        }

        pbxNy.Image = (Image) ny.bild;
        pbxOld.Image = (Image) old.bild;
        old = ny;

        if (rbnHogre.Checked == true)
        {

        }
    }
}
内部类Kort
{
//达塔梅德勒玛酒店
公共int siffra;
公众形象图片;
//康斯特鲁克托
公共Kort(内部编号、图像卡)
{
这是siffra=nr;
this.bild=卡;
}
}
公共部分类Form1:Form
{
列兵科特·奥尔德;//加姆拉·科特
列兵科特·尼;//努瓦朗德
private Kort[]kortlek=new Kort[52];//Kort数组
private Random slop=new Random();//随机化器
私有布尔[]使用图片;//布尔数组gjord för att kolla fall korten har dragits
私有int平台=0;
私有列表myList=新列表();
私有列表myList2=新列表();
私有列表myList3=新列表();
私有列表myList4=新列表();
公共表格1()
{
初始化组件();
对于(inti=0,j=1;i<13;i++,j++)
{
添加(j);
kortlek[i]=新的Kort(j,Image.FromFile(“Bilder/h”+j+.png”);
}
对于(inti=13,j=1;i<26;i++,j++)
{
myList2.添加(j);
kortlek[i]=新的Kort(j,Image.FromFile(“Bilder/c”+j+”.png”);
}
对于(inti=26,j=1;i<39;i++,j++)
{
myList3.添加(j);
kortlek[i]=新的Kort(j,Image.FromFile(“Bilder/d”+j+”.png”);
}
对于(inti=39,j=1;i<52;i++,j++)
{
myList4.添加(j);
kortlek[i]=新的Kort(j,Image.FromFile(“Bilder/s”+j+”.png”);
}
usedPictures=新布尔[kortlek.Length];
BackgroundImage=Image.FromFile(“Bilder/deck_background.png”);
}
私有void btnDraKort_单击(对象发送者,事件参数e)
{
平台=坍落度。下一步(1,使用图片。长度);
//kontrollera om kortet dragits mha使用的图片
while(使用图片[平台])
{
平台=坍落度。下一步(1,使用图片。长度);
}
ny=kortlek[plats];
usedPictures[plats]=真;
if(old==null)
{
老=纽约;
}
pbxNy.Image=(Image)ny.bild;
pbxOld.Image=(Image)old.bild;
老=纽约;
if(rbnHogre.Checked==true)
{
}
}
}

不确定这是否回答了您的问题,但希望能有所帮助。我认为问题的一部分可能是,有太多的事情要跟踪,你可能会失去状态?无论如何,遵循代码有点困难

一个建议是在卡片对象本身中跟踪套装,而不是为它们设置4个单独的列表

我的另一个建议是只有一个或两个卡片列表:一组卡片(最初填充了52张卡片)和一个已绘制的卡片列表(完全可选,但如果需要搜索已绘制的卡片,则可能很方便)

注意:我已经复制了你的代码,但是为了方便起见,我把它翻译成了英语

首先,我创建了一个枚举来表示西装:

public enum Suit
{
    Hearts, Clubs, Diamonds, Spades
}
然后修改Card类,使其在构造函数中包含西装,并根据价值和西装自动选择正确的图像,而不是让客户这样做:

internal class Card
{
    public int Value { get; set; }
    public Image Picture { get; private set; }
    public Suit Suit { get; set; }

    public Card(int value, Suit suit)
    {
        this.Value = value;
        this.Suit = suit;

        // Load the correct picture automatically based on value and suit
        string firstLetterOfSuit = suit.ToString().First().ToString();
        string picturePath = string.Format("Pictures/{0}{1}.png", 
            firstLetterOfSuit, value);
        this.Picture = Image.FromFile(picturePath);
    }
}
接下来,我创建了一个方法,它将返回一副新的卡片。在加载表单时,或在您希望重置数据组的任何时候,都可以调用此函数:

private static List<Card> GetFreshDeck()
{
    var freshDeck = new List<Card>();

    for (int i = 0; i < 52; i++)
    {
        // Value is always 1 through 13
        int value = i % 13 + 1;

        // Determine suit based on i
        Suit suit = (i < 13) ? Suit.Hearts 
            : (i < 26) ? Suit.Clubs 
            : (i < 39) ? Suit.Diamonds 
            : Suit.Spades;

        // Add a card to the deck
        freshDeck.Add(new Card(value, suit));
    }

    return freshDeck;
}
私有静态列表GetFreshDeck()
{
var freshDeck=新列表();
对于(int i=0;i<52;i++)
{
//值始终为1到13
整数值=i%13+1;
//基于i确定诉讼
西服西服=(i<13)?西服红心
:(i<26)?套装。球杆
:(i<39)?西装。钻石
:西装。黑桃;
//在牌组中添加一张牌
添加(新卡(价值,套装));
}
返回甲板;
}
然后部分表单类的其余部分变成:

public partial class Form1 : Form
{
    private Card oldCard;
    private Card currentCard;

    private List<Card> cardDeck = new List<Card>();
    private List<Card> drawnCards = new List<Card>();
    private Random random = new Random();

    public Form1()
    {
        InitializeComponent();
        BackgroundImage = Image.FromFile("Pictures/deck_background.png");
        cardDeck = GetFreshDeck();
    }

    private static List<Card> GetFreshDeck()
    {
        // Code already supplied above
    }

    private void btnDrawCard_Click(object sender, EventArgs e)
    {
        // Pick a random index from the card deck
        int cardIndex = random.Next(0, cardDeck.Count);

        // Get the card, add it to drawn cards, and remove it from the deck
        Card currentCard = cardDeck[cardIndex];
        drawnCards.Add(drawnCard);
        cardDeck.RemoveAt(cardIndex);

        if (oldCard == null)
        {
            oldCard = currentCard;
        }

        pbxCurrnet.Image = currentCard.Picture;
        pbxOld.Image = oldCard.Picture;
        oldCard = currentCard;

        // If we drew the last card, disable this button
        if (!cardDeck.Any()) btnDrawCard_Click.Enabled = false;
    }
}
公共部分类表单1:表单
{
私人卡、旧卡;
私人卡;
私有列表卡片组=新列表();
私有列表drawnCards=新列表();
私有随机=新随机();
公共表格1()
{
初始化组件();
BackgroundImage=Image.FromFile(“Pictures/deck_background.png”);
cardDeck=GetFreshDeck();
}
私有静态列表GetFreshDeck()
{
//上面已经提供了代码
}
私有无效btnDrawCard_单击(对象发送者,事件参数e)
{
//从卡片组中选择一个随机索引
int cardIndex=random.Next(0,cardDeck.Count);
//获取该卡,将其添加到已绘制的卡中,然后将其从牌组中移除
Card currentCard=cardDeck[cardIndex];
drawnCard.Add(drawnCard);
cardDeck.RemoveAt(cardIndex);
如果(旧卡==null)
{
oldCard=当前卡;
}
pbxCurrnet.Image=currentCard.Picture;
pbxOld.Image=oldCard.Picture;
oldCard=当前卡;
//如果我们提取了最后一张卡,请禁用此按钮
如果(!cardDeck.Any())btnDrawCard\u Click.Enabled=false;
}
}

这是什么人类语言?瑞典语,inb4巨魔。你是用英语提问的,你能用英语提供你的代码和评论吗?这将有可能帮助您。@MaxBrodin不,这不属于代码审查。请阅读您想在哪里“比较旧卡和新卡”?你到底试过什么?那次尝试做了什么?这和你想让它做的有什么不同?我在这里看不到任何代码将当前卡与先前绘制的卡进行比较。(旁白:关于从牌堆中选择随机牌的更好方法,请参阅-shuffling算法)至于值,您可以执行以下操作