Gra typu "Snake"

0

Witam. Jestem początkującym w pisaniu programów c# oraz mam problem-
Chciałbym, żeby mój wąż po dotknięciu ściany bocznej odbił się lub przeniósł na przeciwną stronę planszy, mam nadzieję że możecie pomóc. Oto kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;

namespace ConsoleApplication8
{
    class Program
    {
        public static int lewa = 4;
        public static int gora = 2;
        public static int dol_ = 1;
        public static int prawa = 3;
        public static int dlu = 1;
        public static int speed = 0;
        public static int dlugos = 300;
        public static int szybkosc = 200;
        public static string dol = "";
        public static string dlugosc = "";
        public static int ry = 0;
        public static int rx = 0;
        public static int zmiana = 3;
        public static string waz = "";
        public static int MINX = 0;
        public static int MINY = 0;
        public static int MAXX = 101;
        public static int MAXY = 50;
        public static int wx = 0;
        public static int wy = 0;
        public static TimeSpan rosnij;


        static void Main(string[] args)
        {
            Console.CursorVisible = false;
            bool iscontinue = true;
            

            int x = 1;
            int y = 1;

            int wy = y - 1;
            //Program.zmiana = 3;
            DateTime start = DateTime.Now;
            DateTime stop = DateTime.Now;
            while (iscontinue)
            {

                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo Info = Console.ReadKey();
                    if (Info.Key == ConsoleKey.RightArrow)
                    {

                        x = x + 1;
                        waz = "-o";
                        zmiana = prawa;
                    }
                    if (Info.Key == ConsoleKey.DownArrow)
                    {
                        y = y + 1;
                        Program.zmiana = dol_;
                        waz = "o";
                    }
                    if (Info.Key == ConsoleKey.UpArrow)
                    {
                        y = y - 1;
                        Program.zmiana = gora;
                        waz = "o";
                    }
                    if (Info.Key == ConsoleKey.LeftArrow)
                    {
                        zmiana = lewa;
                        x = x - 1;
                        waz = "o-";                     
                    }

                }
                else
                {
                    if (zmiana == dol_)
                    {

                        waz = "o";
                        y = y + 1;
                    }
                    if (zmiana == gora)
                    {

                        waz = "o";
                        y = y - 1;
                    }
                    if (zmiana == prawa)
                    {
                        x = x + 1;
                        waz = "-o";
                    }
                    if (zmiana == lewa)
                    {
                        x = x - 1;
                        waz = "o-";
                    }
                }
                if (x < 0)
                    x = MAXX-dlu;
                /*if (y < 0)
                    y = MAXY;*/
                Console.Clear();
                rysuj(x, y, out x, out y);
                Thread.Sleep(szybkosc);
                stop = DateTime.Now;
                rosnij = stop - start;

                if (rosnij.Seconds >= 5)
                {
                    if (dlugos == 300)
                    {
                        dlu = dlu + 1;

                    }
                    //    dlugos = dlugos + 1;
                    speed = speed + 1;
                    start = stop;
                }
                if (x > MAXX)
                    x = 0;
                if (y > MAXY)
                    y = 0;



            }
        }

        public static void plansza_w(int x, int y, int maxx, int maxy)
        {

            int mx = maxx + 2;
            dlugosc = SetChar(mx, "#");
            dol = SetChar(mx, "#");
            //MAXX = MAXX - 1;
            Console.SetCursorPosition(0, 0);
            Console.Write(dlugosc);

            string liniew = "#";


            for (int ilo = 0; ilo < maxy; ilo++)
            {
                Console.Write(liniew);
                Console.SetCursorPosition(mx, ilo);
                Console.WriteLine("#");
            }
            Console.WriteLine(dol);

        }

        public static string SetChar(int k, string s)
        {
            string ret = "";
            for (int l = 0; l < k; l++)
                ret += s;
            return ret;
        }
        public static void rysuj(int x, int y, out int rx, out int ry)
        {
            rx = 0;
            ry = 0;


            for (int k = 0; k < MAXX; k++)
            {

                for (int l = 0; l < MAXY; l++)
                {
                    //x,y

                    if (k == x && l == y)
                    {
                        //string  który ma k-spacji i l-enterów 
                        //if (Program.zmiana== 1)
                        //{
                        //waz = "|\n" + spacje + "o";
                        //zmiana = 0;
                        //}
                        //if (Program.zmiana==gora)
                        //{
                        //}

                    

                    // Console.Write(entery + spacje+ waz);
                        if(zmiana==dol_)
                        {
                            waz_dol(x,y, out y);
                            rx = x;
                            ry = y;
                            return;
                        }
                        if(zmiana==gora)
                        {
                            waz_gora(x, y, out y);
                            rx = x;
                            ry = y;
                            return;
                        }
                        if(zmiana == prawa || zmiana == lewa)
                        {
                            waz_lewa_prawa(x,y,prawa, out x);
                            rx = x;
                            ry = y;
                            return;
                        }                       
                        break;

                        
                    }
                }
            }
           
        } 
        public static void napisy(int wy, int wx,int x,int y)
        {
            MAXY = MAXY + 1;
            Console.SetCursorPosition(0,MAXY);
            MAXY = MAXY - 1;
            wx = x - 1;
            wy = y - 1;
            Console.WriteLine("\nWspółrzędne Węża:\nX=" + wx + "\nY=" + wy);


        }
        public static void waz_gora(int x,int y, out int ry)
        {

            ry = y;
            y = y + dlu;            
            for(int ala=0; ala<=dlu; ala++)
            {
                y = y - 1;
                bool iscontinue = true;
                while (iscontinue)
                {
                    if (MAXY == y || y > MAXY)
                    {
                        zmiana = gora;
                        ala = dlu;
                        x = x - 1;
                        break;
                    }
                    else
                    {
                        if (y == 0 || y < 0)
                        {
                            zmiana = dol_;
                            ala = dlu;
                            y = y + 1;
                            break;
                        }
                        else
                        {
                            if (x == MAXX || x > MAXX)
                            {
                                zmiana = lewa;
                                ala = dlu;

                                break;
                            }
                            else
                            {
                                if (x == 0 || x < 0)
                                {
                                    zmiana = prawa;
                                    ala = dlu;
                                    break;
                                }
                                else
                                {
                                    iscontinue = false;
                                }

                            }

                        }
                    }
                }
                Console.SetCursorPosition(x, y);
                Console.Write("|");
            }
            bool iscontinue2 = true;
            while (iscontinue2)
            {
                if (MAXY == y || y > MAXY)
                {
                    zmiana = gora;
                }
                else
                {
                    if (y == 0 || y < 0)
                    {
                        zmiana = dol_;
                    }
                    else
                    {
                        if (x == MAXX || x > MAXX)
                        {
                            zmiana = lewa;
                        }
                        else
                        {
                            if (x == 0 || x < 0)
                            {
                                zmiana = prawa;
                            }
                            else
                            {
                                iscontinue2 = false;
                            }

                        }

                    }
                }
            }
            Console.SetCursorPosition(x, y);
            Console.Write("o");
            
            napisy(wy, wx, x, y);
            plansza_w(x, y, MAXX, MAXY);
        }
        public static void waz_dol(int x, int y, out int ry)
        {
            ry = y;
            y = y - dlu;
            for (int ala = 0; ala <= dlu; ala++)
            {
                y = y + 1;
                bool iscontinue = true;
                while (iscontinue)
                {
                    if (MAXY == y || y > MAXY)
                    {
                        zmiana = dol_;
                        ala = dlu;
                        y = y - 1;
                        break;
                    }

                
                    else
                    {
                        if (y == 0 || y < 0)
                        {
                            zmiana = dol_;
                            ala = dlu;
                            y = y + 1;
                            break;
                        }
                        else
                        {
                            if (x == MAXX || x > MAXX)
                            {
                                zmiana = lewa;
                                ala = dlu;
                                break;
                            }
                            else
                            {
                                if (x == 0 || x < 0)
                                {
                                    zmiana = prawa;
                                    ala = dlu;
                                    break;
                                }
                                else
                                {
                                    iscontinue = false;
                                }

                            }

                        }
                    }
                }

                Console.SetCursorPosition(x, y);
                Console.Write("|");
            }
            bool iscontinue3 = true;
            while (iscontinue3)
            {
                if (MAXY == y || y > MAXY)
                {
                    zmiana = gora;
                    y = y - 1;
                    break;
                }
                else
                {
                    if (y == 0 || y < 0)
                    {
                        zmiana = dol_;
                    }
                    else
                    {
                        if (x == MAXX || x > MAXX)
                        {
                            zmiana = lewa;
                        }
                        else
                        {
                            if (x == 0 || x < 0)
                            {
                                zmiana = prawa;
                            }
                            else
                            {
                                iscontinue3 = false;
                            }

                        }

                    }
                }
            }
            Console.SetCursorPosition(x, y);
            Console.Write("o");
            napisy(wy, wx, x, y);
            plansza_w(x, y, MAXX, MAXY);
        }
        public static void waz_lewa_prawa(int x,int y, int prawo, out int rx)
        {
            rx = x;
            if (zmiana == prawa)
            {
                x = x - dlu;      
                for (int ala = 0; ala <= dlu; ala++)
                {
                    x = x + 1;
                    bool iscontinue = true;
                    while (iscontinue)
                    {
                        if (MAXY == y || y > MAXY)
                        {
                            zmiana = gora;
                            ala = 1;
                            iscontinue = false;                            
                            break;
                        }
                        else
                        {
                            if (y == 0 || y < 0)
                            {
                                zmiana = dol_;
                                ala = dlu;
                                break;
                            }
                            else
                            {
                                if (x == MAXX || x > MAXX)
                                {
                                    zmiana = lewa;
                                    ala = 1;
                                    iscontinue = false;
                                    break;
                                }
                                else
                                {
                                    if (x == 0 || x < 0)
                                    {
                                        zmiana = prawa;
                                        ala = dlu;
                                        x = x + 1;
                                        break;
                                    }
                                    else
                                    {
                                        iscontinue = false;
                                    }

                                }

                            }
                        }
                    }
                    Console.SetCursorPosition(x,y);
                    Console.Write("-");                   
                }
                 bool iscontinue1 = true;
                while (iscontinue1)
                {
                    if (MAXY == y || y > MAXY)
                    {
                        zmiana = gora;
                    }
                    else
                    {
                        if (y == 0 || y < 0)
                        {
                            zmiana = dol_;
                        }
                        else
                        {
                            if (x == MAXX || x > MAXX)
                            {
                                zmiana = lewa;
                            }
                            else
                            {
                                if (x == 0 || x < 0)
                                {
                                    zmiana = prawa;
                                }
                                else
                                {
                                    iscontinue1 = false;
                                }

                            }

                        }
                    }
                }
                Console.SetCursorPosition(x, y);
                Console.Write("o");
                napisy(wy, wx, x, y);
                plansza_w(x, y, MAXX, MAXY);
            }
            if (zmiana == lewa)
            {
                Console.SetCursorPosition(x, y);
                Console.Write("o");
                for (int ala = 0; ala <= dlu; ala++)
                {
                    x = x + 1;
                    bool iscontinue = true;
                    while (iscontinue)
                    {
                        if (MAXY == y || y > MAXY)
                        {
                            zmiana = gora;
                            ala = dlu;
                            break;
                        }
                        else
                        {
                            if (y == 0 || y < 0)
                            {
                                zmiana = dol_;
                                ala = dlu;
                                break;
                            }
                            else
                            {
                                if (x == MAXX || x > MAXX)
                                {
                                    zmiana = lewa;
                                    ala = dlu;
                                    break;
                                }
                                else
                                {
                                    if (x == 0 || x < 0)
                                    {
                                        zmiana = prawa;
                                        ala = dlu;
                                        x = x + 1;
                                        break;
                                    }
                                    else
                                    {
                                        iscontinue = false;
                                    }

                                }

                            }
                        }
                    }
                    while (iscontinue)
                    {
                        if (MAXY == y || y > MAXY)
                        {
                            zmiana = gora;
                        }
                        else
                        {
                            if (y == 0 || y < 0)
                            {
                                zmiana = dol_;
                            }
                            else
                            {
                                if (x == MAXX || x > MAXX)
                                {
                                    zmiana = lewa;
                                }
                                else
                                {
                                    if (x == 0 || x < 0)
                                    {
                                        zmiana = prawa;
                                    }
                                    else
                                    {
                                        iscontinue = false;
                                    }

                                }

                            }
                        }
                    }
                    Console.SetCursorPosition(x, y);
                    Console.Write("-");
                }
                napisy(wy, wx, x, y);
                plansza_w(x, y, MAXX, MAXY);
            }
            }

    }
}

 
0

Nie zrozum mnie źle ale to wszystko jest do napisania od nowa. Kopiujesz niepotrzebnie kod gdzie sprawdzasz prawie identyczne warunki, czyścisz konsolę po każdym ruchu etc...
Tak naprawdę 3/4 kodu spokojnie można by stąd wyrzucić.

0

Pseudokod pewnie Cię nie zaskoczy:

if( aktualny.x == plansza.size ) orientacja = lewo
if( aktualny.x == 0 ) orientacja  = prawo
if( aktualny.y == plansza.size ) orientacja = dol
if( aktualny.y == 0 ) orientacja = gora.

Ciężko doczytać o co w tym kodzie chodzi prawdę mówiąc. :p

                         if (MAXY == y || y > MAXY)
                        {
                            zmiana = gora;
                        }
                        else
                        {
                            if (y == 0 || y < 0)
                            {
                                zmiana = dol_;
                            }
                            else
                            {
                                if (x == MAXX || x > MAXX)
                                {
                                    zmiana = lewa;
                                }
                                else
                                {
                                    if (x == 0 || x < 0)
                                    {
                                        zmiana = prawa;
                                    }
                                    else
                                    {
                                        iscontinue = false;
                                    }

                                }

                            }
                        }

Ten kod sprobuj zastąpić tym co napisałem. A jeśli chcesz, aby przenosił się na drugą stronę mapy (taki efekty mapy - kuli) to ostatnio zrobiłem coś takiego: https://github.com/mtszpater/Mikolaj-i-dzieciaki/blob/master/src/com/company/Point.java

spróbuj, moze Ci się przyda. :)

0

To jest trochę bez sensu. Napisałem w między czasie coś takiego i sugeruję Ci oprzeć się właśnie na tym:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Snake
{
    class Snake
    {
        static void Main(string[] args)
        {
            var posX = Console.WindowWidth;
            var posY = Console.WindowHeight;

            ConsoleKey key = ConsoleKey.RightArrow;
            while (key != ConsoleKey.Escape)
            {
                Console.SetCursorPosition(posX / 2, posY / 2);
                Console.Write('O');
                if (Console.KeyAvailable) key = Console.ReadKey(true).Key;
                switch (key)
                {
                    case ConsoleKey.RightArrow: { posX += 1; break; }
                    case ConsoleKey.LeftArrow: { posX -= 1; break; }
                    case ConsoleKey.UpArrow: { posY -= 1; break; }
                    case ConsoleKey.DownArrow: { posY += 1; break; }
                }
                Thread.Sleep(50);
            }
        }
    }
}

Jest prosto i przyjemnie. Użyj tego jako jądra swojej aplikacji i dokładaj ściany, kropki do zbierania etc...

0

Dziękuje wszystkim. Mój program aktualnie wygląda tak:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Waż
{
    class Program
    {
        public static int x = 2;
        public static int y = 1;
        public static int dlu = 1;
        public static int speed = 0;
        public static int dlugos = 300;
        public static int szybkosc = 200;
        public static int lewa = 4;
        public static int gora = 2;
        public static int dol_ = 1;
        public static int prawa = 3;
        public static string waz = "";
        public static int zmiana = 3;
        public static int minx = 0;
        public static int MAXX = 101;
        public static int miny = 0;
        public static int maxy = 55;
        public static TimeSpan rosnij;
        static void Main(string[] args)
        {

            Console.CursorVisible = false;
            int may = maxy + 5;
            int max = MAXX + 5;
            Console.SetBufferSize(max,may);
            start(x, y, waz);
        }
        public static void start(int x, int y, string waz)
        {
            DateTime start = DateTime.Now;
            DateTime stop = DateTime.Now;
            bool iscontinue = true;
            while (iscontinue)
            {

                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo Info = Console.ReadKey();
                    if (Info.Key == ConsoleKey.RightArrow)
                    {


                        waz = "-o";
                        zmiana = prawa;
                    }
                    if (Info.Key == ConsoleKey.DownArrow)
                    {

                        Program.zmiana = dol_;
                        waz = "o";
                    }
                    if (Info.Key == ConsoleKey.UpArrow)
                    {

                        Program.zmiana = gora;
                        waz = "o";
                    }
                    if (Info.Key == ConsoleKey.LeftArrow)
                    {
                        zmiana = lewa;

                        waz = "o-";
                    }
                }
                else
                {
                    if (zmiana == dol_)
                    {

                        waz = "o";
                        y = y + 1;
                    }
                    if (zmiana == gora)
                    {

                        waz = "o";
                        y = y - 1;
                    }
                    if (zmiana == prawa)
                    {
                        x = x + 1;
                        waz = "-o";
                    }
                    if (zmiana == lewa)
                    {
                        x = x - 1;
                        waz = "o-";
                    }
                }
                Console.Clear();
                rysuj(x, y, out x, out y);
                Thread.Sleep(szybkosc);
                stop = DateTime.Now;
                rosnij = stop - start;

                if (rosnij.Seconds >= 5)
                {
                    if (dlugos == 300)
                    {
                        dlu = dlu + 1;

                    }
                    //    dlugos = dlugos + 1;
                    speed = speed + 1;
                    start = stop;
                }
            }
        }
        public static void waz_lewa_prawa(int x, int y, out int rx)
        {

            rx = x;
            if (zmiana == prawa)
            {
                for (int ala = 0; ala <= dlu; ala++)
                {
                    x = x + 1;
                    sprawdzanie(x, y, minx, miny, MAXX, maxy);
                    Console.SetCursorPosition(x, y);
                    Console.Write("-");
                }
                sprawdzanie(x, y, minx, miny, MAXX, maxy);
                Console.SetCursorPosition(x, y);
                Console.Write("O");
            }
            if (zmiana == lewa)
            {
                for (int ala = 0; ala <= dlu; ala++)
                {
                    x = x - 1;
                    sprawdzanie(x, y, minx, miny, MAXX, maxy);
                    Console.SetCursorPosition(x, y);
                    Console.Write("-");
                }
                sprawdzanie(x, y, minx, miny, MAXX, maxy);
                Console.SetCursorPosition(x, y);
                Console.Write("O");
            }

        }
        public static void rysuj(int x, int y, out int rx, out int ry)
        {
            ry = 0;
            rx = 0;
            int MAXY = maxy;
            plansza(MAXX, maxy);
            for (int k = 0; k < MAXX; k++)
            {

                for (int l = 0; l < MAXY; l++)
                {
                    //x,y

                    if (k == x && l == y)
                    {
                        if (zmiana == dol_)
            {
                waz_dol(x, y, out y);
                rx = x;
                ry = y;
                return;
            }
            if (zmiana == gora)
            {
                waz_gora(x, y, out y);
                rx = x;
                ry = y;
                return;
            }
            if (zmiana == prawa || zmiana == lewa)
            {
                waz_lewa_prawa(x, y, out x);
                rx = x;
                ry = y;
                return;
            }
            break;
        }
    }
}
        }
        public static void waz_gora(int x, int y,out int ry)
        {
            ry = y;
            sprawdzanie(x, y, minx, miny, MAXX, maxy);
            Console.SetCursorPosition(x, y);
            Console.Write("O");
            for (int ala = 0; ala <= dlu; ala++)
            {
                y = y + 1;
                sprawdzanie(x, y, minx, miny, MAXX, maxy);
                Console.SetCursorPosition(x, y);
                Console.Write("|");
            }
        }
        public static void waz_dol(int x, int y, out int ry)
        {
            ry = y;
            for (int ala = 0; ala <= dlu; ala++)
            {
                sprawdzanie(x, y, minx, miny, MAXX, maxy);
                Console.SetCursorPosition(x, y);
                Console.Write("|");
                y = y + 1;
            }
            sprawdzanie(x, y, minx, miny, MAXX, maxy);
            Console.SetCursorPosition(x, y);
            Console.Write("O");
        }
        public static void sprawdzanie(int x, int y, int minx, int miny, int MAXX, int maxy)
        {
            if (minx == x || x < minx)
            {
                zmiana = prawa;
                Console.Clear();
                start(x, y, waz);
            }
            if (MAXX == x || x > MAXX)
            {
                zmiana = lewa;
                Console.Clear();
                start(x, y, waz);
            }
            if (miny == y || y < miny)
            {
                zmiana = dol_;
                Console.Clear();
                start(x, y, waz);
            }
            if (maxy == y || y > maxy)
            {
                zmiana = gora;
                start(x, y, waz);
            }
        }
        public static void plansza(int MAXX, int maxy)
        {
            int mx = MAXX;
            string dlugosc = SetChar(mx, "#");
            Console.SetCursorPosition(0, 0);
            Console.Write(dlugosc);
            for(int ilo=0; ilo<maxy; ilo++)
            {
                Console.SetCursorPosition(0, ilo);
                Console.Write("#");
                Console.SetCursorPosition(100,ilo);
                Console.Write("#");
            }
            Console.SetCursorPosition(0,maxy);
            Console.Write(dlugosc);
        }
        public static string SetChar(int k, string s)
        {
            string ret = "";
            for (int l = 0; l < k; l++)
                ret += s;
            return ret;
        }
    }
}
 

Nie działa tylko odbicie od dołu ale i to naprawie :)
Jeszcze raz dzięki :D

1

1.Dlaczego masz jedną zmienną, która się nazywa speed i drugą o nazwie dlugosc?
2.Dlaczego mieszasz polskie i angielskie nazewnictwo?
3.Dlaczego mieszasz PisanieWTakiSposob z pisaniem_w_taki_sposób oraz PISANIEMWTAKISPOSÓB?
4.Co robią funkcje sprawdzanie, SetChar, waz_dol, waz_gora i dlaczego nie wynika to z ich nazw, tylko trzeba się domyślać?
5.Dlaczego klamerki funkcji rysuj kończą się poza tą funkcją? (jak wynika z zastosowanych wcięć)
6.Dlaczego masz zmienne gora, _dol, lewo oraz prawo, zamiast wykorzystać enuma? (już nie pytam o to, z jakiego powodu przed dol znajduje się podkreślnik)

(...)

0
  • Dlaczego co każdy ruch węża odświeżasz okno konsoli, kiedy w innym miejscu programu korzystasz z SetCursorPosition?
  • Ten wąż się w ogóle skręca w całości zamiast łamać.
  • Po co w ogóle Ci tyle tych zmiennych i do tego statycznych? O_o
2

Tacy mądrzy? To naprawcie dół sami:

0

@MrDarkne: Bez obrazy ale to naprawdę należałoby napisać od nowa zamiast naprawiać. Dostałeś od nas dobre rady, kawałki działającego kodu i co? Przecież nikt tutaj przykrości nie chce Ci zrobić.

Zastosuj się po prostu do tych rad i choćbyś miał to napisać od nowa to i tak będziesz sto razy bardziej mądrzejszy niż teraz.

0

Zmienie ruch węża i zastosuje metodę kierunku pisania mam świetny pomysł

0

pozmieniałabym te if else na switch, aby nie tworzyć kodu spaghetti ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1