-2

私はプログラミングの初心者で、ブラックジャックのゲームを作っていますが、Hit関数を呼び出すと、シャッフルされたデッキからプレーヤーの手札にカードを追加するのに本当に苦労しています。次のメッセージが表示されます。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

解決策はおそらく本当に明白だと思いますが、助けていただけませんか?
問題は、関数のDeckクラスの一番下にありますHit()

/*メインクラス*/

using System;
using System.Collections.Generic;
using System.Text;

namespace BlackJackGameX
{
    public class MainClass
    {
        public static void Main (string[] args)
        {

            Deck cards = new Deck();

            Hand playerHand = new Hand(cards);

            Console.WriteLine("Welcome to Black Jack\n\nPress Enter To Start");
            Console.ReadLine ();

            cards.Hit();

            playerHand.PrintHand();

        }
    }
}

/*カードクラス*/

using System;
using System.Collections.Generic;
using System.Text;

namespace BlackJackGameX
{
    public enum Suit {Spades, Hearts, Clubs, Diamonds}
    public enum FaceValue {Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King}

    public class Card
    {
        public Suit CardSuit;
        public FaceValue CardValue;
        public int iValue;

        public Card (Suit cardSuit, FaceValue cardValue, int ivalue)
        {
            CardSuit = cardSuit;
            CardValue = cardValue;
            iValue = ivalue;
        }

        public Card ()
        {

        }
    }
}

/*ハンドクラス*/

using System.Collections.Generic;
using System.Text;

namespace BlackJackGameX
{
    public class Hand
    {
        public List<Card> PlayerHand;

        private Deck cardDeck = new Deck();

        public Hand (Deck Cards)
        {
            cardDeck = Cards;
        }

        public void PrintHand()
        {
            for (int i = 0; i < PlayerHand.Count; ++i)
            {
                Console.WriteLine("You have a " + PlayerHand[i].CardValue + " of " + PlayerHand[i].CardSuit);

                if (i < PlayerHand.Count)
                {
                    Console.WriteLine ("&");
                }
            }

            Console.ReadLine();

        }
    }
}

/*デッキクラス*/

using System;
using System.Collections.Generic;
using System.Text;

namespace BlackJackGameX
{
    public class Deck
    {
        Hand playerHand;

        Random rNumber = new Random();

        List<Card> Cards;

        public int iValue1 = 11;
        public int iValue2 = 2;
        public int iValue3 = 3;
        public int iValue4 = 4;
        public int iValue5 = 5;
        public int iValue6 = 6;
        public int iValue7 = 7;
        public int iValue8 = 8;
        public int iValue9 = 9;
        public int iValue10 = 10;
        public int iValue11 = 10;
        public int iValue12 = 10;
        public int iValue13 = 10;

        public Deck()
        {
            Cards = NewDeck();
        }

        private List<Card> NewDeck()
        {
            var AllSuits = new Suit[]
            {
                Suit.Spades,
                Suit.Hearts,
                Suit.Clubs,
                Suit.Diamonds
            };

            var AllFaces = new FaceValue[]
            {
                FaceValue.Ace,
                FaceValue.Two,
                FaceValue.Three,
                FaceValue.Four,
                FaceValue.Five,
                FaceValue.Six,
                FaceValue.Seven,
                FaceValue.Eight,
                FaceValue.Nine,
                FaceValue.Ten,
                FaceValue.Jack,
                FaceValue.Queen,
                FaceValue.King
            };

            var AllValues = new int[]
            {
                iValue1,
                iValue2,
                iValue3,
                iValue4,
                iValue5,
                iValue6,
                iValue7,
                iValue8,
                iValue9,
                iValue10,
                iValue11,
                iValue12,
                iValue13
            };

            List<Card> myDeck = new List<Card>();

            for (int i = 0; i <= 3; i++) 
            {
                for (int j = 0; j <= 12; j++) 
                {
                    Card newCard = new Card(AllSuits[i], AllFaces[j], AllValues[j]);
                    myDeck.Add(newCard);

                }
            }

            List<Card> shuffledDeck = new List<Card> ();

            while (myDeck.Count > 0)
            {
                int c = myDeck.Count;

                int n = rNumber.Next (0, c);

                // var will translate into an int which will be used to pick the card needed from the list
                var value = myDeck[n];
                shuffledDeck.Add(value);
                myDeck.Remove(value);

            }

            return shuffledDeck;
        }

        public void Print()
        {
            for (int i = 0; i <= 51; i++) 
            {
                Console.WriteLine("You drew a " + (Cards [i].CardValue) + " of " + (Cards [i].CardSuit));
                Console.ReadLine ();
            }
        }

        public void Hit()
        {

            playerHand.PlayerHand.Add(Cards[0]);
            Cards.Remove(Cards[0]);

            /*var tmp = Cards[0];
            Cards.Remove(tmp);
            return tmp;*/
        }

    }
}
4

3 に答える 3

5

public List<Card> PlayerHand;あなたのHandクラスの は に割り当てられることはなく、常にnullです。

ではHit、-is を呼び出すplayerHand.PlayerHand.Addので、呼び出すplayerHand.PlayerHandと.nullAddNullReferenceException

例外がスローされた関数を介してデバッグすると、そのような問題が明確に表示されます。使用されている変数を監視することで、予想される値を持つ変数とそうでない変数を確認できます。

于 2013-03-20T21:33:57.393 に答える
0

Deck.playerHand が初期化されていないようです。Hand.PlayerHand も同様です。

于 2013-03-20T21:34:06.220 に答える
0

Deck 内で playerHand を設定することはないため、hit を呼び出すと、playerHand は null になります。

于 2013-03-20T21:34:30.793 に答える