Tri v vrsto
Slika 79: Začetna velikost obrazca Tri v vrsto
Od uporabnika programa namreč najprej zahtevamo, da vnese imeni obeh igralcev, ki imata tudi možnost izbire svoje barve. Izbrana barva (ali pa privzeta barva) je prikazana v okvirčkih s številkama obeh tekmovalcev. V glavnem meniju je tudi opcija Navodila, ki v sporočilnem oknu prikaže kratka navodila za samo igro. Na dnu obrazca je statusna vrstica s tekočim datumom.
Igro pričnemo s klikom na Tri v vrsto.
Med samo igro je v statusni vrstici ves čas navodilo, kateri igralec je trenutno na vrsti (glej napis desno spodaj na sliki Slika 77: Program Tri v vrsto med igro. Ob zmagi enega izmed igralcev (tri enake barve v vrsti, stolpcu ali diagonali), se v sporočilnem oknu izpiše ustrezno obvestilo. Le-to se izpiše tudi v primeru neodločenega rezultata (vsa okna so pobarvana, zmagovalca pa ni!). Ko uporabnik zapre sporočilno okno, se avtomatično prične nova igra.
V konstruktorju obrazca ustvarimo 9 gumbov in jih dodamo v gradnik TableLayoutPanel. Za vsakega od gumbov napovemo še odzivne metode za tri dogodke.
bool igralec = true;//igro začne prvi igralec
ColorDialog cD = new ColorDialog();//nov objekt za dialog izbire barve //konstruktor obrazca
public Form1() {
InitializeComponent();
//v okencu gradnika StatusStrip prikažemo datum
toolStripStatusLabel1.Text = DateTime.Now.ToLongDateString();
//izdelava gumbov
for (int i = 0; i < 9; i++) {
Button button = new Button();//nov objekt tipa Button button.Text = ""; //gumb je brez napisa
//gumb dodamo v gradnik TableLayoutPanel tLP.Controls.Add(button);
/*do vsakega gumba v gradniku tLP dostopamo s pomočjo lastnosti Controls, oglatega opklepaja in indeksa tega gumba (indeksi se začenjajo z 0!)*/
//gumb zasede celotno celico tabele tLP.Controls[i].Dock = DockStyle.Fill;
//upravljalcu dogodkov dodajmo dogodek Click posameznega gumba tLP.Controls[i].Click += new System.EventHandler(OK_Click);
//upravljalcu dogodkov dodajmo dogodek MouseEnter posameznega gumba tLP.Controls[i].MouseEnter += new System.EventHandler(OK_Enter);
//upravljalcu dogodkov dodajmo dogodek MouseLeave posameznega gumba tLP.Controls[i].MouseLeave += new System.EventHandler(OK_Leave);
}
this.Height = 160;//Začetna velikost obrazca
/*vsebina predalčka gradnika StatusStrip, ki označuje kateri igralec je na potezi, je na začetku prazna*/
toolStripStatusLabel2.Text = "";
}
Za uspešen začetek igre morata igralca v vnosni polji vpisati svoja imena. Ob kliku na možnost Tri v vrsto glavnega menija se igra lahko začne.
private void tB_Validating(object sender, CancelEventArgs e) {
KontrolaImena();//metoda za preverjanje vnosa imen obeh tekmovalcev }
errorProvider1.SetError(tBPrvi, "Vnesi ime prvega igralca");
bStatus = false;
}
else errorProvider1.SetError(tBPrvi, "");/*ko je ime vneseno, odstranimo sporočilo o napaki*/
if (tBDrugi.Text == "") {
errorProvider1.SetError(tBDrugi, "Vnesi ime drugega igralca");
bStatus = false;
}
else errorProvider1.SetError(tBDrugi, "");
return bStatus;//metoda vrne false, če imena tekmovalcev niso vnesena }
//odzivna metoda za začetek igre
private void triVVrstoToolStripMenuItem_Click(object sender, EventArgs e) {
//če sta imeni tekmovalcev vneseni, lahko začnemo z igro
if (KontrolaImena()) {
panel1.Enabled = false;
this.Height = 500;
//med samo igro ni možno spreminjati barve posameznega tekmovalca nastavitveToolStripMenuItem.Enabled = false;
Zacetek();
} }
//lastna metoda za določanje začetnega stanja private void Zacetek()
{
igralec = true;//začenja prvi igralec
toolStripStatusLabel2.Text = "Na potezi je " + tBPrvi.Text;
//vsem gumbom gradnika TablePanelLayout določimo začetno barvo in stil for (int i = 0; i < 9; i++)
{
(tLP.Controls[i] as Button).FlatStyle = FlatStyle.System;
tLP.Controls[i].BackColor = Color.FromArgb(0,0,0,0);
} }
Igralca lahko določita svoji barvi gumbov:
//odzivna metoda za izbiro barve prvega igralca
private void barvaPrvegaIgralcaToolStripMenuItem_Click(object sender, EventArgs e)
{
/*če prvi igralec izbere barvo in klikne gumb OK, mu določimo novo barvo*/
if (cD.ShowDialog() == DialogResult.OK) {
if (bBarvaDrugi.BackColor != cD.Color) bBarvaPrvi.BackColor = cD.Color;
else MessageBox.Show("Barvi obeh tekmovalcev ne smeta biti enaki!");
} }
//odzivna metoda za izbiro barve drugega igralca
private void barvaDrugegaIgralcaToolStripMenuItem_Click(object sender, EventArgs e)
{
*/če drugi igralec izbere barvo in klikne gumb OK, mu določimo novo Barvo*/
if (cD.ShowDialog() == DialogResult.OK) {
if (bBarvaPrvi.BackColor != cD.Color) bBarvaDrugi.BackColor = cD.Color;
else MessageBox.Show("Barvi obeh tekmovalcev ne smeta biti enaki!");
}
}
Dodamo še odzivno metodo postavki Navodila glavnega menija. V sporočilnem oknu pojasnimo pravila igre.
private void navodilaToolStripMenuItem_Click(object sender, EventArgs e) {
MessageBox.Show("Vnesi imeni obeh tekmovalcev, v meniju 'Nastavitve' izberi barvo posameznega tekmovalca, nato pa v meniju klikni 'Tri v vrsto'!\r\n\r\nBarvo igralca lahko izbereš tudi s klikom na gumb 1 oz 2!","Kratka navodila",0,MessageBoxIcon.Information);
}
Odzivne metode za vstop in izstop miškinega kazalca v območje gumba, ter metoda za klik na gumb, so enake za vse gumbe v gradniku TableLayoutPanel. Pri tem bmo uporabili parameter sender odzivnih metod, ki smo ga spoznali v poglavju Parametri odzivnih metod.
//dogodek se izvede, ko z miško vstopimo v območje nekega gumba public void OK_Enter(object sender, EventArgs ee)
{
//ko z miško vstopimo v območje gradnik, se oblika gumba spremeni (sender as Button).FlatStyle=FlatStyle.Popup;
}
//dogodek se izvede, ko z miško zapustimo območje nekega gumba public void OK_Leave(object sender, EventArgs ee)
{
/*če z miško zapustimo gumb, ki še ni pobarvan, bo njegova oblika taka, kot pred vstopom*/
if ((sender as Button).BackColor==Color.FromArgb(0,0,0,0)) (sender as Button).FlatStyle=FlatStyle.System;
}
public void OK_Click(object sender, EventArgs ee) {
if ((sender as Button).BackColor == Color.FromArgb(0, 0, 0, 0)) {
{
Po vsakem kliku gumba smo glede na igralca pobarvali kliknjen gumb in takoj preverili stanje igre. Najprej smo s sklicem logične metode PreveriRezultat preverili, če je igra končana in imamo zmagovalca. V kolikor zmagovalca ni, vsi gumbi pa so poklikani, s pomočjo metode Neodloceno preverimo morebiten neodločen rezultat. Tule sta obe metodi.
//metoda vrne True, če imamo zmagovalca private bool PreveriRezultat(Color barva) {
/*Preverimo vse možne kombinacije za tri v vrsto. Metoda vrne true, če imamo zmagovalca*/
if ((tLP.Controls[0].BackColor==barva &&
tLP.Controls[1].BackColor==barva&&tLP.Controls[2].BackColor==barva)||
(tLP.Controls[3].BackColor == barva && tLP.Controls[4].BackColor ==
barva && tLP.Controls[5].BackColor == barva)||
(tLP.Controls[6].BackColor == barva && tLP.Controls[7].BackColor ==
barva && tLP.Controls[8].BackColor == barva)||
(tLP.Controls[0].BackColor == barva && tLP.Controls[3].BackColor ==
barva && tLP.Controls[6].BackColor == barva)||
(tLP.Controls[1].BackColor == barva && tLP.Controls[4].BackColor ==
barva && tLP.Controls[7].BackColor == barva)||
(tLP.Controls[2].BackColor == barva && tLP.Controls[5].BackColor ==
barva && tLP.Controls[8].BackColor == barva)||
(tLP.Controls[0].BackColor == barva && tLP.Controls[4].BackColor ==
barva && tLP.Controls[8].BackColor == barva)||
(tLP.Controls[2].BackColor == barva && tLP.Controls[4].BackColor ==
barva && tLP.Controls[6].BackColor == barva)) return true;
else return false;
}
/*metoda vrne True, če je igra končana (vsa polja so poklikana) in zmagovalca ni*/
private bool Neodloceno() {
//če so že vsa polja izpolnjena metoda vrne true: rezultat je neodločen bool neodl = true;
for (int i=0;i<9;i++)
if (tLP.Controls[i].BackColor==Color.FromArgb(0,0,0,0)) neodl=false;
return neodl;
}