Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.57 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using System.Threading;
  5.  
  6. //Główna klasa reprezentująca cały program C#.
  7. public class Program
  8. {
  9.     //Metoda Main, od której swoją pracę rozpoczyna program.
  10.     public static void Main()
  11.     {
  12.         //utworzenie nowego obiektu planszy
  13.         Board plansza = new Board();
  14.        
  15.         //Tworzy nowe okno wyboru, ale jeszcze go nie wyswietla
  16.         ConsoleChoice wybor = new ConsoleChoice();
  17.         wybor.AttachChoiceLine("pvp", "Gracz vs Gracz");
  18.         wybor.AttachChoiceLine("pve", "Gracz vs Komputer");
  19.         wybor.AttachChoiceLine("pvt", "Gracz vs Twoja Mama");
  20.        
  21.         //Wyświetla okno wybor i zwraca nazwę linio wybranej przez uzytkownika
  22.         string userChoice = wybor.ShowChoice();
  23.         Console.WriteLine("Wybrano opcję: " + userChoice);
  24.        
  25.         Player gracz1 = new HumanPlayer("Daniel", SquareSymbol.Circle);
  26.         Console.WriteLine("Gracz wybrał pole: " + gracz1.TurnProceed());
  27.        
  28.         Player gracz2 = new ComputerPlayer("Komp hehe", SquareSymbol.Cross);
  29.         Console.WriteLine("Pecet wybrał pole: " + gracz2.TurnProceed());
  30.        
  31.         plansza.SetSquareSymbol(SquareName.A1, SquareSymbol.Cross);
  32.         plansza.SetSquareSymbol(SquareName.C3, SquareSymbol.Circle);
  33.        
  34.         Console.WriteLine(plansza);
  35.     }
  36. }
  37.  
  38. //Reprezentuje nazwy pól na planszy
  39. //do gry w kółko i krzyżyk (od A1 do C3).
  40. enum SquareName
  41. {
  42.     A1, A2, A3, B1, B2, B3, C1, C2, C3
  43. }
  44.  
  45. //Reprezentuje symbole, które mogą zostać umieszczone
  46. //na planszy do gry w kółko i krzyżyk (czyli kółko, krzyżyk lub puste miejsce).
  47. enum SquareSymbol
  48. {
  49.     Cross = 'X', Circle = 'O', Empty = ' '
  50. }
  51.  
  52. //Reprezentuje planszę do gry w kółko i krzyżyk.
  53. class Board
  54. {
  55.     //Słownik przechowujący nazwy pól i przypisane do nich symbole.
  56.     private Dictionary<SquareName, SquareSymbol> BoardSquares = new Dictionary<SquareName, SquareSymbol>();
  57.    
  58.     //Pobiera symbol, który znajduje się na planszy na polu o podanej nazwie.
  59.     public SquareSymbol GetSquareSymbol(SquareName name)
  60.     {
  61.         return BoardSquares.Keys.Contains(name) ? BoardSquares[name] : SquareSymbol.Empty;
  62.     }
  63.    
  64.     //Umożliwia ustawienie wskazanego symbolu na wskazanym polu na planszy.
  65.     public void SetSquareSymbol(SquareName name, SquareSymbol symbol)
  66.     {
  67.         BoardSquares[name] = symbol;
  68.     }
  69.    
  70.     //Metoda umożliwiająca konwersję obiektów typu Board do obiektu typu string.
  71.     public override string ToString()
  72.     {
  73.         return
  74.         "   1 2 3\n"+
  75.         "  +-+-+-+\n"+
  76.         "A +"+(char) GetSquareSymbol(SquareName.A1)+" "+(char) GetSquareSymbol(SquareName.A2)+" "+(char) GetSquareSymbol(SquareName.A3)+"+\n"+
  77.         "  +-+-+-+\n"+
  78.         "B +"+(char) GetSquareSymbol(SquareName.B1)+" "+(char) GetSquareSymbol(SquareName.B2)+" "+(char) GetSquareSymbol(SquareName.B3)+"+\n"+
  79.         "  +-+-+-+\n"+
  80.         "C +"+(char) GetSquareSymbol(SquareName.C1)+" "+(char) GetSquareSymbol(SquareName.C2)+" "+(char) GetSquareSymbol(SquareName.C3)+"+\n"+
  81.         "  +-+-+-+\n";
  82.     }
  83. }
  84.  
  85. //Klasa ułatwiająca wyświetlanie menu wyboru w konsoli.
  86. public class ConsoleChoice
  87. {
  88.     //Słownik przechowujący nazwy możliwych do wyboru linii dialogowych
  89.     //i przypisane do nich opisy wyświetlane użytkownikowi.
  90.     private Dictionary<string, string> Choices = new Dictionary<string, string>();
  91.    
  92.     //Dodaje nową linię wyboru
  93.     //name - unikalna nazwa linii, jest ona zwracana, gdy użytkownik ją wybierze
  94.     //description - opis linii wyboru wyświetlany użytkownikowi
  95.     public void AttachChoiceLine(string name, string description)
  96.     {
  97.         Choices[name] = description;
  98.     }
  99.    
  100.     //Pokazuje okno wyboru wygenerowane
  101.     //na podstawie dolaczonych linii wyboru.
  102.     //Jeżeli nie dołączono żadnych linii, zwraca pusty string.
  103.     //W przeciwnym razie zwraca nazwę (klucz) linii wybranej przez użytkownika.
  104.     public string ShowChoice()
  105.     {
  106.         if(Choices.Count == 0)
  107.             return string.Empty;  
  108.        
  109.         for(int i = 1; i <= Choices.Count; i++)
  110.         {
  111.             Console.WriteLine("["+i+"] " + Choices.Values.ElementAt(i-1));
  112.         }
  113.         int userChoice = 0;
  114.         do
  115.         {
  116.             Console.Write(">");
  117.             if(! int.TryParse(Console.ReadLine(), out userChoice))
  118.                 continue;
  119.         } while(userChoice < 1 || userChoice > Choices.Count);
  120.         return Choices.Keys.ElementAt(userChoice - 1);
  121.     }
  122. }
  123.  
  124. //Klasa abstrakcyjna reprezentująca dowolnego (komputerowego lub żywego) gracza.
  125. abstract class Player
  126. {
  127.     //Zajęte pola, na których nie można już zmienić znaku.
  128.     public HashSet<SquareName> ExistingSquareNames {get; private set;}
  129.    
  130.     //Symbol, którego używa ten gracz (kółko lub krzyżyk).
  131.     public SquareSymbol PlayerSymbol {get; private set;}
  132.    
  133.     //Nazwa tego gracza wyświetlana podczas gry.
  134.     public string PlayerName {get; private set;}
  135.    
  136.     //Tworzy nowy obiekt gracza.
  137.     //name - nazwa tego gracza
  138.     //symbol - symbol, jakiego będzie używał gracz
  139.     public Player(string name, SquareSymbol symbol)
  140.     {
  141.         ExistingSquareNames = new HashSet<SquareName>();
  142.         PlayerName = name;
  143.         PlayerSymbol = symbol;
  144.     }
  145.    
  146.     //Wykonuje turę tego gracza i zwraca symbol, który wybrał (kółko lub krzyżyk).
  147.     //Ważne, że
  148.     public abstract SquareName TurnProceed();
  149. }
  150.  
  151. //Reprezentuje żywego, ludzkiego gracza.
  152. class HumanPlayer : Player
  153. {
  154.     //Tworzy nowy obiekt klasy HumanPlayer na podstawie nazwy gracza i jego symbolu.
  155.     public HumanPlayer(string name, SquareSymbol symbol) : base(name, symbol){}
  156.    
  157.     //Umożliwia użytkownikowi wybór jeszcze nie zajętego pola i zwraca nazwę tego pola.
  158.     public override SquareName TurnProceed()
  159.     {
  160.         if(ExistingSquareNames.Count >= 9)
  161.             throw new InvalidOperationException("Wszystkie pola na planszy są już zajęte.");
  162.        
  163.         Console.WriteLine("Tura gracza: " + PlayerName + "\n");
  164.         Console.WriteLine("Możesz umieścić '" + (char) PlayerSymbol + "' na następujących polach:");
  165.        
  166.         ConsoleChoice squareChoice = new ConsoleChoice();
  167.        
  168.         //pobiera nazwy plansz, na których jeszcze nie umieszczono znaku
  169.         SquareName[] possibleSquares = Enum.GetValues(typeof(SquareName)).Cast<SquareName>().Where(square => ! ExistingSquareNames.Contains(square)).ToArray();
  170.        
  171.         foreach(SquareName squareName in possibleSquares)
  172.         {
  173.             squareChoice.AttachChoiceLine(squareName.ToString(), "Pole " + squareName.ToString());
  174.         }
  175.        
  176.         SquareName userChoice;
  177.         Enum.TryParse(squareChoice.ShowChoice(), out userChoice);
  178.        
  179.         return userChoice;
  180.     }
  181. }
  182.  
  183. //Reprezentuje gracza komputerowego, zwracającego losowe wartości.
  184. class ComputerPlayer : Player
  185. {
  186.     public ComputerPlayer(string name, SquareSymbol symbol) : base(name, symbol){}
  187.    
  188.     public override SquareName TurnProceed()
  189.     {
  190.         if(ExistingSquareNames.Count >= 9)
  191.             throw new InvalidOperationException("Wszystkie pola na planszy są już zajęte.");
  192.            
  193.         Console.Write("Tura komputera, proszę czekać");
  194.         ConsoleWaiter.Wait(3);
  195.    
  196.         return SquareName.A1;
  197.     }
  198. }
  199.  
  200. //Umożliwia zapauzowanie programu konsolowego na określony czas.
  201. //Po każdej minionej połowie sekundy wyświetla w konsoli kropkę.
  202. static class ConsoleWaiter
  203. {
  204.     //Czeka podaną liczbę ticków, po każdym ticku wyświetlając kropkę.
  205.     //1 tick - 0.5 sekundy
  206.     public static void Wait(int ticks)
  207.     {
  208.         for(int i = 0; i < ticks; i++)
  209.         {
  210.             Console.Write(".");
  211.             Thread.Sleep(500);
  212.         }
  213.     }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement