【问题标题】:How would I go about adding methods from another Class into My WindowsForms Class?我将如何将另一个类的方法添加到我的 Windows 窗体类中?
【发布时间】:2022-12-10 14:04:21
【问题描述】:

我正在创建一个二十一点游戏,并使用了互联网上的教程来达到这一点。然而,我已经完成了教程,我不得不将其他类的所有方法添加到将要玩二十一点游戏的类中,但我不知道如何添加这些方法。 我想知道如何将所有方法添加到 P1 类中。

{
    public class Card 
    {
        public enum CardValue
        {
            Ace = 1,
            Two = 2,
            Three = 3,
            Four = 4,
            Five = 5,
            Six = 6,
            Seven = 7,
            Eight = 8,
            Nine = 9,
            Ten = 10,
            Jack = 11,
            Queen = 12,
            King = 13
        }
        public enum CardSuit
        {
            Hearts = 1,
            Spades = 2,
            Clubs = 3,
            Diamonds = 4
        }
        Image image;
        CardValue cardValue;
        CardSuit suit;

        public Image Image
        {
            get
            {
                return this.Image;
            }
        }

        public CardValue Value
        {
            get
            {
                return this.cardValue;
            }
            set
            {
                this.cardValue = value;
                GetImage();
            }
        }

        public CardSuit Suit
        {
            get
            {
                return this.suit;
            }
            set
            {
                this.suit = value;
                GetImage();
            }
        }
        public Card()
        {
            cardValue = 0;
            suit = 0;
            image = null;

        }

        private void GetImage()
        {
            if (this.Suit != 0 && this.Value != 0)
            {
                int xAxis = 0;
                int yAxis = 0;
                int height = 97;
                int width = 73;

                switch (this.Suit)
                {
                    case CardSuit.Hearts:
                        yAxis = 196;
                        break;
                    case CardSuit.Spades:
                        yAxis = 98;
                        break;
                    case CardSuit.Clubs:
                        yAxis = 0;
                        break;
                    case CardSuit.Diamonds:
                        yAxis = 294;
                        break;
                }
                xAxis = width * ((int)this.Value - 1);

                Bitmap src = Resources.cards;
                Bitmap img = new Bitmap(width, height);
                Graphics gr = Graphics.FromImage(img);
                gr.DrawImage(src, new Rectangle(0, 0, width, height), new Rectangle(xAxis, yAxis, width, height), GraphicsUnit.Pixel);
                gr.Dispose();
                this.image = img;
            }
        }        
    }
    
}

 
{
    public class deck
    {
        private List<Card> cards;

        public List<Card> Cards
        {
            get { return cards; }
            set { Cards = value; }
        }

        public deck()
        {
            Cards = new List<Card>();
            ShuffleNewDeck();

        }

        public void ShuffleNewDeck()
        {
            cards.Clear();
            for (int i = 1; i < 5; i++)
            {
                for (int f = 1; f < 14; f++)
                {
                    Card card = new Card();
                    card.Value = (Card.CardValue)f;
                    card.Suit = (Card.CardSuit)i;
                }
            }
            Random r = new Random();
            cards = cards.OrderBy(x => r.Next()).ToList();
        }


        public Card DrawCard(Hand hand)
        {
            Card drawn = cards[cards.Count - 1];
            cards.Remove(drawn);
            hand.Cards.Add(drawn);
            return drawn;
        }

        [Serializable]
        internal class DeckException : Exception
        {
            public DeckException()
            {
                
            }

            public DeckException(string message) : base(message)
            {
            }

            public DeckException(string message, Exception innerException) : base(message, innerException)
            {
            }
        }
    }
}
{
    public class Hand
    {
        private List<Card> cards;

        public List<Card> Cards
        {
            get { return cards; }
        }

        public Hand(int startingHand, deck deck)
        {
            if (deck == null)
                MessageBox.Show("Deck Unavailable");
            else if (deck.Cards.Count == 0)
                MessageBox.Show("No More Cards to Show");
            else
            {
                cards = new List<Card>();
                for (int i = 0; i < startingHand; i++)
                {
                    deck.DrawCard(this);
                }
            }
        }
        public void AddValue (Card drw, ref int curScore)
        {
            if (drw.Value == CardValue.Ace)
            {
                if (curScore <= 10)
                {
                    curScore += 11;
                }
                else
                {
                    curScore += 1;
                }
            }
            else if (drw.Value == CardValue.Jack || drw.Value == CardValue.Queen || drw.Value == CardValue.King)
            {
                curScore += 10;
            }
            else
            {
                curScore += (int)drw.Value;
            }
        }
    }
}


// This is where I would enter the methods to run them in my windows forms 
{
    public partial class P1 : Form 
    {
        private readonly int StartingHand = 2;
        private readonly int MaxCards = 5;
        PictureBox p;
        PictureBox q;
        deck deck;
        Hand player;
        Hand computer;
        int computerSum;
        int playerSum;
        public P1()
        {
            InitializeComponent();
        }

        private void splitContainer1_Panel2_Paint(object sender, PaintEventArgs e)
        {

        }

        private void P1_Load(object sender, EventArgs e)
        {

        }

        private void resetGameToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
        }

        private void clearTableToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void requestScoreToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void BtnStick_Click(object sender, EventArgs e)
        {
            
        }

        private void BtnTwist_Click(object sender, EventArgs e)
        {

        }
    }
}

【问题讨论】:

  • 为什么要向您的类中添加一个已经存在于另一个类中的方法?代码重复是相当可怕的。如果教程给了你那个想法,那么它就是一个非常糟糕的教程。如果所有教程教你的只是复制'n'粘贴一些代码 sn-ps 到你的项目中,仅此而已,那么这又是一个非常糟糕的教程,不值得被称为“教程”。如果是这样的话,我会建议寻找一个不同的教程,它不鼓励你只是复制'n'粘贴东西而不是操纵你觉得你已经学到了一些东西......
  • 您的意思是您只想从其他方法中调用某些方法吗?
  • 因此,从您要调用的一种方法开始。哪个是您需要调用的第一个方法,您需要从哪里调用它?看,我们不是在谈论编写代码行或其他代码行,而是关于如何设计程序的结构和控制流(程序的执行顺序)以及类实例之间的数据流。这与其说是代码编写问题,不如说是设计问题……
  • 您必须创建类的实例并在表单中使用它们。例如:deck deck = new deck();。然后在表单方法中,使用对象。例如:deck.ShuffleNewDeck();
  • 可能对以下内容感兴趣:learn.microsoft.com/en-us/training/index.treatment-a

标签: c# winforms blackjack


【解决方案1】:

在您的帖子中,您询问如何“将其他类中的所有方法添加到将玩二十一点游戏的类中”。基本上,当你声明一个实例MainForm 中的 Deck 类,然后(正如你所说的)它的所有成员都被“添加”(以某种方式),因为你可以使用你声明的成员属性访问它们。所以这是我们将在 MainForm 中做的第一件事。我还会提到有时有 staticconst 成员,这些成员不需要实例来使用它们,而是您可以使用类名。您将在 MainForm 构造函数中看到这方面的示例,例如 Card.Spades

public partial class MainForm : Form
{
    // Make instance of CardDeck
    Deck DeckInstance = new Deck();
    public MainForm()
    {
        InitializeComponent();
        Text = "Card Game";
        tableLayoutCards.Font = new Font("Sergoe UI Symbol", 9);
        // Static or const members of a class do not require an
        // instance. Use the class name to reference these members.
        labelHandA1.Text = $"10 {Card.Spades}";
        labelHandA2.Text = $"J {Card.Spades}";
        labelHandA3.Text = $"Q {Card.Spades}";
        labelHandA4.Text = $"K {Card.Spades}";
        labelHandA5.Text = $"A {Card.Spades}";
        labelHandB1.Text = $"10 {Card.Hearts}";
        labelHandB2.Text = $"J {Card.Hearts}";
        labelHandB3.Text = $"Q {Card.Hearts}";
        labelHandB4.Text = $"K {Card.Hearts}";
        labelHandB5.Text = $"A {Card.Hearts}";
        buttonDeal.Click += dealTheCards;
    }

    private async void dealTheCards(object sender, EventArgs e)
    {
        buttonDeal.Refresh(); UseWaitCursor = true;
        // When a non-UI task might take some time, run it on a Task.
        await DeckInstance.Shuffle();
        // Now we need the instance of the Desk to get the
        // cards one-by-one so use the property we declared.
        labelHandA1.Text = DeckInstance.Dequeue().ToString();
        labelHandA2.Text = DeckInstance.Dequeue().ToString();
        labelHandA3.Text = DeckInstance.Dequeue().ToString();
        labelHandA4.Text = DeckInstance.Dequeue().ToString();
        labelHandA5.Text = DeckInstance.Dequeue().ToString();
        labelHandB1.Text = DeckInstance.Dequeue().ToString();
        labelHandB2.Text = DeckInstance.Dequeue().ToString();
        labelHandB3.Text = DeckInstance.Dequeue().ToString();
        labelHandB4.Text = DeckInstance.Dequeue().ToString();
        labelHandB5.Text = DeckInstance.Dequeue().ToString();
        UseWaitCursor = false;
        // Dumb hack to make sure the cursor redraws.
        Cursor.Position = Point.Add(Cursor.Position, new Size(1,1));
    }
}

总的来说,我从代码中学到了更多样品我可以在哪里运行和设置断点,而不是教程中的断点,所以我制作了一个你可以clone(但它不是二十一点游戏我会把它留给你,这样我就不会带走你的乐趣!)。


我的示例使用以下简化的类:

卡片

public class Card
{
    // https://office-watch.com/2021/playing-card-suits-%E2%99%A0%E2%99%A5%E2%99%A6%E2%99%A3-in-word-excel-powerpoint-and-outlook/#:~:text=Insert%20%7C%20Symbols%20%7C%20Symbol%20and%20look,into%20the%20character%20code%20box.
    public const string Hearts = "u2665";
    public const string Spades = "u2660";
    public const string Clubs = "u2663";
    public const string Diamonds = "u2666";
    public CardValue CardValue { get; set; }
    public CardSuit CardSuit { get; set; }
    public override string ToString()
    {
        string value, suit = null;
        switch (CardValue)
        {
            case CardValue.Ace: value = "A"; break;
            case CardValue.Jack: value = "J"; break;
            case CardValue.Queen:  value = "Q"; break;
            case CardValue.King: value = "K"; break;
            default: value = $"{(int)CardValue}"; break;
        }
        switch (CardSuit)
        {
            case CardSuit.Hearts: suit = Hearts; break;
            case CardSuit.Spades: suit = Spades; break;
            case CardSuit.Clubs: suit = Clubs; break;
            case CardSuit.Diamonds: suit = Diamonds ; break;
        }
        return $"{value} {suit}";
    }
}

甲板

public class Deck : Queue<Card>
{
    // Instantiate Random ONE time (not EVERY time).
    private readonly Random _rando = new Random();
    private readonly Card[] _unshuffled;
    public Deck()
    {
        List<Card> tmp = new List<Card>();
        foreach(CardValue value in Enum.GetValues(typeof(CardValue)))
        {
            foreach (CardSuit suit in Enum.GetValues(typeof(CardSuit)))
            {
                tmp.Add(new Card { CardValue = value, CardSuit = suit });
            }
        }
        _unshuffled = tmp.ToArray();
    }
    public async Task Shuffle()
    {
        Clear();
        List<int> sequence = Enumerable.Range(0, 52).ToList();
        while(sequence.Count != 0)
        {
            int nextRand = _rando.Next(0, sequence.Count());
            Enqueue(_unshuffled[nextRand]);
            sequence.RemoveAt(nextRand);
        }
        // Spin a wait cursor as a visual indicator that "something is happening".
        await Task.Delay(TimeSpan.FromMilliseconds(500)); 
    }
    public Card GetNext() => Dequeue();
}

枚举

public enum CardValue
{
    Ace = 1,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King,
}
public enum CardSuit
{
    Hearts,
    Spades,
    Clubs,
    Diamonds,
}

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 2023-03-03
    • 2016-03-08
    • 2013-02-10
    • 2020-09-02
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    相关资源
    最近更新 更多