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

C# Programowanie nadpisywanie pojedynczej komórki w tabeli

VPS Starter Arubacloud
0 głosów
346 wizyt
pytanie zadane 17 kwietnia 2019 w C# przez WojMen Początkujący (330 p.)
edycja 18 kwietnia 2019 przez WojMen

Program pomimo nadpisania w tablicy mapa[] literą "P" nie wyświetla jej. Cały czas wyświetla to co zostało ustawione na początku. Z góry dziękuje za wszelką pomoc.

linijka 80

kod:

using System;


namespace Gra_0
{
    class Program
    {
        static void Main(string[] args)
        {

            for (; ; )
            {
                Console.Clear();
//Tworzenie mapy
                Console.WriteLine("\n Pamiętaj że szerokośc musi być wieksza od wysokosci!!!");
                Console.Write("\n\n Podaj Szerokość mapy: ");
                int mX = int.Parse(Console.ReadLine());
                Console.Clear();
                Console.Write("\n Podaj Wysokość mapy: ");
                int mY = int.Parse(Console.ReadLine());
                Console.Clear();
                //Tworzenie podstawowych zmiennych
                string[] calaMapa = new string[mY];
                string[,] mapa = new string[mX, mY];
                int pX = 1;
                int pY = 1;
                int aX = mX - 2;
                Random random = new Random();
                int aY = random.Next(0, mY - 1);
                //Points rounds
                int points = 0;
                int rounds = 0;
                TworzenieMapy(mapa, calaMapa, pX, pY);
                //Uruchamianie funkcji
                for (; ; points++, rounds++)
                {
                    WyswietlanieMapy(calaMapa, mapa, ref pX, ref pY);
                    RuchGracza(calaMapa, mapa, ref pX, ref pY);
                    if (SprawdzaniePrzegranej(ref pX, ref pY, ref aX, ref aY) == 1)
                        break;
                    RuchStrzaly(ref aX, ref aY);
                    Console.Clear();
                }
                Wynik(rounds, points);
            }

        }

        //-------------------------------------------------------------------------------
        //MAPA MAPA tworzenie
        public static void TworzenieMapy(string[,] mapa, string[] calaMapa, int pX, int pY)
        {

            for (int i = 0; i < mapa.GetLength(0); i++)
            {
                //Tworzenie granicy gornej czesci mapy
                calaMapa[0] += mapa[i, 0] = "=";
            }
            for (int i = 1; i < calaMapa.Length - 1; i++)
            {
                //Tworzenie srodka mapy
                calaMapa[i] += mapa[i - 1, i] = "|";
                for (int k = 1; k < mapa.GetLength(0) - 1; k++)
                {
                    calaMapa[i] += mapa[k, i] = " ";
                }

                calaMapa[i] += mapa[calaMapa.Length, i] = "|";
            }
            for (int i = 0; i < mapa.GetLength(0); i++)
            {
                //Tworzenie granicy dolnej czesci mapy
                calaMapa[mapa.GetLength(1) - 1] += mapa[i, mapa.GetLength(1) - 1] = "=";
            }



        }
        //Wyswietlanie mapy, ruchu gracza, ruchu strzaly
        public static void WyswietlanieMapy(string[] calaMapa, string[,] mapa, ref int pX, ref int pY)
        {
            mapa[pX, pY] = "P";
            Console.WriteLine("\n\n");
            for (int i = 0; i < calaMapa.Length; i++)
            {
                Console.Write("            ");
                Console.WriteLine(calaMapa[i]);
            }
            mapa[pX, pY] = " ";
        }
        //Sprawdzanie czy gracz może sie ruszyć
        public static void RuchGracza(string[] calaMapa, string[,] mapa, ref int pX, ref int pY)
        {
            Console.Write("\n\n     Ruszaj sie: ");
        wybor:
            char wybor = Console.ReadKey().KeyChar;
            switch (wybor)
            {
                case 'w':
                    while (true)
                    {
                        if (pY + 1 == mapa.GetLength(1))
                        {
                            goto wybor;
                        }
                        pY++;
                        break;
                    }
                    break;
                case 's':
                    while (true)
                    {
                        if (pY - 1 == mapa.GetLength(1))
                        {
                            goto wybor;
                        }
                        pY--;
                        break;
                    }
                    break;
                case 'a':
                    while (true)
                    {
                        if (pX - 1 == 0)
                        {
                            goto wybor;
                        }
                        pX--;
                        break;
                    }
                    break;
                case 'd':
                    while (true)
                    {
                        if (pX + 1 == mapa.GetLength(0) - 1)
                        {
                            goto wybor;
                        }
                        pX++;
                        break;
                    }
                    break;

                default:
                    Console.WriteLine("Nie trafiłeś w klawiature chyba");
                    break;
            }
        }

        public static void RuchStrzaly(ref int aX, ref int aY)
        {

        }
        //Sprawdzanie przegranej
        public static int SprawdzaniePrzegranej(ref int pX, ref int pY, ref int aX, ref int aY)
        {
            if ((pX == aX) && (pY == aY))
            {
                return 1;
            }
            return 0;
        }
        //Wynik
        public static void Wynik(int rounds, int points)
        {
            Console.WriteLine("Niestety ale to już koniec");
            Console.WriteLine("Udalo ci się przetrwać: {0} rund oraz zdobyć: {1} punktów", rounds, points);
        }
    }
}

 

1 odpowiedź

0 głosów
odpowiedź 18 kwietnia 2019 przez gagyn Stary wyjadacz (11,050 p.)
public static void WyswietlanieMapy(string[] calaMapa, string[,] mapa, ref int pX, ref int pY)
{
      mapa[pX, pY] = "P";
      Console.WriteLine("\n\n");
      for (int i = 0; i < calaMapa.Length; i++)
      {
            Console.Write("            ");
            Console.WriteLine(calaMapa[i]);
      }
      mapa[pX, pY] = " ";
 }

Na początku funkcji przypisujesz literę 'P', a na końcu z powrotem ' '. Przez całą funkcję nigdzie nie używasz tablicy mapa, oprócz przypisania.

komentarz 18 kwietnia 2019 przez WojMen Początkujący (330 p.)
Tablica mapa jest przypisana do tablicy calaMapa. Linijka 50. Robiłem już tak samo w innej grze i wszystko działało.
komentarz 18 kwietnia 2019 przez gagyn Stary wyjadacz (11,050 p.)

Przeanalizuj działanie tej metody, którą podałem wyżej.

pX oraz pY nie są zmieniane przez całą metodę, więc w pierwszym przypisaniu jak i ostatnim odnosisz się do tego samego. 

public static void WyswietlanieMapy(string[] calaMapa, string[,] mapa, ref int pX, ref int pY)
{
      mapa[pX, pY] = "P";
      ...
      mapa[pX, pY] = " ";
 }

To nie ma sensu, najpierw przypisujesz P, a potem "  " do tej samej komórki. 

komentarz 18 kwietnia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Nie rozumiem do końca, dlaczego podzieliłeś mapę na dwie tablice - 'calaMapa' i 'mapa' - jaka jest różnica między nimi?

Poza tym, tak bardzo się prosi w tym kodzie, aby zrobić to obiektowo ;) Chyba, że jeszcze nie przerabiałeś klas, to postaraj się jak najszybciej się za to zabrać, bo to znacząco ułatwiłoby zrozumienie tego kodu.

Nazwy zmiennych nadawaj po angielsku.
komentarz 18 kwietnia 2019 przez WojMen Początkujący (330 p.)
No tak ale W środku tego jest pętla która wyświetla całą mapę więc przed pętlą nadaje jakieś komórce "P" w tym wypadku to jest  mapa[1,1] czyli lewy górny ekranu. pętla wyświetla mapę na ekranie .  Po wyświetleniu usuwa P z komórki więc dlaczego miało by nie wyświetlić "P"?
komentarz 18 kwietnia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Pętla operuje na 'calaMapa', a przypisania są do 'mapa'.
komentarz 18 kwietnia 2019 przez WojMen Początkujący (330 p.)

@gagyn, jako obiekty miałem zamysł aby gracz i przeszkody(sztrzały) były jako obiekt ale nie za bardzo wiem jak miał się za to zabrać przy sprawdzaniu wtedy czy na siebie obiekty nie nachodzą. Jeśli możesz to prześlij  jakiś szkic będę bardzo wdzięczny a zatrzymałem się na mapie bo nie wiem czemu mi się nie wyświetla nawet ikonka gracza :(.

komentarz 18 kwietnia 2019 przez WojMen Początkujący (330 p.)

@gagyn,

to wygląda w ten sposób

każda kolumna w calaMapa przechowuje jeden poziom  

calaMapa[0]=mapa[0,0]+mapa[1,0]+mapa[2,0]..

calaMapa[1]=mapa[0,1]+mapa[1,1]+mapa[2,1]..

 

komentarz 18 kwietnia 2019 przez gagyn Stary wyjadacz (11,050 p.)

Zacznij od tego, że zrób calaMapa obiektem, który ma listę/tablicę obiektów mapa.

Później napisz metody dla tych klas (np. wyświetlanie mapy). Takie podejście bardzo ułatwi zrozumienie, a kod będzie bardziej uporządkowany.

1
komentarz 18 kwietnia 2019 przez WojMen Początkujący (330 p.)
Dzisiaj postaram się wszystko uporządkować!
komentarz 19 kwietnia 2019 przez WojMen Początkujący (330 p.)

@gagyn, Tylko tyle się udało dzisiaj zrobić, niestety troszkę mało, a to dlatego, że walczyłem z wyświetlaniem gracza na mapie jak zrobić. Najpierw w tablicy, ale jak to przekazać.. potem spróbowałem z  List zrobiłem wszystko działa, ale po nadpisaniu komórki nie wyświetla się gracz tak samo było w tablicy. Dictionary zadziałało, jutro zabieram się za dodanie przeciwnika to znaczy strzał, które będą się randomowo tworzyć na granicach mapy. Nie wiem tylko jak stworzyć tablice obiektów, ale to juro ogarnę dziękuję za pomoc. 

Na razie działa tworzenie planszy oraz poruszanie przez gracza, nie może wychodzić poza granice.

tutaj kod:

using System;
using System.Collections.Generic;

namespace Gra_0
{
    class Program
    {
        static void Main(string[] args)
        {
            Map map = new Map();
            Player gracz = new Player();
            while (true)
            {
                map.Create();
                while (true)
                {
                    map.Show(gracz.PlayerX,gracz.PlayerY);
                    map.PlayerMove(ref gracz.PlayerX,ref gracz.PlayerY);
                }
            }
        }
    }
    class Map
    {
        public int MapX { get; set; }
        public int MapY { get; set; }
        public Dictionary<string, string> dictionary = new Dictionary<string, string>();
        public void Create()
        {

            //Size of Map
            Console.Clear();
            Console.WriteLine("\n Pamiętaj że szerokośc musi być wieksza od wysokosci!!!");
            Console.Write("\n\n Podaj Szerokość mapy: ");
            MapX = int.Parse(Console.ReadLine());
            Console.Clear();
            Console.WriteLine("\n Pamiętaj że szerokośc musi być wieksza od wysokosci!!!");
            Console.Write("\n\n Podaj Wysokość mapy: ");
            MapY = int.Parse(Console.ReadLine());
            Console.Clear();
            string mapBuildingChar = "#";

            string[,] map = new String[MapX, MapY];
            //Creating top border map
            for (int i = 0; i < MapX; i++)
            {
                map[i, 0] = mapBuildingChar;
            }

            //Creating middle of map
            for (int i = 1; i < MapY - 1; i++)
            {
                map[0, i] = mapBuildingChar;
                for (int j = 1; j < MapX - 1; j++)
                {
                    map[j, i] = " ";
                }
                map[MapX - 1, i] = mapBuildingChar;
            }
            //Creating bottom border map
            for (int i = 0; i < MapX; i++)
            {
                map[i, MapY - 1] = mapBuildingChar;
            }
            //Adding map to list
            for (int i = 0; i < MapY; i++)
            {
                for (int j = 0; j < MapX; j++)
                {
                    dictionary.Add(j + "" + i, map[j, i]);
                }
                Console.WriteLine();
            }
        }
        public void Show(int playerX, int playerY)
        {
            Console.Clear();
            //Set player on the map and enemy(work in progress)
            dictionary[playerX + "" + playerY] = "P";
            //dictionary[enemyX + "" + enemyY] = "-";
            //Showing map from dictrionary
            string space = "                          ";
            Console.WriteLine("\n\n\n\n\n");
            for (int i = 0; i < MapY; i++)
            {
                Console.Write(space);
                for (int j = 0; j < MapX; j++)
                {
                    Console.Write(dictionary[j + "" + i]);

                }
                Console.WriteLine();
            }
            //dictionary[enemyX + "" + enemyY] = "-";
            dictionary[playerX + "" + playerY] = " ";
        }
        public void PlayerMove(ref int playerX, ref int playerY)
        {
            //Checking player move
            char move = Console.ReadKey().KeyChar;
            switch (move)
            {
                case 'w':
                    if (playerY - 1 == 0)
                        break;
                    playerY--;
                    break;
                case 's':
                    if (playerY + 1 == MapY - 1)
                        break;
                    playerY++;
                    break;
                case 'a':
                    if (playerX - 1 == 0)
                        break;
                    playerX--;
                    break;
                case 'd':
                    if (playerX + 1 == MapX - 1)
                        break;
                    playerX++;
                    break;
                default:
                    Console.WriteLine("Nie trafiles");
                    break;
            }
            Console.Clear();
        }
    }
    class Player
    {
        public string Name = "Jan";
        public int PlayerX = 1;
        public int PlayerY = 1;
    }
}

 

Podobne pytania

0 głosów
0 odpowiedzi 603 wizyt
pytanie zadane 17 kwietnia 2019 w C# przez WojMen Początkujący (330 p.)
0 głosów
3 odpowiedzi 601 wizyt
pytanie zadane 20 listopada 2019 w C# przez enero Początkujący (330 p.)
0 głosów
0 odpowiedzi 75 wizyt
pytanie zadane 21 maja 2017 w PHP przez Kshyhoo Użytkownik (750 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...