216 lines
8.3 KiB
C#
216 lines
8.3 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|
|
} |