• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

W parametrze program przekazuje mi Nulla. Snake w konsolii

Object Storage Arubacloud
0 głosów
252 wizyt
pytanie zadane 30 sierpnia 2019 w C# przez Moras Obywatel (1,620 p.)

Cześć tworzę sobie snake-a w konsolii, ale mam problem z stworzeniem obiektu klasy "Position" Chodzi o to, że w parametrze przekazuje obiekt "Position", ale mimo to wywala mi wyjątek mówiący, że przekazałem nulla. Wiem, że nikt nie lubi analizować kodu, ale bardzo proszę o pomoc.

Bład pojawia się w linii 59.

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;

namespace Snake
{
    class SnakeControl
    {
        public SnakeControl(Board board)
        {
            Vector2D vector2D = new Vector2D(){X = 0, Y=1};
            Random ranomizer = new Random();
            int timeTicks = 0;
            int counter = 0;

            board.GenerateCherry();
            while (true)
            {
                while (!Console.KeyAvailable)
                {
                    
                    Position earlierHeadPosition = new Position(board.Snake.HeadPosition);
                    for (int i = 0; i < 10; i++)
                    {
                        if (board.Snake.Ogon[i] != null)
                        {
                            if(i==0)
                                board.Snake.Ogon[0].PreviouslyPosition = new Position(earlierHeadPosition);
                            else
                                board.Snake.Ogon[i].PreviouslyPosition = new Position(board.Snake.Ogon[i - 1]);

                        }
                    }
                    board.Snake.HeadPosition.X = board.Snake.HeadPosition.X + vector2D.X;
                    board.Snake.HeadPosition.Y = board.Snake.HeadPosition.Y + vector2D.Y;

                    
                    for (int i = 0; i < 10; i++)
                    {
                        if (board.Snake.Ogon[i] != null)
                        {
                            if (i == 0)
                                board.Snake.Ogon[0] = earlierHeadPosition;
                            else
                                board.Snake.Ogon[i] = board.Snake.Ogon[i - 1].PreviouslyPosition;

                        }
                    }


                    //Zebranie wisienki
                    if (board.Cherry != null && board.Snake.HeadPosition.X == board.Cherry.X && board.Snake.HeadPosition.Y == board.Cherry.Y)
                    {
                        if (counter == 0)
                            board.Snake.Ogon[counter] = new Position(earlierHeadPosition);
                        else
                            board.Snake.Ogon[counter] = new Position(board.Snake.Ogon[counter - 1].PreviouslyPosition);

                        counter++;
                        board.Cherry = null;

                    }
                    #region GenerateCherry

                    timeTicks++;
                    if (timeTicks == 25)
                    {
                        board.GenerateCherry();
                        timeTicks = 0;
                    }

                    #endregion

                    board.RefreshBoard();
                    Thread.Sleep(100);
                }

                ConsoleKey key = Console.ReadKey().Key;
                if (key == ConsoleKey.DownArrow)
                {
                    vector2D.Y = 1;
                    vector2D.X = 0;

                }
                else if (key == ConsoleKey.UpArrow)
                {
                    vector2D.Y = -1;
                    vector2D.X = 0;
                }
                else if (key == ConsoleKey.LeftArrow)
                {
                    vector2D.X = -1;
                    vector2D.Y = 0;
                }
                else if (key == ConsoleKey.RightArrow)
                {
                    vector2D.X = 1;
                    vector2D.Y = 0;
                }



            }


        }
    }

}

Klasa "Position":

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

namespace Snake
{
    class Position
    {
        public int X { get; set; }
        public int Y { get; set; }

        public Position PreviouslyPosition { get; set; }
        public Position(int x, int y)
        {
            X = x;
            Y = y;
        }

        public Position(Position position)
        {
            X = position.X;
            Y = position.Y;
        }

        public Position() { }
    }
}

Klasa "Snake":

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

namespace Snake
{
    class Snake
    {
        public Position HeadPosition { get; set; }
        public Position[] Ogon { get; set; }
        

        public Snake(Position headPosition)
        {
            HeadPosition = headPosition;
            Ogon = new Position[10];
            
        }
   
    }
}

Edit: Zapomniałem dodać błędu:

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=Snake
  Ślad stosu:
   at Snake.Position..ctor(Position position) in C:\Users\krysw\source\repos\Snake\Position.cs:line 21
   at Snake.SnakeControl..ctor(Board board) in C:\Users\krysw\source\repos\Snake\SnakeControl.cs:line 59
   at Snake.Program.Main(String[] args) in C:\Users\krysw\source\repos\Snake\Program.cs:line 23

 

1 odpowiedź

+1 głos
odpowiedź 30 sierpnia 2019 przez tangarr Mędrzec (154,780 p.)
wybrane 30 sierpnia 2019 przez Moras
 
Najlepsza

W linii 30 ustawiasz zmienną board.Snake.Ogon[0].PreviouslyPosition

board.Snake.Ogon[0].PreviouslyPosition = new Position(earlierHeadPosition);

ale potem w linii 45 nadpisujesz cały obiekt board.Snake.Ogon[0]

board.Snake.Ogon[0] = earlierHeadPosition
komentarz 30 sierpnia 2019 przez Moras Obywatel (1,620 p.)
No faktycznie. Wielkie dzięki za poświęcony czas i energie.

Podobne pytania

+5 głosów
1 odpowiedź 941 wizyt
0 głosów
0 odpowiedzi 104 wizyt
pytanie zadane 21 listopada 2019 w C i C++ przez Wiktor Michalski Początkujący (430 p.)
0 głosów
1 odpowiedź 249 wizyt
pytanie zadane 22 października 2019 w JavaScript przez DeaDHanter Nowicjusz (210 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...