Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno c# Switch - default - když není stisknuté tlačítko

Dobrý den!

Mám hru Had - kde ve Switchi si vlastně hlídám co je zmáčknuto za tlačítko a podle toho se had pohybuje. Mám ale problém, že když se zmáčkne jakékoliv jiné tlačítko - had se zastaví na místě. Chtěl bych, aby když se zmáčkne jiné tlačítko, aby had pokračoval v tom směru, ve kterém běžel.

 private ConsoleKeyInfo Pohyb(ConsoleKeyInfo key1)
        {
            this.key1 = key1;

            switch (key1.Key)
            {
                case ConsoleKey.UpArrow:
                    {
                        
                    }
                case ConsoleKey.DownArrow:
                    {
                       
                    }
                case ConsoleKey.LeftArrow:
                    {
                       
                    }
                case ConsoleKey.RightArrow:
                    {
                       
                    }

                case ConsoleKey.R:
                    Restart();
                    break;

                case ConsoleKey.P:  // Pauza
                    break;

                default:
                    goto ;

            }
            return key1;
        }

Zřejmě je potřeba to hodit do 'default' - ale nevim právě přesně co.

Děkuji za každou radu.

Předmět Autor Datum
Zapamatuj si poslední stisknutou klávesu a podle toho znovu proveď příslušnou akci.
Wikan 21.11.2015 22:26
Wikan
poslední stisknutou klávesu mam uloženou v tom key1 - problém je, že nevím jak to implementovat v to…
kubelík 21.11.2015 22:28
kubelík
Nejdřív zkontroluj současnou klávesu a když se nechytne, tak původní stisknutou.
Wikan 21.11.2015 22:33
Wikan
Tady kecam no :D protože v key1 mam uloženou aktuální stisknutou klávesu ...
kubelík 22.11.2015 14:20
kubelík
Díky! Už se mi to povedlo zporovznit ... default: if (PoslKey1.Key == ConsoleKey.UpArrow) { key1…
kubelík 22.11.2015 00:53
kubelík
Není to zrovna elegantní, ale tak proč ne.
Wikan 22.11.2015 09:35
Wikan
To není no ... vzhledem k tomu, že používám to samé ještě na jednom místě. Možná jsem ne uplně poch…
kubelík 23.11.2015 11:47
kubelík
Ja teda netuším ako máš vyriešený pohyb hada. Myšlienka, princíp: Had sa pohybuje stále nejakým smer…
pme 23.11.2015 11:56
pme
Třeba tak: private void Pohyb(ConsoleKeyInfo keyInfo) { if (handleMovement(keyInfo)) return; switch…
Wikan 23.11.2015 12:06
Wikan
Ked je program spravne strukturovany tak nepotrebujes goto. Z toho vyplyva ze tvoje aktualne zdrojak…
MM.. 23.11.2015 13:39
MM..
.. alebo dat ten test do fcie ako to urobil wikan a volat tu fciu druhykrat s povodnou klavesou podl…
MM.. 23.11.2015 14:01
MM..
• Had namespace Had { public enum Direction { Up, Down, Left, Right }; public class Settings { publ…
CoCoChanel 24.11.2015 19:57
CoCoChanel
for (int i = Had.Count - 1; i >= 0; i--) { if (i == 0) { switch (Settings.direction) { case Directio…
CoCoChanel 24.11.2015 20:18
CoCoChanel
Mockrát všem děkuju ... pomohli jste mi uvědomit si zase pár věcí :) poslední
kubelík 30.11.2015 19:24
kubelík

Díky!

Už se mi to povedlo zporovznit ...

 default:                                    

                    if (PoslKey1.Key == ConsoleKey.UpArrow)
                    {
                        key1 = PoslKey1;
                        goto case ConsoleKey.UpArrow;
                    }
                    if (PoslKey1.Key == ConsoleKey.DownArrow)
                    {
                        key1 = PoslKey1;
                        goto case ConsoleKey.DownArrow;
                    }
                    if (PoslKey1.Key == ConsoleKey.LeftArrow)
                    {
                        key1 = PoslKey1;
                        goto case ConsoleKey.LeftArrow;
                    }
                    if (PoslKey1.Key == ConsoleKey.RightArrow)
                    {
                        key1 = PoslKey1;
                        goto case ConsoleKey.RightArrow;
                    }

                    break;

uplně pak mimo pod tim Switchem samozřejmě musím mít

 PoslKey1 = key1;

To není no ... vzhledem k tomu, že používám to samé ještě na jednom místě.

Možná jsem ne uplně pochopil, co jste myslel vy.

Chápu, že máte asi práce dost :D - nemohl byste torchu blíže nastínit tu vaši myšlenku v kódu?

Ja teda netuším ako máš vyriešený pohyb hada.
Myšlienka, princíp:
Had sa pohybuje stále nejakým smerom, až kým sa nestlačí nejaká klávesa, ktorá zmení jeho pohyb.
Otestuješ aká klávesa bola stlačená - na základe toho zmeníš pohyb hada.
Takže nechaj hada hadom a až sa stlačí príslušná klávesa - zmeň pohyb, ak sa stlačí nejaká iná klávesa, ktorá Ťa nezaujína - ignoruj (nevykonaj zmenu pohybu) = had pokračuje ďalej bez zmeny.

Třeba tak:

private void Pohyb(ConsoleKeyInfo keyInfo)
{
    if (handleMovement(keyInfo))
        return;

    switch (keyInfo.Key)
    {
        case ConsoleKey.R:
            Restart();
            break;
        case ConsoleKey.P:
            // Pauza
            break;
        default:
            handleMovement(this.key1);
    }
}

bool handleMovement(ConsoleKeyInfo keyInfo)
{
    switch (keyInfo.Key)
    {
        case ConsoleKey.UpArrow:
            //obsluha
            break;
        case ConsoleKey.DownArrow:
            //obsluha
            break;
        case ConsoleKey.LeftArrow:
            //obsluha
            break;
        case ConsoleKey.RightArrow:
            //obsluha
            break;
        default:
            return false;
    }
    this.key1 = keyInfo;
    return true;
}

Ked je program spravne strukturovany tak nepotrebujes goto. Z toho vyplyva ze tvoje aktualne zdrojaky budu asi chaos.
(a problem chaosu je ten, ze zmenis jedno a zabudnes zmenit to druhe, napr. pridas dalsiu klavesu a zabudnes pridat goto ptz je to na inom mieste. Z toho dovodu by mal SW vyvojar sa snazit nerobit veci redundantne, testy klavesy mas mat len na jednom mieste v tych case, a ne zas kdesi inde v nejakych goto. A ked to potrebujes testovat 2x, tak si tam das trebars nejaky cyklus od 0 do 1, alebo nekonecny cyklus a pouzijes break ked si klavesu otestoval, apod.

.. alebo dat ten test do fcie ako to urobil wikan a volat tu fciu druhykrat s povodnou klavesou podla toho co vratila. vseobecne ale test na klavesu sa robi uplne inac, na jednej strane mas reagovat na stlacenie klavesy okamzite (a nic pri tom nevykreslovat), a na strane druhej hada mas vykreslovat ako event od timera, a ne ako event na stlacenie klavesy.

• Had

namespace Had
{
    public enum Direction
    {
        Up,
        Down,
        Left,
        Right
    };

    public class Settings
    {
        public static int Width { get; set; }
        public static int Height { get; set; }
        public static int Speed { get; set; }
        public static int Score { get; set; }
        public static int Points { get; set; }
        public static bool GameOver { get; set; }
        public static Direction direction { get; set; }

        public Settings()
        {
            Width = 15;
            Height = 15;
            Speed = 15;
            Score = 0;
            Points = 100;
            GameOver = false;
            direction = Direction.Down;
        }
    }


}

• Input

using System.Collections;
using System.Windows.Forms;
namespace Had
{
    internal class Input
    {       
       private static Hashtable keyTable = new Hashtable();

        //verifikce zmacklého tlacitka
        public static bool KeyPressed(Keys key)
        {
            if (keyTable[key] == null)
            {
                return false;
            }

            return (bool) keyTable[key];
        }

        //Verifikace jestli je zmacklé
        public static void ChangeState(Keys key, bool state)
        {
            keyTable[key] = state;
        }
    }
}

:-p

for (int i = Had.Count - 1; i >= 0; i--)
            {             
                if (i == 0)
                {
                    switch (Settings.direction)
                    {
                        case Direction.Right:
                            Had[i].X++;
                            break;
                        case Direction.Left:
                            Had[i].X--;
                            break;
                        case Direction.Up:
                            Had[i].Y--;
                            break;
                        case Direction.Down:
                            Had[i].Y++;
                            break;
                    }

:-) Ve <VB> byla vyhoda, ze za kazdy psat 'break' nebyla potreba.

Zpět do poradny Odpovědět na původní otázku Nahoru