chess/ChessWindow.cs

216 lines
8.3 KiB
C#
Raw Normal View History

2024-06-24 13:01:12 +02:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Chess
{
public partial class Szachy : Form
{
public Szachy() { InitializeComponent(); }
private Szachownica board;
private void Chess_Load(object sender, EventArgs e)
{
board = new Szachownica(this);
Szachownica.KogoTerazTura = Kolor.NONE;
TimeButton.MouseDown += click;
Undo.MouseDown += click;
Undo.MouseUp += ReleasedButton;
RestartButton.MouseUp += click;
}
public Kolor poprzedniGracz = Kolor.WHITE;
private void click(object sender, EventArgs e)
{
if (sender.GetType() == typeof(Button))
{
switch (((Button)sender).Name)
{
case "TimeButton":
if (Szachownica.KogoTerazTura == Kolor.NONE && poprzedniGracz == Kolor.NONE) { TimeButton.Enabled = false; return; }
TimeButton.Text = TimeButton.Text == "Start" ? "Stop" : "Start";
if (Szachownica.KogoTerazTura == Kolor.NONE)
{
WystartujZegar();
}
else
{
ZatrzymajZegar();
}
break;
case "RestartButton":
int moves = Szachownica.poprzednieRuchy.Count;
for (int i = 0; i < moves; i++)
{
PokazPoprzednieRuchy();
}
Szachownica.poprzednieRuchy = new List<PoprzedniStanSzachownicy>();
Black = new CzasGraczy(0, 0);
White = new CzasGraczy(0, 0);
if (timer != null)
{
ZatrzymajZegar();
}
TimeButton.Text = "Start";
Szachownica.Window.GameState.Text = "";
Szachownica.KogoTerazTura = Kolor.NONE;
break;
}
}
if (sender.GetType() == typeof(PictureBox))
{
switch (((PictureBox)sender).Name)
{
case "Undo":
Undo.Image = Properties.Resources.undoArrrowClicked;
PokazPoprzednieRuchy();
break;
}
}
}
private void PokazPoprzednieRuchy()
{
if (Szachownica.poprzednieRuchy.Count == 0)
{
return;
}
int dir = Szachownica.KogoTerazTura == Kolor.BLACK ? 1 : -1;
Kolor poprzedniGracz = Szachownica.KogoTerazTura == Kolor.BLACK ? Kolor.WHITE : Kolor.BLACK;
if (poprzedniRuch.figura.rodzajfigury == RodzajFigury.King)
{
int ydir = poprzedniGracz == Kolor.WHITE ? 7 : 0;
if (poprzedniRuch.indexRuchu == 8)
{
Szachownica.pola[ydir, 5].PrzydzialFigur(new Figura(RodzajFigury.EMPTY));
Szachownica.pola[ydir, 7].PrzydzialFigur(new Figura(RodzajFigury.Rook, poprzedniGracz));
}
if (poprzedniRuch.indexRuchu == 9)
{
Szachownica.pola[ydir, 3].PrzydzialFigur(new Figura(RodzajFigury.EMPTY));
Szachownica.pola[ydir, 0].PrzydzialFigur(new Figura(RodzajFigury.Rook, poprzedniGracz));
}
}
if (poprzedniRuch.figura.rodzajfigury == RodzajFigury.Pawn)
{
if (poprzedniRuch.indexRuchu == 4)
{
Szachownica.pola[poprzedniRuch.ruch.y + dir, poprzedniRuch.ruch.x].PrzydzialFigur(new Figura(RodzajFigury.Pawn, Szachownica.KogoTerazTura, true));
}
if (poprzedniRuch.indexRuchu == 5)
{
Szachownica.pola[poprzedniRuch.ruch.y + dir, poprzedniRuch.ruch.x].PrzydzialFigur(new Figura(RodzajFigury.Pawn, Szachownica.KogoTerazTura, true));
}
}
Szachownica.pola[poprzedniRuch.ruch.y, poprzedniRuch.ruch.x].PrzydzialFigur(poprzedniRuch.usunieteFigury);
Szachownica.pola[poprzedniRuch.poprzedniaLokalizacja.y, poprzedniRuch.poprzedniaLokalizacja.x].PrzydzialFigur(poprzedniRuch.figura);
Szachownica.poprzednieRuchy.RemoveAt(Szachownica.poprzednieRuchy.Count - 1);
Szachownica.KogoTerazTura = poprzedniGracz;
Figura.ZaaktualizujWszystkieAtaki();
Posuniecie movement = new Posuniecie();
if (movement.SyndromOblezonejTwierdzy())
{
Szachownica.Window.GameState.Text = "Szach";
Szachownica.Window.GameState.ForeColor = System.Drawing.Color.Firebrick;
_ = movement.Mat();
}
}
private void ReleasedButton(object sender, MouseEventArgs e)
{
Undo.Image = Properties.Resources.undoArrrow;
}
private PoprzedniStanSzachownicy poprzedniRuch => Szachownica.poprzednieRuchy.Last();
private CzasGraczy Black = new CzasGraczy(0, 0);
private CzasGraczy White = new CzasGraczy(0, 0);
public Timer timer;
private void WystartujZegar()
{
Szachownica.KogoTerazTura = poprzedniGracz;
void ShowLabel(Label label, ref CzasGraczy time)
{
time.sekundy += 1;
label.Text = time.FormatCzasu();
if (time.sekundy >= 59) { time.minuty += 1; }
}
timer = new Timer
{
Interval = 1000
};
timer.Tick += (object sender, EventArgs e) =>
{
string gracz = Szachownica.KogoTerazTura.ToString();
if (gracz == "BLACK")
{
ShowLabel(BlackTimer, ref Black);
}
else
{
ShowLabel(WhiteTimer, ref White);
}
};
timer.Start();
}
public void ZatrzymajZegar()
{
timer.Stop();
poprzedniGracz = Szachownica.KogoTerazTura;
Szachownica.KogoTerazTura = Kolor.NONE;
BlackTimer.Text = Black.FormatCzasu();
WhiteTimer.Text = White.FormatCzasu();
}
private struct CzasGraczy
{
public int sekundy;
public int minuty;
public CzasGraczy(int sekundy, int minuty) { this.sekundy = sekundy; this.minuty = minuty; }
public string FormatCzasu()
{
string Format(string czas)
{
if (czas.Length == 1)
{
czas = "0" + czas;
}
return czas;
}
if (sekundy >= 60)
{
sekundy = 0;
}
if (minuty >= 5)
{
minuty = 0;
sekundy = 0;
if (Szachownica.KogoTerazTura == Kolor.BLACK)
{
Szachownica.Window.GameState.Text = "Gracz bialy przegral na czas!";
Szachownica.Window.GameState.ForeColor = System.Drawing.Color.Firebrick;
Szachownica.Window.ZatrzymajZegar();
}
else
{
Szachownica.Window.GameState.Text = "Gracz czarny przegral na czas!";
Szachownica.Window.GameState.ForeColor = System.Drawing.Color.Firebrick;
Szachownica.Window.ZatrzymajZegar();
}
}
return Format(minuty.ToString()) + ":" + Format(sekundy.ToString());
}
}
}
}