C# 无法获取循环数组
基本上,我想把J和下一张抽出来的牌进行比较,问题是每次我列出一张清单来得到它时,我立刻得到所有的13张,而不是一张。 我的目标是从牌组(52)中得到一张牌,给他们最高的值1-13(13),并在每次抽牌时进行比较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)
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算法)至于值,您可以执行以下操作