Kezdőoldal » Számítástechnika » Programozás » C#-ban egy poker játékot...

C#-ban egy poker játékot szeretnék létrehozni, és elakadtam, hogyan tudnám megvalósítani (többi lent)?

Figyelt kérdés

tehát eddig van egy kódom, ami megjelenít 5 kártyalapot a formon, pluszban ki tudok rakni még akárhányszor két kártyát, csak az a problémám, hogy úgy szeretném megvalósítani, hogy gombnyomásra kapjam a két kártyám, aztán a flop-ot, river-t és a turn-t, de ha belerakok egy button a form-omba, elromlik a kód, mivel foreach-el vizsgálom a kártya item-eket, a form-on és azt a hibaüzenetet kapom, hogy a buttont nem tudja Kártyává konvertálni, itt a kódom:


class Kártya : PictureBox

{

public Kártya(string fajlnev)

{

Load(fajlnev);

this.Height = this.Image.Height / 3;

this.Width = this.Image.Width / 3;

this.Visible = false;

this.SizeMode = PictureBoxSizeMode.StretchImage;

}

}



public partial class Form1 : Form

{

int LapokSzáma = 52;


public Form1()

{


InitializeComponent();

StreamReader sr = new StreamReader("cards.txt", Encoding.Default);


while (!sr.EndOfStream)

{

string fajlnev = sr.ReadLine();

Kártya k = new Kártya(string.Format("Lapok/{0}", fajlnev));

this.Controls.Add(k);



}


Leosztás();

Leosztás2();


sr.Close();



}



void Leosztás()

{

Random rnd = new Random();


for (int i = 0; i < 5; i++)

{

int VéletlenLap = rnd.Next(LapokSzáma);


int számláló = 0;

foreach (Kártya item in this.Controls)

{


if (item.Visible == false)

{

számláló++;

if (VéletlenLap == számláló)

{

item.Visible = true;

LapokSzáma = LapokSzáma - 1;

item.Left = item.Width * i;

}



}


}

}

}

void Leosztás2()

{

Random rnd = new Random();


for (int i = 0; i < 2; i++)

{

int VéletlenLap = rnd.Next(LapokSzáma);

int számláló = 0;

foreach (Kártya item in this.Controls)

{


if (item.Visible == false)

{

számláló++;

if (VéletlenLap == számláló)

{

item.Visible = true;

LapokSzáma = LapokSzáma - 1;

item.Left = item.Width * i;

item.Top = 250;

}



}


}

}


}


}

}


2017. nov. 3. 14:48
 1/1 anonim ***** válasza:
94%

Azért romlott el, mert nem teszel különbséget a Formon adatok, játékállapot és megjelenítés között, mindent "egy kosszal" próbálsz megoldani. Ez egysezerűbb problémáknál működhet, de mint látható, egy pókerjáték már összetettebb. Elvileg megoldható így is, de szerintem, lassabban ugyan, de messzebbre jutsz, ha változtatsz a szemléleten és a módszeren.


Nem jó a megközelítés ugyanis. Szét kell szedned a játékot "rétegekre". Ebben az esetben van nagyjából három réteged: a kártyapakli, a szabályok, és az asztal. A kártyapakli nagyjából az, amit most a "cards.txt"-ben tárolsz, a szabályok értelemszerűen a pókerjáték leírása, az "asztal" pedig a megjelenítés, vagyis ami most a Form-odon van.


A paklit nevezzük mostantól adatrétegnek. Ebben benne van, hogy van "kártyád", aminek vannak jellemzői, például neve és értéke (Mondjuk pikk ász). Maga a kártyapakli lényegében egy tömb (vagy lista, vagy collection vagy akármi), amiben benne van a játékohz használt összes kártya, pontosan egyszer. Vannak játékosaid is, és mivel van kapcsolat a játékosok és a kártyalapok között, ezért a kártyalapoknak van egy olyan tulajdonsága is, hogy kinél van éppen.


Ezzel el is jutottunk a következő szintig, a játék szintjéig. Ez egy (vagy több) olyan osztály, ami leírja, hogy mit lehet csinálni a pókerben, és ez konkrétan hogyan történik, illetve meg tudja mondani magáról, hogy éppen mi a játékállás. Melyik játékos a nyertes, ki vesztett, hogy állnak a tétek, stb. Millió és még egy aspektusa van.


Végül az egész játék-állapotra írod meg a felhasználói felületet, ami aszerint hozza létre (vagy dobja el) az UI elemeket, hogy éppen mit kell megmutatni.


Személy szerint készítenék egy "Player", egy "Card" és egy "Game" osztályt. A "Player" a játékos (Neve, pénze, stb), a "Card" a kártyalap (Neve, értéke, és hogy éppen kinél van). A "Game" osztály az aktuális játékot írja le: Játékosok listája, kártyalapok listája, az aktuális tét, az összes megtett zseton, forduló, egyáltalán minden, amit egy játékról tudni lehet, illetve, ez nagyon fontos, a játékban végezhető műveleteket, de minnél egyszerűbben. Tehát csak annyit tud, hogy egy játékosnak ad egy lapot (mindegy, hogy hány lapja van/volt a játékosnak), emeli a pénzét, csökkenti a pénzét, stb. Minnél egyszerűbben és butábban.


A következő, hogy legyen egy Poker osztályod, ami kap egy Game objektumot. A "Poker" osztályban lehet vadulni: szépen megírod, hogy mi történik a játékban, amikor emeli a tétet a játékos, amikoz dobja a lapjait. Megírod a lekérdezéseket: éppen melyik játékos áll nyerésre (Lehet vadulni: írsz egy kombináció-leíró osztályt, ami annyit tud, hogy mi a saját értéke, és hogy a játkosnál olyan lapok vannak-e, ami illeszkedik rá. Vagyis pár, két pár, drill, full, stb. minden esetre van egy-egy vizsgáló osztályod. Pici, rövid, érthető mind)


Ha jól csináltad, akkor ezen a ponton olyan hívásaid vannak, hogy Poker.Begin(), Poker.NextRound(), Poker.Bid(Player1, 100), Poker.IsEnd(), Poker.GetWinner(), Poker.Finish() stb. Ha ide eljutottál, akkor lehet dolgozni a felhasználói felületen.


Ahhoz, hogy működjön, tele kell majd raknod az osztálayidat eseményekkel, amik jelzik, hogy megváltozott valamelyik tulajdonság. PL. nőtt a játékos pénze, máshoz tartozik egy kártyalap, stb. A felhasználói felület objektumai értesülnek ezekről a változásokról - vagyis feliratkoznak az eseményekre - és ezserint módostítják magukat.


Ez így jó bonyolultnak tűnik, és valóban komplexebb megközelítés. Viszont menet közben megismerkedsz majd egy rakás, egyébként rohadt hasznos fogással. Nézz utána az OOP-nek, az MVVM-nek, használj angol megnevezéseket, és ne félj sok kicsi részre szétszedni a kódot. Izgis feladat, és jól meg tudsz vele egy csomó mindent tanulni, ha rászánod az időt.

2017. nov. 3. 15:26
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!