Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using System.Collections.Generic;
- using System.Threading;
- //Główna klasa reprezentująca cały program C#.
- public class Program
- {
- //Metoda Main, od której swoją pracę rozpoczyna program.
- public static void Main()
- {
- //utworzenie nowego obiektu planszy
- Board plansza = new Board();
- //Tworzy nowe okno wyboru, ale jeszcze go nie wyswietla
- ConsoleChoice wybor = new ConsoleChoice();
- wybor.AttachChoiceLine("pvp", "Gracz vs Gracz");
- wybor.AttachChoiceLine("pve", "Gracz vs Komputer");
- wybor.AttachChoiceLine("pvt", "Gracz vs Twoja Mama");
- //Wyświetla okno wybor i zwraca nazwę linio wybranej przez uzytkownika
- string userChoice = wybor.ShowChoice();
- Console.WriteLine("Wybrano opcję: " + userChoice);
- Player gracz1 = new HumanPlayer("Daniel", SquareSymbol.Circle);
- Console.WriteLine("Gracz wybrał pole: " + gracz1.TurnProceed());
- Player gracz2 = new ComputerPlayer("Komp hehe", SquareSymbol.Cross);
- Console.WriteLine("Pecet wybrał pole: " + gracz2.TurnProceed());
- plansza.SetSquareSymbol(SquareName.A1, SquareSymbol.Cross);
- plansza.SetSquareSymbol(SquareName.C3, SquareSymbol.Circle);
- Console.WriteLine(plansza);
- }
- }
- //Reprezentuje nazwy pól na planszy
- //do gry w kółko i krzyżyk (od A1 do C3).
- enum SquareName
- {
- A1, A2, A3, B1, B2, B3, C1, C2, C3
- }
- //Reprezentuje symbole, które mogą zostać umieszczone
- //na planszy do gry w kółko i krzyżyk (czyli kółko, krzyżyk lub puste miejsce).
- enum SquareSymbol
- {
- Cross = 'X', Circle = 'O', Empty = ' '
- }
- //Reprezentuje planszę do gry w kółko i krzyżyk.
- class Board
- {
- //Słownik przechowujący nazwy pól i przypisane do nich symbole.
- private Dictionary<SquareName, SquareSymbol> BoardSquares = new Dictionary<SquareName, SquareSymbol>();
- //Pobiera symbol, który znajduje się na planszy na polu o podanej nazwie.
- public SquareSymbol GetSquareSymbol(SquareName name)
- {
- return BoardSquares.Keys.Contains(name) ? BoardSquares[name] : SquareSymbol.Empty;
- }
- //Umożliwia ustawienie wskazanego symbolu na wskazanym polu na planszy.
- public void SetSquareSymbol(SquareName name, SquareSymbol symbol)
- {
- BoardSquares[name] = symbol;
- }
- //Metoda umożliwiająca konwersję obiektów typu Board do obiektu typu string.
- public override string ToString()
- {
- return
- " 1 2 3\n"+
- " +-+-+-+\n"+
- "A +"+(char) GetSquareSymbol(SquareName.A1)+" "+(char) GetSquareSymbol(SquareName.A2)+" "+(char) GetSquareSymbol(SquareName.A3)+"+\n"+
- " +-+-+-+\n"+
- "B +"+(char) GetSquareSymbol(SquareName.B1)+" "+(char) GetSquareSymbol(SquareName.B2)+" "+(char) GetSquareSymbol(SquareName.B3)+"+\n"+
- " +-+-+-+\n"+
- "C +"+(char) GetSquareSymbol(SquareName.C1)+" "+(char) GetSquareSymbol(SquareName.C2)+" "+(char) GetSquareSymbol(SquareName.C3)+"+\n"+
- " +-+-+-+\n";
- }
- }
- //Klasa ułatwiająca wyświetlanie menu wyboru w konsoli.
- public class ConsoleChoice
- {
- //Słownik przechowujący nazwy możliwych do wyboru linii dialogowych
- //i przypisane do nich opisy wyświetlane użytkownikowi.
- private Dictionary<string, string> Choices = new Dictionary<string, string>();
- //Dodaje nową linię wyboru
- //name - unikalna nazwa linii, jest ona zwracana, gdy użytkownik ją wybierze
- //description - opis linii wyboru wyświetlany użytkownikowi
- public void AttachChoiceLine(string name, string description)
- {
- Choices[name] = description;
- }
- //Pokazuje okno wyboru wygenerowane
- //na podstawie dolaczonych linii wyboru.
- //Jeżeli nie dołączono żadnych linii, zwraca pusty string.
- //W przeciwnym razie zwraca nazwę (klucz) linii wybranej przez użytkownika.
- public string ShowChoice()
- {
- if(Choices.Count == 0)
- return string.Empty;
- for(int i = 1; i <= Choices.Count; i++)
- {
- Console.WriteLine("["+i+"] " + Choices.Values.ElementAt(i-1));
- }
- int userChoice = 0;
- do
- {
- Console.Write(">");
- if(! int.TryParse(Console.ReadLine(), out userChoice))
- continue;
- } while(userChoice < 1 || userChoice > Choices.Count);
- return Choices.Keys.ElementAt(userChoice - 1);
- }
- }
- //Klasa abstrakcyjna reprezentująca dowolnego (komputerowego lub żywego) gracza.
- abstract class Player
- {
- //Zajęte pola, na których nie można już zmienić znaku.
- public HashSet<SquareName> ExistingSquareNames {get; private set;}
- //Symbol, którego używa ten gracz (kółko lub krzyżyk).
- public SquareSymbol PlayerSymbol {get; private set;}
- //Nazwa tego gracza wyświetlana podczas gry.
- public string PlayerName {get; private set;}
- //Tworzy nowy obiekt gracza.
- //name - nazwa tego gracza
- //symbol - symbol, jakiego będzie używał gracz
- public Player(string name, SquareSymbol symbol)
- {
- ExistingSquareNames = new HashSet<SquareName>();
- PlayerName = name;
- PlayerSymbol = symbol;
- }
- //Wykonuje turę tego gracza i zwraca symbol, który wybrał (kółko lub krzyżyk).
- //Ważne, że
- public abstract SquareName TurnProceed();
- }
- //Reprezentuje żywego, ludzkiego gracza.
- class HumanPlayer : Player
- {
- //Tworzy nowy obiekt klasy HumanPlayer na podstawie nazwy gracza i jego symbolu.
- public HumanPlayer(string name, SquareSymbol symbol) : base(name, symbol){}
- //Umożliwia użytkownikowi wybór jeszcze nie zajętego pola i zwraca nazwę tego pola.
- public override SquareName TurnProceed()
- {
- if(ExistingSquareNames.Count >= 9)
- throw new InvalidOperationException("Wszystkie pola na planszy są już zajęte.");
- Console.WriteLine("Tura gracza: " + PlayerName + "\n");
- Console.WriteLine("Możesz umieścić '" + (char) PlayerSymbol + "' na następujących polach:");
- ConsoleChoice squareChoice = new ConsoleChoice();
- //pobiera nazwy plansz, na których jeszcze nie umieszczono znaku
- SquareName[] possibleSquares = Enum.GetValues(typeof(SquareName)).Cast<SquareName>().Where(square => ! ExistingSquareNames.Contains(square)).ToArray();
- foreach(SquareName squareName in possibleSquares)
- {
- squareChoice.AttachChoiceLine(squareName.ToString(), "Pole " + squareName.ToString());
- }
- SquareName userChoice;
- Enum.TryParse(squareChoice.ShowChoice(), out userChoice);
- return userChoice;
- }
- }
- //Reprezentuje gracza komputerowego, zwracającego losowe wartości.
- class ComputerPlayer : Player
- {
- public ComputerPlayer(string name, SquareSymbol symbol) : base(name, symbol){}
- public override SquareName TurnProceed()
- {
- if(ExistingSquareNames.Count >= 9)
- throw new InvalidOperationException("Wszystkie pola na planszy są już zajęte.");
- Console.Write("Tura komputera, proszę czekać");
- ConsoleWaiter.Wait(3);
- return SquareName.A1;
- }
- }
- //Umożliwia zapauzowanie programu konsolowego na określony czas.
- //Po każdej minionej połowie sekundy wyświetla w konsoli kropkę.
- static class ConsoleWaiter
- {
- //Czeka podaną liczbę ticków, po każdym ticku wyświetlając kropkę.
- //1 tick - 0.5 sekundy
- public static void Wait(int ticks)
- {
- for(int i = 0; i < ticks; i++)
- {
- Console.Write(".");
- Thread.Sleep(500);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement