/*
* Created by SharpDevelop.
* User: nibbler
* Date: 5.11.2006
* Time: 19:18
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace pexeso
{
///
/// MainForm - hlavni trida k testovani funkcnosti
///
public partial class MainForm
{
///
/// Main() - vstupni metoda programu
///
/// parametry prikazoveho radku
[STAThread]
public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
///
/// MainForm() - konstruktor
///
public MainForm()
{
InitializeComponent();
}
// instancni promenne
public int hraciPole = 16;
public int dvoucislo = 0;
public int[] pole;
public int[] pomocnePole = new int[2];
public int hracA = 0;
public int hracB = 0;
public bool hrajeA = true;
public int radka;
public int sloupec;
public int pozice;
public int pocitadlo = 0;
public int pocetDvojic = 8;
// vlastnosti k nekterym instancnim promennym
public int HracA
{
get{return hracA;}
set{hracA = value;}
}
public int HracB
{
get{return hracB;}
set{hracB = value;}
}
public bool HrajeA
{
get{return hrajeA;}
set{hrajeA = value;}
}
public int Radka
{
get{return radka;}
set{radka = value;}
}
public int Sloupec
{
get{return sloupec;}
set{sloupec = value;}
}
public int Pozice
{
get{return pozice;}
set{pozice = value;}
}
public int Pocitadlo
{
get{return pocitadlo;}
set{pocitadlo = value;}
}
public int Dvoucislo
{
get{return dvoucislo;}
set{dvoucislo = value;}
}
public int PocetDvojic
{
get{return pocetDvojic;}
set{pocetDvojic = value;}
}
public int HraciPole
{
get{return hraciPole;}
set{hraciPole = value;}
}
///
/// Stornovat() - metoda stornuje hru a pusti novou
///
public void Stornovat()
{
// nastavime si pocatecni hodnoty
Dvoucislo = 0;
Pocitadlo = 0;
PocetDvojic = 8;
HracA = 0;
HracB = 0;
Pozice = 0;
Radka = 0;
Sloupec = 0;
// vygenerujeme si nove pomocne pole
VygenerovatPole();
// rozdame karty
RozdatKarty();
// a otocime je obrazkama dolu
OtocitVsechnyKartyDolu();
// vsechny kontrolky vratime do puvodniho stavu - viditelne a mackatelne :)
foreach(Control c in tableLayoutPanel1.Controls)
{
c.Visible = true;
c.Enabled = true;
}
// popisky nastavime take na vychozi
label1.Text = "Player A - 0 ";
label2.Text = "Player B - 0 ";
label3.Text = "A is playing";
}
///
/// VygenerovatPole() - metoda vytvori pole s kartickama a zamichame je
///
public void VygenerovatPole()
{
// vytvorime si pole
pole = new int[HraciPole+1];
// naplnime ho kartickama - karticky reprezentuji cisla v nasem pripade
for(int i = 1; i <= 8; i++)
{
// kazde cislo tu bude dvakrat
pole[i] = i;
pole[i+8] = i;
}
// potreba pro michani
int prechod;
// vygenerujeme si nahodne cislo od 10 do 30
Random nahodneCislo = new Random();
int cislo = nahodneCislo.Next(10,30);
// zamichame tolikrat, kolikrat sme vygenerovali
for(int i = 1; i < cislo; i++)
{
// hemzeni karticek
prechod = pole[1];
pole[1] = pole[4];
pole[4] = pole[7];
pole[7] = pole[14];
pole[14] = pole[8];
pole[8] = pole[10];
pole[10] = pole[12];
pole[12] = pole[2];
pole[2] = pole[16];
pole[16] = pole[3];
pole[3] = pole[5];
pole[5] = pole[9];
pole[9] = pole[6];
pole[6] = pole[11];
pole[11] = pole[13];
pole[13] = pole[15];
pole[15] = prechod;
}
}
///
/// RozdatKarty() - metoda priradi kartickam, ktere sou zatim jen ocislovane nejake obrazky z kolekce obrazku
///
public void RozdatKarty()
{
// neco pomocneho
int j = 1;
// pro vsechny kontrolky, ktere jsou v tabulce
foreach(Control c in tableLayoutPanel1.Controls)
{
// priradime kontrolce obrazek
c.BackgroundImage = imageList1.Images[j];
j++;
// jelikoz je obrazku polovic co karticek, tak jeste jednou
if(j == (HraciPole/2))
{
j = 1;
}
}
}
///
/// OtocitVsechnyKartyDolu() - metoda preda vsem kartickam vrchni obrazek
///
public void OtocitVsechnyKartyDolu()
{
foreach(Control c in tableLayoutPanel1.Controls)
{
c.BackgroundImage = imageList1.Images[0];
}
}
///
/// ZiskejObrazek() - zjisti cislo obrazku
///
/// kontrolka
/// vraci cislo obrazku
public int ZiskejObrazek(Control c)
{
// cislo radky na hraci plose
Radka = (tableLayoutPanel1.GetRow(c)+1);
// cislo sloupce na hraci plose
Sloupec = (tableLayoutPanel1.GetColumn(c)+1);
// vysledna pozice nebo-li index karticky
Pozice = (Radka * 4) - (4 - Sloupec);
// vratime cislo karticky na dane pozici
return pole[Pozice];
}
///
/// Hrajem() - metoda zajistuje samotnou hru, kdo je na rade atd.
///
public void Hrajem()
{
// pomocna
bool again = false;
// pro otoceni prvni a druhe karticky
if(pocitadlo%3!=0)
{
// si zapiseme jejich pozice
pomocnePole[Dvoucislo] = Pozice;
// abychom si priste neprepsali prvni hodnotu pole ale az druhou :)
Dvoucislo++;
}
// na treti kliknuti mysi se vsechno vyhodnoti ...
else //if(pocitadlo%3==0)
{
// pokud byl na rade hrac A
if(HrajeA)
{
// dame to vsem vedet
label3.Text = "B is playing";
// zjistime jestli nahodou hrac neotocil dve stejne karticky
again = ZjistiVyhru();
// pokud ano a mame povolene pravidlo "hraj dokud ti to de"
if(again && winnerStillPlayingToolStripMenuItem.Checked)
{
// pokud jsou jeste nejake karticky na plose
if(PocetDvojic!=0)
{
// dame vedet hracum, kdo je na rade
label3.Text = "A is playing";
}
// a dame to vedet i programu
HrajeA = true;
}
// pokud pravidlo neplati, dame sanci druhemu hraci, ikdyz vyhral v minulem kole jiny hrac
else
{
// nechame hrat druheho hrace
HrajeA = false;
}
}
// pokud byl na rade hrac B vyuzijeme stejny postup jako u hrace A
// TODO: mozna by nebylo od veci si na to udelat metodu a neopakovat si tady kod ...
else
{
label3.Text = "A is playing";
again = ZjistiVyhru();
if(again && winnerStillPlayingToolStripMenuItem.Checked)
{
if(PocetDvojic!=0)
{
label3.Text = "B is playing";
}
HrajeA = false;
}
else
{
HrajeA = true;
}
}
// mame vse vyhodnocene, muzem si tedy vynulovat pomocnou na pristi kolo
Dvoucislo = 0;
}
// tato podinka zajisti abychom nemohli vybrat prvni tazenou kartu dvakrat po sobe
if((pocitadlo%3)-1==0)
{
// karticku na chvili znepristupnime
tableLayoutPanel1.Controls[pomocnePole[0]-1].Enabled = false;
}
}
///
/// ZjistiVyhru() - metoda zjisti jestli sou otocene karticky stejne
///
/// vraci true, pokud jsou pravidla hry nastavene na "prave uspesny hrac hraje jeste jednou"
public bool ZjistiVyhru()
{
// pomocna
bool maHratStejnyHrac = false;
// pokud jsou karticky stejne
if(pole[pomocnePole[0]]==pole[pomocnePole[1]])
{
// nastavime si true
maHratStejnyHrac = true;
// jestlize hral hrac A
if(HrajeA)
{
// pricteme mu bodik
HracA++;
// a taky to vsem oznamime
label1.Text = "Player A - " + HracA;
}
else
{
// pokud obratil stejne karticky hrac B, pricteme bodik jemu
HracB++;
// opet to dame vsem vedet
label2.Text = "Player B - " + HracB;
}
// snizime pocet dvojic
PocetDvojic--;
// tyto dve stejne karticky odebereme z hraci plochy
tableLayoutPanel1.Controls[pomocnePole[0]-1].Visible = false;
tableLayoutPanel1.Controls[pomocnePole[1]-1].Visible = false;
// pokud na hraci plose uz nejsou zadne karticky, je konec
if(pocetDvojic == 0)
{
// a vypiseme viteze, podle toho kdo ma vic bodiku, pripadne rovnost
if(HracA > HracB)
{
label3.Text = "Player A won "+HracA+":"+HracB+" Congratulation!";
}
if(HracA < HracB)
{
label3.Text = "Player B won "+HracB+":"+HracA+" Congratulation!";
}
if(HracA == HracB)
{
label3.Text = "Deuce "+HracA+":"+HracB;
}
}
}
// pokud karticky stejne nejsou
else
{
// povolime prvni otocenou karticku
tableLayoutPanel1.Controls[pomocnePole[0]-1].Enabled = true;
// a obratime je obrazkem dolu
tableLayoutPanel1.Controls[pomocnePole[0]-1].BackgroundImage = imageList1.Images[0];
tableLayoutPanel1.Controls[pomocnePole[1]-1].BackgroundImage = imageList1.Images[0];
}
// vracime bool
return maHratStejnyHrac;
}
}
}