Avatar
ondracekjakub:

Zdar lidi, potreboval bych poradit s nasledujicim problemem: Mam danou dvojrozmernou matici [20,30]. Potreboval bych nejakym zpusobem ulozit jednu konkretni (nahodnou) souradnici ulozit do promenne a tu potom dale pouzivat k pohybu na matici (napr pomoci WASD - pohyb podle sipek). Zkousel jsem to nadefinovat pres switch, ale nepodarilo se mi najit spravnou syntax, ktera by matici prinutila se znovu vypsat se zmenenyma souradnicema podle zmackleho tlacitka.

S uzivatelskeho pohledu mi jde zatim o to, ze cela matice je vyplnena napr hvezdickama az na jedny souradnice, kde je X. Chtel bych, aby se to X hybalo podle uzivatelskeho vstupu a aby se neduplikovalo.

 
Odpovědět 7.4.2014 23:57
Avatar
Odpovídá na ondracekjakub
Luboš Běhounek (Satik):

Jestli jsem dobre pochopil, o co ti jde, tak bych si nechal nekde stranou ulozenou tu souradnici a v cyklu, kde se matice vykresluje, bych jen porovnaval, jestli nevykresluju pozici, ktera se shoduje s tou ulozenou souradnici - pak bych misto obsahu matice vykreslil X.

Nahoru Odpovědět 8.4.2014 0:08
:)
Avatar
rwn
Člen
Avatar
Odpovídá na ondracekjakub
rwn:

Pokud by ta matice mělo uchovávat pouze dva možné stavy - tedy křížek tam je nebo není, tak by nemuselo být špatné to řešit polem typu bool.

private bool[,] matice = new bool[20, 30];

přičemž "hvězdička" bude false a křížek bude true. Pak by sis mohl udělat nějakou metodu, která bude přepínat hodnotu, třeba něco takovéhoto:

public void ZmenHodnotu(int x, int y)
{
        matice[x, y] = !matice[x, y];
}

A ted už by jen stačilo si volat ZmenHodnotu na souřadnici, kde se křížek nachází a kam se posouvá. Ale způsobů jak to řešit je mraky. :)

Nahoru Odpovědět 8.4.2014 1:07
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
ondracekjakub:

Dekuju za odpovedi. Bool bohuzel pouzit nemuzu, protoze se tam casem objevi jeste dalsi prvky. Abych to teda popsal poradne - jedna se o jednoduchy projekt/hru, kterou jsem nasel v nejake ucebnici. Je dano dvojrozmerne pole, ktere je vypsano hvezdickama(hraci plocha), X (hrac), Z(zombici) a B (bomba). X je nahodne generovane a hrac jim pohybuje pomoci wasd (X je na poli vzdy prave jedno, po zmacknuti klavesy se cela matice znovu vykresli, pricemz X je posunute o souradnice podle zmacknute klavesy a na puvodnim miste je zase hvezdicka). Zombici se pri kazdem novem vykresleni pohnou o jedno policko smerem k hraci. Pokud se potkaji na stejnem policku, hra konci. Pokud hrac stoupne na policko B, bomba vybouchne a hrac ziskava body za zabite zombiky.

Momentalne jsem zasekly na tom, ze se mi nedari nadefinovat nahodnou promennou, ktera by definovala hracovu prvotni pozici (urcite vyzkousim) a hlavne na tom rozpohybovani po matici.

rwn: pokud pouziju tu metodu ZmenHodnotu, nebude se mi X pridavat jako za sebe jako ve hre Had?

 
Nahoru Odpovědět 8.4.2014 11:07
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na ondracekjakub
Jan Vargovský:

Co takto?

Random rnd = new Random();
int x = rnd.Net(tvojePole.GetLength(0));
int y = rnd.Next(tvojePole.GetLength(1));

nebo v objektu

Random rnd = new Random();
Point p = new Point(rnd.Net(tvojePole.GetLength(0)), rnd.Net(tvojePole.GetLength(1)))

Btw, jestli to děláš v konzoli, tak si buď musíš přidat System.Drawing a nebo si nato vytvoř svoji třídu na ty pozice.

Editováno 8.4.2014 11:29
 
Nahoru Odpovědět 8.4.2014 11:27
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Něco pro inspiraci jsem tu vykoumal. Nejlepší by asi bylo, že by jsi měl zvlášt kolekci na všechny objekty (resp. jen na zombíky, protože ty budou mít nějakou AI) a s těmi budeš postupně pohybovat k tomu hráči. Protože hledání je v té matici, pak hledání kde vůbec mají jít a zbytečné přepisování celého objektu by bylo složitější, než si hrát s pozicemi.

class Game
{
    private Random random = new Random();
    private FieldType[,] gameBoard;
    private Point player;

    //private List<Point> zombies;

    public bool IsPlaying { get; private set; }

    public Game(int cols, int rows)
    {
        gameBoard = new FieldType[cols, rows];
        player.X = random.Next(gameBoard.GetLength(0));
        player.Y = random.Next(gameBoard.GetLength(1));
        IsPlaying = true;
    }

    public void Turn(ConsoleKey k)
    {
        switch (k)
        {
            case ConsoleKey.W:
                if (IsValid(player.X, player.Y - 1))
                    player.Y--;
                break;

            case ConsoleKey.S:
                if (IsValid(player.X, player.Y + 1))
                    player.Y++;
                break;

            case ConsoleKey.A:
                if (IsValid(player.X - 1, player.Y))
                    player.X--;
                break;

            case ConsoleKey.D:
                if (IsValid(player.X + 1, player.Y))
                    player.X++;
                break;
        }

        // zombie's turn etc...
    }

    private bool IsValid(Point p)
    {
        return IsValid(p.X, p.Y);
    }

    private bool IsValid(int x, int y)
    {
        return x >= 0 &&
            y >= 0 &&
            x < gameBoard.GetLength(0) &&
            y < gameBoard.GetLength(1);
    }

    public void Draw()
    {
        Console.Clear();

        for (int y = 0; y < gameBoard.GetLength(1); y++)
        {
            for (int x = 0; x < gameBoard.GetLength(0); x++)
            {
                Console.Write(FieldTypeToChar(gameBoard[x, y]));
            }
            Console.WriteLine();
        }

        Console.CursorLeft = player.X;
        Console.CursorTop = player.Y;
        Console.Write(FieldTypeToChar(FieldType.Player));

    }

    private char FieldTypeToChar(FieldType f)
    {
        switch (f)
        {
            case FieldType.Empty:
                return '*';
            case FieldType.Zombie:
                return 'Z';
            case FieldType.Bomb:
                return 'B';
            case FieldType.Player:
                return 'X';
            default:
                throw new ApplicationException("nondefined FieldType");
        }
    }
}

.

enum FieldType
{
    Empty, // *
    Zombie, // Z
    Bomb, // B
    Player // X
}

.

struct Point
{
    public int X, Y;
}

.

internal static class Program
{
    [STAThread]
    private static void Main(string[] args)
    {
        Game g = new Game(10, 10);

        g.Draw();
        while (g.IsPlaying)
        {
            g.Turn(Console.ReadKey(true).Key);
            g.Draw();
        }

        Console.ReadLine();
    }
}
Editováno 8.4.2014 11:55
 
Nahoru Odpovědět 8.4.2014 11:54
Avatar
Odpovídá na ondracekjakub
Luboš Běhounek (Satik):

Bezne se to resi tak, ze vykreslis celou mapu a pak pres to vykreslis objekty - panacka a bombu.

Nahoru Odpovědět 8.4.2014 11:55
:)
Avatar
rwn
Člen
Avatar
Odpovídá na ondracekjakub
rwn:

Nebyl by to Had, protože bys negoval novou pozici a starou v jednom kroku(metoda by se v jednom kroku volala dvakrat). Ale pokud je tam tedy více stavů na jednotlivém políčku, tak se to nedá s tím bool moc použít. :)

Nahoru Odpovědět 8.4.2014 14:21
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.