Advertisement
csaki

Wumpus

Apr 16th, 2015
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.77 KB | None | 0 0
  1. // A főprogram:
  2. class Program
  3.     {
  4.         static void Main(string[] args)
  5.         {
  6.             Palya palya = new Palya(Nehezseg.Konnyu);
  7.             palya.Init();
  8.             palya.Start();
  9.             Console.ReadLine();
  10.         }
  11.     }
  12.  
  13.  
  14. // A pálya osztálya:
  15. namespace Wumpus
  16. {
  17.     class Palya
  18.     {
  19.         private Tipus[,] _palya;
  20.         private bool _inicializalva;
  21.         private Pozicio _jatekos = new Pozicio(0, 0);
  22.         private int _nyilak;
  23.         private Nehezseg _nehezseg;
  24.         private Random rand = new Random();
  25.  
  26.         public Palya(Nehezseg nehezseg)
  27.         {
  28.             _nehezseg = nehezseg;
  29.         }
  30.  
  31.         public void Init()
  32.         {
  33.             if (_nehezseg == Nehezseg.Egyeni) throw new Exception("Egyéni pálya inicializálásához hívd az InitEgyeniPalya metódust.");
  34.  
  35.             switch (_nehezseg)
  36.             {
  37.                 case Nehezseg.Konnyu:
  38.                     InitKonnyuPalya();
  39.                     break;
  40.                 case Nehezseg.Kozepes:
  41.                     InitKozepesPalya();
  42.                     break;
  43.                 case Nehezseg.Nehez:
  44.                     InitNehezPalya();
  45.                     break;
  46.             }
  47.             _inicializalva = true;
  48.         }
  49.  
  50.         public void Start()
  51.         {
  52.             if (!_inicializalva) throw new Exception("A pálya nincs inicializálva!");
  53.  
  54.             Console.WriteLine("Új játék indult! A választott nehézség: " + _nehezseg);
  55.             while (true)
  56.             {
  57.                 switch (_palya[_jatekos.X, _jatekos.Y])
  58.                 {
  59.                     case Tipus.Jatekos:
  60.                         break;
  61.                     case Tipus.Wumpus:
  62.                         Console.WriteLine("JÁTÉK VÉGE! Felfalt a Wumpus!");
  63.                         return;
  64.                     case Tipus.Verem:
  65.                         Console.WriteLine("JÁTÉK VÉGE! Beleestél egy verembe!");
  66.                         return;
  67.                     case Tipus.SekelyVerem:
  68.                         Console.WriteLine("Egy másik pályán találod magad!");
  69.                         if (_nehezseg == Nehezseg.Egyeni)
  70.                         {
  71.                             // TODO: Egyéni pályák dolgait eltárolni!
  72.                             InitEgyeniPalya(_palya.GetLength(0), 0, 0, 0, 0, 0);
  73.                             Start();
  74.                             return;
  75.                         }
  76.                         Init();
  77.                         Start();
  78.                         return;
  79.                     case Tipus.Denever:
  80.                         Console.WriteLine("Egy denevért találtál! Elteleportálódál máshová!");
  81.                         MezoErtekad(1, Tipus.Jatekos);
  82.                         break;
  83.                     case Tipus.TuleloCsomag:
  84.                         Console.WriteLine("Találtál egy túlélő csomagot! Kapsz két plusz nyilat!");
  85.                         _nyilak += 2;
  86.                         break;
  87.                 }
  88.  
  89.                 if (_nyilak == 0)
  90.                 {
  91.                     Console.WriteLine("JÁTÉK VÉGE! Kifogytál a nyilakból!");
  92.                     return;
  93.                 }
  94.                 _palya[_jatekos.X, _jatekos.Y] = Tipus.Jatekos;
  95.  
  96.                 Console.WriteLine("Jelenlegi pozíciód: ({0}, {1})", _jatekos.X, _jatekos.Y);
  97.                 Console.WriteLine("Jelenleg ennyi nyilad van: " + _nyilak);
  98.                 Console.WriteLine("Amit érzel: " + Eszleles());
  99.                 ConsoleKeyInfo input;
  100.                 do
  101.                 {
  102.                     Console.WriteLine("Mit teszel? Lépsz, vagy nyilazol valamelyik irányba?");
  103.                     Console.WriteLine("Üsd le az 'L' betűt a lépéshez vagy az 'N' betűt a nyilazáshoz.");
  104.                     input = Console.ReadKey(false);
  105.                     if (input.Key != ConsoleKey.L && input.Key != ConsoleKey.N)
  106.                     {
  107.                         Console.WriteLine("Kérlek, az L vagy az N billentyűk valamelyikét üsd le.");
  108.                     }
  109.                 } while (input.Key != ConsoleKey.L && input.Key != ConsoleKey.N);
  110.  
  111.                 if (input.Key == ConsoleKey.L) // Lép a játékos
  112.                 {
  113.                     while (true)
  114.                     {
  115.                         Console.WriteLine("Melyik irányba szeretnél lépni?");
  116.                         Console.WriteLine("A nyíl billentyűkkel választhatsz irányt.");
  117.                         input = Console.ReadKey(false);
  118.                         if (input.Key != ConsoleKey.RightArrow
  119.                             && input.Key != ConsoleKey.LeftArrow
  120.                             && input.Key != ConsoleKey.UpArrow
  121.                             && input.Key != ConsoleKey.DownArrow)
  122.                         {
  123.                             Console.WriteLine("Kérlek, a nyíl billentyűk valamelyikét üsd le.");
  124.                             continue;
  125.                         }
  126.                        
  127.                         if (input.Key == ConsoleKey.RightArrow  // jobbrát nyomott
  128.                             && _jatekos.Y == _palya.GetLength(0) - 1 // de a jobb szélen van
  129.                             ||
  130.                             input.Key == ConsoleKey.LeftArrow // balrát nyomott
  131.                             && _jatekos.Y == 0 // de a bal szélen van
  132.                             ||
  133.                             input.Key == ConsoleKey.UpArrow // felfelét nyomott
  134.                             && _jatekos.X == 0 // de a felső sorban van
  135.                             ||
  136.                             input.Key == ConsoleKey.DownArrow // lefelét nyomott
  137.                             && _jatekos.X == _palya.GetLength(0) - 1) // de az alsó sorban van
  138.                         {
  139.                             Console.WriteLine("Ebbe az irányba nem léphetsz, mert szélen vagy, kérlek próbáld újra!");
  140.                             continue;
  141.                         }
  142.                         break;
  143.                     }
  144.  
  145.                     // Léphet!
  146.                     Pozicio temp2 = _jatekos.Clone();
  147.                     if (input.Key == ConsoleKey.RightArrow) _jatekos.Y++;
  148.                     else if (input.Key == ConsoleKey.LeftArrow) _jatekos.Y--;
  149.                     else if (input.Key == ConsoleKey.UpArrow) _jatekos.X--;
  150.                     else _jatekos.X++;
  151.  
  152.                     _palya[temp2.X, temp2.Y] = Tipus.Ures;
  153.                 }
  154.                 else // Nyilazik a játékos
  155.                 {
  156.                     while (true)
  157.                     {
  158.                         Console.WriteLine("Melyik irányba szeretnél nyilazni?");
  159.                         Console.WriteLine("A nyíl billentyűkkel választhatsz irányt.");
  160.                         input = Console.ReadKey();
  161.                         if (input.Key != ConsoleKey.RightArrow
  162.                             && input.Key != ConsoleKey.LeftArrow
  163.                             && input.Key != ConsoleKey.UpArrow
  164.                             && input.Key != ConsoleKey.DownArrow)
  165.                         {
  166.                             Console.WriteLine("Kérlek, a nyíl billentyűk valamelyikét üsd le.");
  167.                             continue;
  168.                         }
  169.                         if (input.Key == ConsoleKey.RightArrow  // jobbrát nyomott
  170.                             && _jatekos.Y == _palya.GetLength(0) - 1 // de a jobb szélen van
  171.                             ||
  172.                             input.Key == ConsoleKey.LeftArrow // balrát nyomott
  173.                             && _jatekos.Y == 0 // de a bal szélen van
  174.                             ||
  175.                             input.Key == ConsoleKey.UpArrow // felfelét nyomott
  176.                             && _jatekos.X == 0 // de a felső sorban van
  177.                             ||
  178.                             input.Key == ConsoleKey.DownArrow // lefelét nyomott
  179.                             && _jatekos.X == _palya.GetLength(0) - 1) // de az alsó sorban van
  180.                         {
  181.                             Console.WriteLine("Ebbe az irányba nem nyilazhatsz, mert szélen vagy, kérlek próbáld újra!");
  182.                             continue;
  183.                         }
  184.                         break;
  185.                     }
  186.  
  187.                     _nyilak--;
  188.                     bool meghaltWumpus;
  189.                     if (input.Key == ConsoleKey.RightArrow)
  190.                         meghaltWumpus = _palya[_jatekos.X, _jatekos.Y + 1] == Tipus.Wumpus;
  191.                     else if (input.Key == ConsoleKey.LeftArrow)
  192.                         meghaltWumpus = _palya[_jatekos.X, _jatekos.Y - 1] == Tipus.Wumpus;
  193.                     else if (input.Key == ConsoleKey.UpArrow)
  194.                         meghaltWumpus = _palya[_jatekos.X - 1, _jatekos.Y] == Tipus.Wumpus;
  195.                     else meghaltWumpus = _palya[_jatekos.X + 1, _jatekos.Y] == Tipus.Wumpus;
  196.                    
  197.                     if (meghaltWumpus)
  198.                     {
  199.                         Console.WriteLine("SIKER! Megölted Wumpust! Ennyi nyilad maradt: " + _nyilak);
  200.                         return;
  201.                     }
  202.                 }
  203.                 Trace.WriteLine(ToString());
  204.             }
  205.         }
  206.  
  207.         private string Eszleles()
  208.         {
  209.             StringBuilder sb = new StringBuilder();
  210.             bool wumpus = false;
  211.             bool verem = false;
  212.             bool denever = false;
  213.             Tipus[,] kornyezoMezok = KornyezoMezok(_jatekos);
  214.             foreach (Tipus mezo in kornyezoMezok)
  215.             {
  216.                 if (mezo == Tipus.Tiltott || mezo == Tipus.Jatekos)
  217.                     continue;
  218.                 if (mezo == Tipus.Wumpus)
  219.                     wumpus = true;
  220.                 else if (mezo == Tipus.Verem || mezo == Tipus.SekelyVerem)
  221.                     verem = true;
  222.                 else if (mezo == Tipus.Denever)
  223.                     denever = true;
  224.             }
  225.             if (!wumpus && !verem && !denever) return "Semmit.";
  226.  
  227.             if (wumpus) sb.Append("\n- büdöset");
  228.             if (verem) sb.Append("\n- szelet");
  229.             if (denever) sb.Append("\n- zaj");
  230.  
  231.             return sb.ToString();
  232.         }
  233.  
  234.         public Tipus[,] KornyezoMezok(Pozicio playerPozicio)
  235.         {
  236.             Tipus[,] mezok = new Tipus[3, 3];
  237.             mezok[1, 1] = Tipus.Jatekos; // A játékos relatív helyzete
  238.  
  239.             // Felső három
  240.             if (playerPozicio.X != 0) // Nem az első sorban van a játékos
  241.             {
  242.                 if (playerPozicio.Y != 0) // és nem az első oszlopban
  243.                     mezok[0, 0] = _palya[playerPozicio.X - 1, playerPozicio.Y - 1];
  244.                 else // viszont az első oszlopban van
  245.                     mezok[0, 0] = Tipus.Tiltott;
  246.  
  247.                 mezok[0, 1] = _palya[playerPozicio.X - 1, playerPozicio.Y];
  248.  
  249.                 if (playerPozicio.Y != _palya.GetLength(0) - 1) // Az utolsó oszlopban van a játékos
  250.                     mezok[0, 2] = _palya[playerPozicio.X - 1, playerPozicio.Y + 1];
  251.                 else
  252.                     mezok[0, 2] = Tipus.Tiltott;
  253.             }
  254.             else // Az első sorban van a játékos
  255.             {
  256.                 mezok[0, 0] = Tipus.Tiltott;
  257.                 mezok[0, 1] = Tipus.Tiltott;
  258.                 mezok[0, 2] = Tipus.Tiltott;
  259.             }
  260.  
  261.  
  262.             // Középső három
  263.             if (playerPozicio.Y != 0) // Nem az első oszlopban van a játékos
  264.                 mezok[1, 0] = _palya[playerPozicio.X, playerPozicio.Y - 1];
  265.             else // Az első oszlopban van a játékos
  266.                 mezok[1, 0] = Tipus.Tiltott;
  267.  
  268.             if (playerPozicio.Y != _palya.GetLength(0) - 1) // Nem az utolsó oszlopban van a játékos
  269.                 mezok[1, 2] = _palya[playerPozicio.X, playerPozicio.Y + 1];
  270.             else // Az utolsó oszlopban van a játékos
  271.                 mezok[1, 2] = Tipus.Tiltott;
  272.  
  273.  
  274.             // Alsó három
  275.             if (playerPozicio.X != _palya.GetLength(0) - 1) // Nem az utolsó sorban van a játékos
  276.             {
  277.                 if (playerPozicio.Y != 0) // és nem is az első oszlopban
  278.                     mezok[2, 0] = _palya[playerPozicio.X + 1, playerPozicio.Y - 1];
  279.                 else // viszont az első oszlopban
  280.                     mezok[2, 0] = Tipus.Tiltott;
  281.  
  282.                 mezok[2, 1] = _palya[playerPozicio.X + 1, playerPozicio.Y];
  283.  
  284.                 if (playerPozicio.Y != _palya.GetLength(0) - 1) // Nem az utolsó oszlopban van
  285.                     mezok[2, 2] = _palya[playerPozicio.X + 1, playerPozicio.Y + 1];
  286.                 else // Az utolsó oszlopban van
  287.                     mezok[2, 2] = Tipus.Tiltott;
  288.             }
  289.             else // Az utolsó sorban van a játékos
  290.             {
  291.                 mezok[2, 0] = Tipus.Tiltott;
  292.                 mezok[2, 1] = Tipus.Tiltott;
  293.                 mezok[2, 2] = Tipus.Tiltott;
  294.             }
  295.  
  296.             return mezok;
  297.         }
  298.  
  299.         public void InitEgyeniPalya(int meret, int nyilak, int tuleloCsomagokSzama, int wumpusokSzama, int vermekSzama, int deneverekSzama)
  300.         {
  301.             if (_nehezseg != Nehezseg.Egyeni) throw new Exception("Nem egyéni pálya inicializálásához hívd az Init metódust.");
  302.  
  303.             _palya = FeltoltUresMezokkel(meret);
  304.             _palya[0, 0] = Tipus.Jatekos;
  305.             _nyilak = nyilak;
  306.             WumpusokElhelyezese(wumpusokSzama);
  307.             TuleloCsomagElhelyezese(tuleloCsomagokSzama);
  308.             VermekElhelyezese(vermekSzama);
  309.             DeneverekElhelyezese(deneverekSzama);
  310.             _inicializalva = true;
  311.         }
  312.  
  313.         private Tipus[,] FeltoltUresMezokkel(int meret)
  314.         {
  315.             Tipus[,] p = new Tipus[meret, meret];
  316.             for (int i = 0; i < meret; i++)
  317.             {
  318.                 for (int j = 0; j < meret; j++)
  319.                 {
  320.                     p[i, j] = Tipus.Ures;
  321.                 }
  322.             }
  323.             return p;
  324.         }
  325.  
  326.         private void InitKonnyuPalya()
  327.         {
  328.             _palya = FeltoltUresMezokkel(5);
  329.             _palya[0, 0] = Tipus.Jatekos;
  330.             _nyilak = 3;
  331.             WumpusokElhelyezese(1);
  332.             VermekElhelyezese(5);
  333.             DeneverekElhelyezese(2);
  334.             TuleloCsomagElhelyezese(1);
  335.         }
  336.  
  337.         private void InitKozepesPalya()
  338.         {
  339.             _palya = FeltoltUresMezokkel(8);
  340.             _palya[0, 0] = Tipus.Jatekos;
  341.             _nyilak = 2;
  342.             WumpusokElhelyezese(1);
  343.             VermekElhelyezese(8);
  344.             DeneverekElhelyezese(5);
  345.             TuleloCsomagElhelyezese(1);
  346.         }
  347.  
  348.         private void InitNehezPalya()
  349.         {
  350.             _palya = FeltoltUresMezokkel(10);
  351.             _palya[0, 0] = Tipus.Jatekos;
  352.             _nyilak = 1;
  353.             WumpusokElhelyezese(1);
  354.             VermekElhelyezese(12);
  355.             DeneverekElhelyezese(8);
  356.             TuleloCsomagElhelyezese(1);
  357.         }
  358.  
  359.         private void DeneverekElhelyezese(int deneverekSzama)
  360.         {
  361.             MezoErtekad(deneverekSzama, Tipus.Denever);
  362.         }
  363.  
  364.         private void WumpusokElhelyezese(int wumpusokSzama)
  365.         {
  366.             MezoErtekad(wumpusokSzama, Tipus.Wumpus);
  367.         }
  368.  
  369.         private void VermekElhelyezese(int vermekSzama)
  370.         {
  371.             for (int i = 0; i < vermekSzama; i++)
  372.             {
  373.                 while (true)
  374.                 {
  375.                     int x = rand.Next(1, _palya.GetLength(0));
  376.                     int y = rand.Next(1, _palya.GetLength(0));
  377.                     if (_palya[x, y] == 0)
  378.                     {
  379.                         _palya[x, y] = rand.NextDouble() >= 0.75 ? Tipus.SekelyVerem : Tipus.Verem;
  380.                         break;
  381.                     }
  382.                 }
  383.             }
  384.         }
  385.  
  386.         private void TuleloCsomagElhelyezese(int csomagSzama)
  387.         {
  388.             MezoErtekad(csomagSzama, Tipus.TuleloCsomag);
  389.         }
  390.  
  391.         private void MezoErtekad(int hanyszor, Tipus ertek)
  392.         {
  393.             for (int i = 0; i < hanyszor; i++)
  394.             {
  395.                 while (true)
  396.                 {
  397.                     int x = rand.Next(1, _palya.GetLength(0));
  398.                     int y = rand.Next(1, _palya.GetLength(0));
  399.                     if (_palya[x, y] == 0)
  400.                     {
  401.                         _palya[x, y] = ertek;
  402.                         break;
  403.                     }
  404.                 }
  405.             }
  406.         }
  407.  
  408.         public override string ToString()
  409.         {
  410.             StringBuilder sb = new StringBuilder();
  411.             for (int i = 0; i < _palya.GetLength(0); i++)
  412.             {
  413.                 for (int j = 0; j < _palya.GetLength(1); j++)
  414.                 {
  415.                     sb.Append((int)_palya[i, j]);
  416.                 }
  417.                 sb.Append("\n");
  418.             }
  419.             return sb.ToString();
  420.         }
  421.     }
  422. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement