Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- sing System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Resources;
- using System.Windows.Shapes;
- using System;
- using System.IO;
- using System.Windows;
- using Microsoft.Win32;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Media;
- namespace CheckersBoard
- {
- [Serializable]
- class Elems
- {
- public int r, c;
- public string color;
- public Elems(int r, int c,string color) { this.r = r; this.c = c; this.color = color; }
- }
- /// <summary>
- /// Interaction logic for MainWindow.xaml
- /// </summary>
- [Serializable()]
- public partial class MainWindow : Window
- {
- private Move currentMove;
- private String winner;
- private String turn;
- public MainWindow()
- {
- InitializeComponent();
- this.Title = "Checkers! Blacks turn!";
- currentMove = null;
- winner = null;
- turn = "Black";
- MakeBoard();
- }
- private void ClearBoard()
- {
- for (int r = 1; r < 9; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, r, c);
- CheckersGrid.Children.Remove(stackPanel);
- }
- }
- }
- //заповнення дошки білими і чорними клітинками
- private void MakeBoard()
- {
- for (int r = 1; r < 9; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- StackPanel stackPanel = new StackPanel();
- if (r % 2 == 1)
- {
- if (c % 2 == 0)
- stackPanel.Background = Brushes.White;
- else
- stackPanel.Background = Brushes.Black;
- }
- else
- {
- if (c % 2 == 0)
- stackPanel.Background = Brushes.Black;
- else
- stackPanel.Background = Brushes.White;
- }
- Grid.SetRow(stackPanel, r);
- Grid.SetColumn(stackPanel, c);
- CheckersGrid.Children.Add(stackPanel);
- }
- }
- // MakeButtons();
- }
- private void MakeButtons()
- {
- for (int r = 1; r < 9; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, r, c);
- Button button = new Button();
- button.Click += new RoutedEventHandler(button_Click);
- button.Height = 60;
- button.Width = 60;
- button.HorizontalAlignment = HorizontalAlignment.Center;
- button.VerticalAlignment = VerticalAlignment.Center;
- var redBrush = new ImageBrush();
- redBrush.ImageSource = new BitmapImage(new Uri("Resources/red60p.png", UriKind.Relative));
- var blackBrush = new ImageBrush();
- blackBrush.ImageSource = new BitmapImage(new Uri("Resources/black60p.png", UriKind.Relative));
- switch (r)
- {
- case 1:
- if (c % 2 == 1)
- {
- button.Background = redBrush;
- button.Name = "buttonRed" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- case 2:
- if (c % 2 == 0)
- {
- button.Background = redBrush;
- button.Name = "buttonRed" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- case 3:
- if (c % 2 == 1)
- {
- button.Background = redBrush;
- button.Name = "buttonRed" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- case 4:
- if (c % 2 == 0)
- {
- button.Background = Brushes.Black;
- button.Name = "button" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- case 5:
- if (c % 2 == 1)
- {
- button.Background = Brushes.Black;
- button.Name = "button" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- case 6:
- if (c % 2 == 0)
- {
- button.Background = blackBrush;
- button.Name = "buttonBlack" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- case 7:
- if (c % 2 == 1)
- {
- button.Background = blackBrush;
- button.Name = "buttonBlack" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- case 8:
- if (c % 2 == 0)
- {
- button.Background = blackBrush;
- button.Name = "buttonBlack" + r + c;
- stackPanel.Children.Add(button);
- }
- break;
- default:
- break;
- }
- }
- }
- }
- UIElement GetGridElement(Grid g, int r, int c)
- {
- for (int i = 0; i < g.Children.Count; i++)
- {
- UIElement e = g.Children[i];
- if (Grid.GetRow(e) == r && Grid.GetColumn(e) == c)
- return e;
- }
- return null;
- }
- public void button_Click(Object sender, RoutedEventArgs e)
- {
- Button button = (Button)sender;
- StackPanel stackPanel = (StackPanel)button.Parent;
- int row = Grid.GetRow(stackPanel);
- int col = Grid.GetColumn(stackPanel);
- Console.WriteLine("Row: " + row + " Column: " + col);
- // MessageBox.Show("Row: " + row + " Column: " + col, "Winner", MessageBoxButton.YesNo);
- if (currentMove == null)
- currentMove = new Move();
- if (currentMove.piece1 == null)
- {
- currentMove.piece1 = new Piece(row, col);
- stackPanel.Background = Brushes.Green;
- }
- else
- {
- currentMove.piece2 = new Piece(row, col);
- stackPanel.Background = Brushes.Green;
- }
- if ((currentMove.piece1 != null) && (currentMove.piece2 != null))
- {
- if (CheckMove())
- {
- MakeMove();
- // aiMakeMove();
- }
- }
- }
- //перевірка чи ходиш тим яким слід
- private Boolean CheckMove()
- {
- StackPanel stackPanel1 = (StackPanel)GetGridElement(CheckersGrid, currentMove.piece1.Row, currentMove.piece1.Column);
- StackPanel stackPanel2 = (StackPanel)GetGridElement(CheckersGrid, currentMove.piece2.Row, currentMove.piece2.Column);
- Button button1 = (Button) stackPanel1.Children[0];
- Button button2 = (Button) stackPanel2.Children[0];
- stackPanel1.Background = Brushes.Black;
- stackPanel2.Background = Brushes.Black;
- if ((turn == "Black") && (button1.Name.Contains("Red")))
- {
- currentMove.piece1 = null;
- currentMove.piece2 = null;
- displayError("It is blacks turn.");
- return false;
- }
- if ((turn == "Red") && (button1.Name.Contains("Black")))
- {
- currentMove.piece1 = null;
- currentMove.piece2 = null;
- displayError("It is reds turn.");
- return false;
- }
- if (button1.Equals(button2))
- {
- currentMove.piece1 = null;
- currentMove.piece2 = null;
- return false;
- }
- if(button1.Name.Contains("Black"))
- {
- return CheckMoveBlack(button1, button2);
- }
- else if (button1.Name.Contains("Red"))
- {
- return CheckMoveRed(button1, button2);
- }
- else
- {
- currentMove.piece1 = null;
- currentMove.piece2 = null;
- Console.WriteLine("False");
- return false;
- }
- }
- //перевірка чи дана шашка може ходити
- private bool CheckMoveRed(Button button1, Button button2)
- {
- CheckerBoard currentBoard = GetCurrentBoard();
- List<Move> jumpMoves = currentBoard.checkJumps("Red");
- if (jumpMoves.Count > 0)
- {
- bool invalid = true;
- foreach (Move move in jumpMoves)
- {
- if (currentMove.Equals(move))
- invalid = false;
- }
- if (invalid)
- {
- displayError("Jump must be taken");
- currentMove.piece1 = null;
- currentMove.piece2 = null;
- Console.WriteLine("False");
- return false;
- }
- }
- if (button1.Name.Contains("Red"))
- {
- if (button1.Name.Contains("King"))
- {
- if ((currentMove.isAdjacent("King")) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- return true;
- Piece middlePiece = currentMove.checkJump("King");
- if ((middlePiece != null) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- {
- StackPanel middleStackPanel = (StackPanel)GetGridElement(CheckersGrid, middlePiece.Row, middlePiece.Column);
- Button middleButton = (Button)middleStackPanel.Children[0];
- if (middleButton.Name.Contains("Black"))
- {
- CheckersGrid.Children.Remove(middleStackPanel);
- addBlackButton(middlePiece);
- return true;
- }
- }
- }
- else
- {
- if ((currentMove.isAdjacent("Red")) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- return true;
- Piece middlePiece = currentMove.checkJump("Red");
- if ((middlePiece != null) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- {
- StackPanel middleStackPanel = (StackPanel)GetGridElement(CheckersGrid, middlePiece.Row, middlePiece.Column);
- Button middleButton = (Button)middleStackPanel.Children[0];
- if (middleButton.Name.Contains("Black"))
- {
- CheckersGrid.Children.Remove(middleStackPanel);
- addBlackButton(middlePiece);
- return true;
- }
- }
- }
- }
- currentMove = null;
- displayError("Invalid Move. Try Again.");
- return false;
- }
- private bool CheckMoveBlack(Button button1, Button button2)
- {
- CheckerBoard currentBoard = GetCurrentBoard();
- List<Move> jumpMoves = currentBoard.checkJumps("Black");
- if (jumpMoves.Count > 0)
- {
- bool invalid = true;
- foreach (Move move in jumpMoves)
- {
- if (currentMove.Equals(move))
- invalid = false;
- }
- if (invalid)
- {
- displayError("Jump must be taken");
- currentMove.piece1 = null;
- currentMove.piece2 = null;
- Console.WriteLine("False");
- return false;
- }
- }
- if (button1.Name.Contains("Black"))
- {
- if (button1.Name.Contains("King"))
- {
- if ((currentMove.isAdjacent("King")) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- return true;
- Piece middlePiece = currentMove.checkJump("King");
- if ((middlePiece != null) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- {
- StackPanel middleStackPanel = (StackPanel)GetGridElement(CheckersGrid, middlePiece.Row, middlePiece.Column);
- Button middleButton = (Button)middleStackPanel.Children[0];
- if (middleButton.Name.Contains("Red"))
- {
- CheckersGrid.Children.Remove(middleStackPanel);
- addBlackButton(middlePiece);
- return true;
- }
- }
- }
- else
- {
- if ((currentMove.isAdjacent("Black")) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- return true;
- Piece middlePiece = currentMove.checkJump("Black");
- if ((middlePiece != null) && (!button2.Name.Contains("Black")) && (!button2.Name.Contains("Red")))
- {
- StackPanel middleStackPanel = (StackPanel)GetGridElement(CheckersGrid, middlePiece.Row, middlePiece.Column);
- Button middleButton = (Button)middleStackPanel.Children[0];
- if (middleButton.Name.Contains("Red"))
- {
- CheckersGrid.Children.Remove(middleStackPanel);
- addBlackButton(middlePiece);
- return true;
- }
- }
- }
- }
- currentMove = null;
- displayError("Invalid Move. Try Again.");
- return false;
- }
- private void MakeMove()
- {
- if ((currentMove.piece1 != null) && (currentMove.piece2 != null))
- {
- Console.WriteLine("Piece1 " + currentMove.piece1.Row + ", " + currentMove.piece1.Column);
- Console.WriteLine("Piece2 " + currentMove.piece2.Row + ", " + currentMove.piece2.Column);
- StackPanel stackPanel1 = (StackPanel)GetGridElement(CheckersGrid, currentMove.piece1.Row, currentMove.piece1.Column);
- StackPanel stackPanel2 = (StackPanel)GetGridElement(CheckersGrid, currentMove.piece2.Row, currentMove.piece2.Column);
- CheckersGrid.Children.Remove(stackPanel1);
- CheckersGrid.Children.Remove(stackPanel2);
- Grid.SetRow(stackPanel1, currentMove.piece2.Row);
- Grid.SetColumn(stackPanel1, currentMove.piece2.Column);
- CheckersGrid.Children.Add(stackPanel1);
- Grid.SetRow(stackPanel2, currentMove.piece1.Row);
- Grid.SetColumn(stackPanel2, currentMove.piece1.Column);
- CheckersGrid.Children.Add(stackPanel2);
- checkKing(currentMove.piece2);
- currentMove = null;
- if (turn == "Black")
- {
- this.Title = "Checkers! Reds turn!";
- turn = "Red";
- }
- else if (turn == "Red")
- {
- this.Title = "Checkers! Blacks turn!";
- turn = "Black";
- }
- SoundPlayer s = new SoundPlayer("C:/Users/Acer/Desktop/ПЗ/Semester5/KPZ/lab5/checkers-master/Checkers/Resources/12250.wav");
- s.Play();
- checkWin();
- }
- }
- private void aiMakeMove()
- {
- currentMove = CheckersAI.GetMove(GetCurrentBoard());
- if (currentMove != null)
- {
- if (CheckMove())
- {
- MakeMove();
- }
- }
- }
- //отримання даної позиції
- private CheckerBoard GetCurrentBoard()
- {
- CheckerBoard board = new CheckerBoard();
- for (int r = 1; r < 9; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, r, c);
- if (stackPanel.Children.Count > 0)
- {
- Button button = (Button)stackPanel.Children[0];
- if (button.Name.Contains("Red"))
- {
- if (button.Name.Contains("King"))
- board.SetState(r - 1, c, 3);
- else
- board.SetState(r - 1, c, 1);
- }
- else if (button.Name.Contains("Black"))
- {
- if (button.Name.Contains("King"))
- board.SetState(r - 1, c, 4);
- else
- board.SetState(r - 1, c, 2);
- }
- else
- board.SetState(r - 1, c, 0);
- }
- else
- {
- board.SetState(r - 1, c, -1);
- }
- }
- }
- return board;
- }
- private void checkKing(Piece tmpPiece)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, tmpPiece.Row, tmpPiece.Column);
- if (stackPanel.Children.Count > 0)
- {
- Button button = (Button)stackPanel.Children[0];
- var redBrush = new ImageBrush();
- redBrush.ImageSource = new BitmapImage(new Uri("Resources/red60p_king.png", UriKind.Relative));
- var blackBrush = new ImageBrush();
- blackBrush.ImageSource = new BitmapImage(new Uri("Resources/black60p_king.png", UriKind.Relative));
- if ((button.Name.Contains("Black")) && (!button.Name.Contains("King")))
- {
- if (tmpPiece.Row == 1)
- {
- button.Name = "button" + "Black" + "King" + tmpPiece.Row + tmpPiece.Column;
- button.Background = blackBrush;
- }
- }
- else if ((button.Name.Contains("Red")) && (!button.Name.Contains("King")))
- {
- if (tmpPiece.Row == 8)
- {
- button.Name = "button" + "Red" + "King" + tmpPiece.Row + tmpPiece.Column;
- button.Background = redBrush;
- }
- }
- }
- }
- private void addBlackButton(Piece middleMove)
- {
- StackPanel stackPanel = new StackPanel();
- stackPanel.Background = Brushes.Black;
- Button button = new Button();
- button.Click += new RoutedEventHandler(button_Click);
- button.Height = 60;
- button.Width = 60;
- button.HorizontalAlignment = HorizontalAlignment.Center;
- button.VerticalAlignment = VerticalAlignment.Center;
- button.Background = Brushes.Black;
- button.Name = "button" + middleMove.Row + middleMove.Column;
- stackPanel.Children.Add(button);
- Grid.SetColumn(stackPanel, middleMove.Column);
- Grid.SetRow(stackPanel, middleMove.Row);
- CheckersGrid.Children.Add(stackPanel);
- }
- //перевірка чи є переможець
- private void checkWin()
- {
- int totalBlack = 0, totalRed = 0;
- for (int r = 1; r < 9; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, r, c);
- if (stackPanel.Children.Count > 0)
- {
- Button button = (Button)stackPanel.Children[0];
- if (button.Name.Contains("Red"))
- totalRed++;
- if (button.Name.Contains("Black"))
- totalBlack++;
- }
- }
- }
- if (totalBlack == 0)
- winner = "Red";
- if (totalRed == 0)
- winner = "Black";
- if (winner != null)
- {
- for (int r = 1; r < 9; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, r, c);
- if (stackPanel.Children.Count > 0)
- {
- Button button = (Button)stackPanel.Children[0];
- button.Click -= new RoutedEventHandler(button_Click);
- }
- }
- }
- MessageBoxResult result = MessageBox.Show(winner + " is the winner! Would you like to play another?", "Winner", MessageBoxButton.YesNo);
- if (result == MessageBoxResult.Yes)
- newGame();
- }
- }
- //загрузка серіалізованих даних
- private void LoadGame()
- {
- }
- private void newGame()
- {
- currentMove = null;
- winner = null;
- this.Title = "Checkers! Blacks turn!";
- turn = "Black";
- ClearBoard();
- MakeBoard();
- MakeButtons();
- }
- private void displayError(string error)
- {
- MessageBox.Show(error, "Invalid Move", MessageBoxButton.OK);
- }
- private void newGame_Click(object sender, RoutedEventArgs e)
- {
- newGame();
- }
- private void exit_Click(object sender, RoutedEventArgs e)
- {
- Close();
- }
- private void saveGame_Click(object sender, RoutedEventArgs e)
- {
- var ToSave = new List<Elems>();
- for (int r = 1; r < 9; r++)
- {
- for (int c = 0; c < 8; c++)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, r, c);
- if (stackPanel.Children.Count > 0)
- {
- Button button = (Button)stackPanel.Children[0];
- ToSave.Add(new Elems(r,c,button.Name));
- }
- }
- }
- DateTime now = DateTime.Now;
- BinaryFormatter formatter = new BinaryFormatter();
- FileStream fs = new FileStream("gameLogFor"+ now.ToString("hh_mm_ss") + ".dat", FileMode.OpenOrCreate);
- formatter.Serialize(fs, ToSave);
- /* ClearBoard();
- MakeBoard();*/
- /* BinaryFormatter formatter = new BinaryFormatter();
- FileStream fs = new FileStream("game.dat", FileMode.OpenOrCreate);
- formatter.Serialize(fs, CheckersGrid);
- ClearBoard();*/
- }
- private void loadGame_Click(object sender, RoutedEventArgs e)
- {
- /* OpenFileDialog openFileDialog = new OpenFileDialog();
- openFileDialog.Multiselect = true;
- openFileDialog.Filter = "Text files (*.dat)|*.dat|All files (*.*)|*.*";
- openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
- string fileLOG = "";
- if (openFileDialog.ShowDialog() == true)
- {
- fileLOG = openFileDialog.FileName;
- MessageBox.Show(fileLOG, "Saved game loading");
- }
- /* DateTime now = DateTime.Now;
- Console.WriteLine(now.ToString("hh:mm:ss"));
- Console.WriteLine(now.ToString("dd.MM.yyyy hh:mm:ss"));
- MessageBox.Show(now.ToString("dd.MM.yyyyhh:mm:ss"), "Saved game loading");*/
- BinaryFormatter formatter = new BinaryFormatter();
- FileStream fs = new FileStream("game.dat", FileMode.OpenOrCreate);
- var CheckersData = (List<Elems>)formatter.Deserialize(fs);
- ClearBoard();
- MakeBoard();
- init(CheckersData);
- }
- private void init(List<Elems> elems)
- {
- foreach(var elem in elems)
- {
- StackPanel stackPanel = (StackPanel)GetGridElement(CheckersGrid, elem.r, elem.c);
- Button button = new Button();
- button.Click += new RoutedEventHandler(button_Click);
- button.Height = 60;
- button.Width = 60;
- button.HorizontalAlignment = HorizontalAlignment.Center;
- button.VerticalAlignment = VerticalAlignment.Center;
- var redBrush = new ImageBrush();
- redBrush.ImageSource = new BitmapImage(new Uri("Resources/red60p.png", UriKind.Relative));
- var blackBrush = new ImageBrush();
- blackBrush.ImageSource = new BitmapImage(new Uri("Resources/black60p.png", UriKind.Relative));
- if (elem.color.Contains("Red"))
- {
- button.Background = redBrush;
- button.Name = elem.color;
- stackPanel.Children.Add(button);
- }
- if (elem.color.Contains("Black"))
- {
- button.Background = blackBrush;
- button.Name = elem.color;
- stackPanel.Children.Add(button);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement