/* * 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; } } }