2015-11-25 9 views
6

1-13, 1 Ace ve 13 Kral olmak üzere 7 farklı rasgele sayıyı yükleyen ve üreten bir formum var. 7 farklı rasgele sayı üretildikten sonra, bu rasgele sayıların her birini 7 resim kutusuna koyar. If deyimini kullanarak resim kutularını görüntülüyorum. "Maça, Kalpler, Kulüpler ve Diamonds", 13 kez bir dizi boyuncaC# Kartlar için ifadeler varsa, 50'den fazla var, bunu daha kısa yapmanın ya da tek seferde yapmanın bir yolu var mı?

Ayrıca çevrimleri.

Ve Benim gibi açıklamaların ise: 7 rastgele kart seç ve resim kutusuna onlara göstermek için basit, kolay bir yolu var mı

if (cardNum == 1 && cardType == "Spades") 
{ 
    pictureBox1.Image = ace_of_spades; 
} 
else if (cardNum == 1 && cardType == "Hearts") 
{ 
    pictureBox1.Image = ace_of_hearts; 
} 
else if (...) 
{ 
    //change picture box 
} //repeat it like 50 times 

?

Son derece zaman alıcı olduğunu, bunu yapmak yoludur. Bir dizi daha sonra diziden bir indeks almak için rastgele kullanmak için

+3

'cardType + cardNum' ... –

cevap

4

Pek çok sigara OOP öneriler. İşte her bir nesnenin kendisini takip etmesini sağlayan, ve güverteyi karıştırmak ve her bir kartla ilişkili görüntüyü elde etmek için basit bir yol sağlayacak olan benim çözümüm (birkaç kart oyunu yazdım).

gerçek görüntülerini depolamak için, belirli bir şekilde adlandırılmış kaynak dosyaları olarak projenin içine gömmek:

  • card_Club_1
  • card_Club_2
  • card_Club_3
  • vs ...

Ardından, bir kart görüntüsünü istediğinizde, yalnızca elbiseyi ve değeri birleştirirsiniz ve kaynak adının aşağıda gösterildiği gibi kaynak yöneticisinden olmasını istersiniz. Bu yöntem biraz daha kurulum ve planlama gerektirir, ancak size çok temizleyici kodu verecektir. Bunları ayrı bir projede bile yapabilir ve sonra sadece bir DLL kart desteğine sahip olmak istediğiniz uygulamadaki DLL'yi referans alarak sınıfları/kaynakları yeniden kullanabilirsiniz. vb "Hearts4 Spades1," sen aracılığı adıyla onlara yük varmış gibi görüntü kaynakları adlandırılmış olursa

enum Suit : uint 
{ 
    Club = 0, 
    Heart, 
    Spade, 
    Diamond 
} 
class Card 
{ 
    public int 
     Value; 
    public Suit 
     Suit; 

    public System.Drawing.Image GetImage() 
    { 
     return System.Drawing.Image.FromStream(
      global::cardLibraryProject.Properties.Resources.ResourceManager.GetStream(string.Format("card_{0}_{1}", this.Suit, this.Value)) 
     ); 
    } 
} 
class Deck 
{ 
    System.Collections.ArrayList 
     _arr; 

    private Deck() 
    { 
     this._arr = new System.Collections.ArrayList(52); 
    } 

    void Add(Card crd) 
    { 
     if (!this._arr.Contains(crd)) 
      this._arr.Add(crd); 
    } 

    public void Shuffle() 
    { 
     Random rnd = new Random(DateTime.Now.Millisecond); 
     System.Collections.ArrayList tmp1 = new System.Collections.ArrayList(this._arr); 
     System.Collections.ArrayList tmp2 = new System.Collections.ArrayList(52); 
     while (tmp1.Count > 0) 
     { 
      int idx = rnd.Next(tmp1.Count); 
      tmp2.Add(tmp1[idx]); 
      tmp1.RemoveAt(idx); 
     } 
     this._arr = tmp2; 
     tmp1.Clear(); 
     tmp2.Clear(); 
    } 

    public static Deck CreateDeck() 
    { 
     Deck newDeck = new Deck(); 
     for (int s = 0; s < 4; s++) 
      for (int i = 0; i < 13; i++) 
       newDeck.Add(new Card { Value = i, Suit = (Suit)s }); 
     return newDeck; 
    } 
} 
class Program 
{ 
    public void Main(string[] args) 
    { 
     Deck cards = Deck.CreateDeck(); 
     cards.Shuffle(); 

     pictureBox1.Image = cards[0].GetImage(); 
     // code to play game would go here. Obviously, if you took 
     // my suggestion about creating a "Cards" library, then you 
     // wouldn't have a "void Main" at all, and this would 
     // all go in the application that was the actual game. 
    } 
} 
+0

Bu kodu Program.cs dosyasında veya Form1.cs dosyasında yazmalı mıyım? –

+0

Sınıflar ("Program" haricinde) her yere gidebilirler. Bunların hepsi bir isim alanının içine girecek türlerdir. "Güverte" sınıfını kullanarak nasıl uygulayacağınız, ne tür bir uygulama yaptığınıza bağlı olacaktır. Bu sadece bir kart destesi gerektiren bir şey inşa etmek için bir dizi sınıf için üst düzey bir tasarımdır. Baştan sona eksiksiz bir uygulama yaratmanın yolunda gitmesi biraz daha fazla uğraşıyor. –

+0

Bu tür şeyleri işlemek için bir kitaplık kurulumu yapın. Ayrıca oyun mantığını işlemek için bir temel sınıf içerir. Özellikle "Uno" türü oyun için ayrı bir proje var. https://github.com/tenshino/RainstormStudios/tree/6e4dcff8c9586c0869249d38ba7c00cf5f0c9bda/RainstormStudios.Games/Kartlar –

0

koyun sizin tüm öğeleri.

private Image[] _cards = new Image[] {ace_of_spades, ace_of_hearts, /* and so on for all of the cards*/ } 

void YourFunction(Random rnd) 
{ 
    var nextCardIndex = rnd.GetNext(_cards.Length); 
    pictureBox1.Image = _cards[nextCardIndex]; 
} 
5

pek çok yolu vardır, ama genel olarak söyleyebilirim: bir arama olarak Dizi kullanma

Örneğin, gereken tüm Şimdi

Image[] images = new[] 
{ 
    ace_of_spades, 
    ace_of_hearts, 
    ... 
}; 

gibi bir dizi Yapmanız gereken doğru indeksi hesaplamak. Bu konuda size yardımcı olmak için ihtiyaç olarak mümkün olduğunca çok bilgi vermedi, ben sadece bunu şuna benzer olacağını tahmin edecektir: Dediğim gibi

pictureBox1.Image = images[cardNum * 7 + (int)cardType]; 

, bu bu işin arkasında bir fikir. Şimdi bunun için doğru hesaplamayı bulmanız gerekiyor.

+0

Kişisel dizin benimkinden çok daha iyidir. –

+0

Teşekkürler! Eh, senin görüntünü randomize ediyor, ama sanırım OP iki sayıyı rastgele çevirmek ve bu ikinin doğru kartını bulmak istiyor. – bytecode77

0

Görüntülerinizi yeniden adlandırırdım. Eğer Spade_1, Spade_2 gibi isimleriniz varsa, basit bir adımda dosya adını oluşturabilirsiniz.

var name = cardType + "_" + cardNum; 
0

Neden 0-51 arasında rasgele ayırmama (toplam 52 kart).

Daha sonra takım elbise için, takım # 13 numaralı kartın INTEGER'sini esas alır. Böylece kartlar 0-12: Spades, 13-25 = Kalpler, 26-38 = Diamonds, 39-51 = Kulüpler . sayı 13

modülü (0-12 dan) kart olur. modül sonucu 1 ekleyerek TARAFINDAN, bir dizide 0 = As, 12 olarak 0-12 dan gider = Kral

bu işi nasıl
İlgili konular