fel
le

Kő-papír-olló és 21

  • gyerekosztály, konstruktorok
  • overload
  • típuskompatibilitás

Kő, Papír, Olló

Egy kínai szerencsejátékkal foglalkozó helyen játékosok játszanak kő-papír-ollót. A játékosok random mutatnak fel a 3 lehetséges értékből egyet, de vannak olyan játékosok, akik mindig ugyanazt mutatják fel (pl. mindig olló-t). A kínai játékosok rizsben játszanak. 3 adag rizs a tét minden játékban. A győztesé a rizs, döntetlen esetén mindenki megtarthatja a rizsét.

Készítsük el a kínaiJátékos osztályt az alábbiak szerint:

  • rizsMenny: mező, egész szám, mutatja mennyi rizs van a játékosnál
  • rizsKezd: rizs mező, 0..100, azt mutatja hogy a játékbarlangba belépéskor (kezdetben) mennyi rizs volt nála,
  • mohosag: egész szám, 2..10, azt mutatja mennyit szeretne nyerni a saját kezdőtőkéjéhez képest, ha pl 3 az értéke, azt jelenti hogy a játékos jó eséllyel abbahagyja a játékot ha a saját kezdeti tőkéjének háromszoros értékét nyerte már meg.
  • nev: string, a játékos neve
  • fv akarJatszani() bool: megadja, hogy a játékos részt kíván-e venni a játékban (nem kíván, ha nincs meg a 3 rizs, illetve ha a mohóságának megfelelő mennyiségű nyereménnyel rendelkezik)
  • fv felmutat() enum: a függvény visszatérési értéke kő, papír, vagy olló, attól függően a játékos épp mit mutatott fel
  • konstruktor: paraméterei a nyereségvágy és a rizs induló mennyisége

Készítsük el a fixKínai játékost, a kínai játékos gyerekosztályát:

  • fixÉrték enum: mező, a fix érték amit a játékos mutat, kiolvasható, de nem módosítható
  • a konstruktorában beállítható a fentieken túl a játékos melyik fix értéket mutassa mindig fel ha kérdezik (pl mindig kő-t mutató játékos)

Készítsük el a bíró osztályt az alábbi metódusokkal:

  • fv lebonyolít( játékos1, játékos2 ): a bíró ellenőrzi mindkét játékosnak van-e 3 rizse a játékhoz, majd lekéri mindkét játékos felmutatását, eldönti ki nyert, és elosztja a rizst (egyiktől levon, másikhoz hozzáad)

Készítsük el a maffiaBíró osztályt, a bíró gyerekosztályaként

  • döntetlen esetén a bíró mindkét játékostól 1-1 rizst vesz el, ez a jutaléka
  • a bíró tartalmaz egy mezőt hány rizst gyűjtött be

Készítsük el a játékbarlang osztályt:

  • adott mennyiségű kínai játékos (pl 40 db) tartózkodhat épp benn
  • adott mennyiségű bíró lehet benn (pl 5 db)
  • jLista: kínai játékosok listájával (szükséges szokásos függvények: hozzáad, töröl, lekérdez)
  • bLista: bírók listájával (hozzáad, töröl, lekérdez)
  • fv lebonyolit(): kiválaszt random egy bírót, random két játékost, a bírót megkéri hogy próbálja lebonyolítani a játékot a két játékossal, konzolra írja a történéseket (játékosok neve, mit mutattak fel, a bíró döntése, stb)

Készítsük el a főprogramot:

  • példányosít egy játékbarlangot, max 60 játékossal, max 10 bíróval
  • 70% eséllyel közönséges, 30% eséllyel fix kínai játékosokat "enged" be a barlangba, összesen 50 darab játékost
  • példányosít random 80% normál, 20% maffia bírót, összesen 8 db-ot, és berakja a barlangba
  • engedélyez a barlangban 100 játékot
  • a végén kiírja, hány játékos ment tönkre (kevesebb mint 3 rizse maradt), hány játékos boldog (elérte a mohóságának megfelelő nyereséget), és a maffia bírók összesen hány rizst gyűjtöttek be.

21-ezés

A huszonegyezés (Blackjack) standard szabályai szerint készítsünk szimulációt az alábbiak szerint:

Kártyalap osztály:

  • reprezentál egy Franciakártya lapot (szín, érték)

Enum játékoslépés:

  • lapot kér (Hit)
  • megáll (Stand)
  • dupláz (Double)
  • felad (Surrender)
  • sokall (Bust)

Játékos osztály:

  • pénzmennyisége: a játékos zsetonjainak összértéke
  • lapok listája: vannak nála lapok amiket az osztótól kap
  • merészség: egész szám, mennyi értéknél kér még majd lapot (10..21 közötti érték)
  • fv lapotkap(lap): az osztó átad a játékosnak egy lapot, aki felveszi a listára
  • fv kövLépés() enum: az osztó kérdezi meg hogy a játékosnak mi legyen a következő lépése
  • játékNapló: minden egyes játékról nyilvántartja a tétet, a játék végét (nyer/veszít/mennyit, stb)
  • konstruktor: a kezdő pénzmennyiség, és a merészség értéke

JátékosOsztó osztály, a játékos gyerekosztálya, osztani és képes

  • lista: játékosok egy listája (hozzáad, lekérdez, töröl, létszám függvényekkel támogatva)
  • fv játszik(): a lebonyolít egy játékot
    • meghatározza mennyi a tét, minden játékostól elkéri a tétet, ha nincs mindenkinek elég pénze, akkor a játék félbeszakad
    • felépít egy komplett franciakártya csomagot és összekeveri
    • minden játékos kap 2 random lapot
    • a játékosokat sorban kérdezi mi a következő lépésük, és aszerint jár el
    • eldönti ki nyert, elosztja a nyereményt, stb

játékBarlang osztály:

  • játékosok és osztók kezelése
  • választ random egy osztót
  • random 4-8 játékost
  • az osztót felkéri a játék lebonyolítására

Főprogram:

  • példányosít egy játékbarlangot
  • játékosokat és osztókat példányosít és ad a barlanghoz
  • lebonyolít játékokat
  • kiírja az egyes játékosok kezdeti és záró állapotát, játékstatisztikáját

Fejlesszük tovább a játékos osztályt, hogy kezelje a double és split lépéseket is. A játékbarlangba helyezzünk random közönséges és továbbfejlesztett játékosokat is. Fejleszzük tovább az osztó osztályt, hogy képes legyen kezelni a fejletteb játékos módot is. A játékbarlangba helyezzünk közönséges és fejletteb osztókat is.

Kő-papír-olló megoldás (mikroby, vázlat)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ko_Papir_Ollo
{
    enum game {kő, papír, olló}
    class kinaijatekos
    {
        static Random rnd = new Random();
        protected int _rizsMenny;

        public readonly int rizsKezd;
        protected int _mohosag;
        protected string _nev;
        public int rizsMenny
        {
            get { return _rizsMenny; }
            set
            {
                if (value < 0) throw new Exception("Rossz rizs mennyiség érték!");
                _rizsMenny = value;
            }        
        }
        public int mohosag
        {
            get { return _mohosag; }
            set
            {
                if (value < 2 || value > 10) throw new Exception("Rossz mohoság érték");
                _mohosag = value;
            }
        }
        public string nev
        {
            get
            {
                if (_nev == null) throw new Exception("Üres név érték!");
                return _nev;
            }
            set
            {
                if (value == null) throw new Exception("Üres név értéket adtál meg!");
                _nev = value;
            }
        }
        public bool akarJatszani()
        {
            if (rizsMenny < 3) return false;
            if (mohosag*rizsKezd<=rizsMenny) return false;
            return true;
           
        }
        public virtual game felmutat()
        {
            int x = rnd.Next(0, 3);
            return (game)x;        
        }
        public kinaijatekos(int Mohosag, int RizsKezd, string neve)
        {
            rizsKezd = RizsKezd;
            rizsMenny = RizsKezd;
            nev = neve;
            mohosag = Mohosag;
           
        }
    }
    class Fixkinai:kinaijatekos
    {
        protected game _fixertek;
        public override game felmutat()
        {
            return _fixertek;
        }
        public Fixkinai(int Mohosag, int RizsKezd,string neve, game Fixertek)
            : base(Mohosag, RizsKezd,neve)
        {
            _fixertek = Fixertek;
        }

    }
    class biro
    {
       protected string _eredmeny;
       protected game _k1felmutat;
       protected game _k2felmutat;
       public string egyenlo
       {
           get
           { return _eredmeny; }
       }
       public game k1felmutat
       {
           get
           { return _k1felmutat; }
       }
       public game k2felmutat
       {
           get
           { return _k2felmutat; }
       }
       virtual public string lebonyolit(kinaijatekos k1, kinaijatekos k2)
       {
           this._eredmeny = "Nem játszottak";
           if ( k1.akarJatszani() && k2.akarJatszani() )
           {
               _k1felmutat = k1.felmutat();
               _k2felmutat = k2.felmutat();
               kinaijatekos nyero   = k1;
               kinaijatekos vesztes = k2;
               _eredmeny = "Első";
               if (k1felmutat != k2felmutat)
               {

                   if ((k1felmutat == game.kő) && (k2felmutat == game.papír) || (k1felmutat == game.olló) && (k2felmutat == game.kő) || (k1felmutat == game.papír) && (k2felmutat == game.olló))
                   {
                       nyero = k2;
                       vesztes = k1;
                       _eredmeny = "Második";
                   }
                   nyero.rizsMenny = nyero.rizsMenny + 3;
                   vesztes.rizsMenny = vesztes.rizsMenny - 3;
                   
               }
               else _eredmeny = "Egyenlő";
           }
           return _eredmeny;
       }
    }
    class maffiabiro : biro
    {
        protected int _rizsgyujt;
        public override string lebonyolit(kinaijatekos k1, kinaijatekos k2)
        {
            string eredmeny = base.lebonyolit(k1,k2);
            if (eredmeny == "Egyenlő")
            {
                k1.rizsMenny = k1.rizsMenny - 1;
                k2.rizsMenny = k2.rizsMenny - 1;
                _rizsgyujt += 2;
            }
            return eredmeny ;
        }
        public int rizsgyujt
        {
            get { return _rizsgyujt; }
        }
    }
    class jatekbarlang
    {
        static Random rnd = new Random();
        protected int _maxkinai;
        protected int _maxbiro;
        protected List<kinaijatekos> jLista;
        protected List<biro> bLista;
        public void jlistadd(kinaijatekos k)
        {
                if (jLista.Count >= _maxkinai) throw new Exception("Többet nem adhatsz hozzá a játékos listához!");
                jLista.Add(k);
        }
        public void jlistatoro (kinaijatekos k)
        {
                if (jLista.Count <= 0) throw new Exception("Többet nem törölhetsz a játékos listáról!");
                jLista.Remove(k);
        }
        public int jlistadarab
        {
            get
            { return jLista.Count;}
        }
        public kinaijatekos jlistaindex(int index)
        {
             return jLista[index];
        }
        //---
        public void bListaadd(biro b)
        {
                if (bLista.Count >= _maxbiro) throw new Exception("Többet nem adhatsz hozzá a bírói listához!");
                bLista.Add(b);
        }
        public void bListatorol(biro b)
        {
                if (bLista.Count <= 0) throw new Exception("Többet nem törölhetsz a bírói listáról!");
                bLista.Remove(b);
        }
        public int blistadarab
        {
            get
            {return bLista.Count; }
        }
        public biro blistaindex(int index)
        {
            return bLista[index];
        }
        // ---
        public void lebonyolit()
        {
            int biro = rnd.Next(bLista.Count);
            int k1 = rnd.Next(jLista.Count);
            int k2 = rnd.Next(jLista.Count);
            while (k1 == k2)
            {
                k2 = rnd.Next(jlistadarab);
            }
            kinaijatekos kinai1 = jLista[k1];
            kinaijatekos kinai2 = jLista[k2];
            biro b = bLista[biro];
            int elotte1 = kinai1.rizsMenny;
            int elotte2 = kinai2.rizsMenny;
            string nyero = b.lebonyolit(kinai1, kinai2);

            Console.WriteLine("A 1. Játékos Neve:{0}", kinai1.nev);
            Console.WriteLine("A Rizs Kezdő Mennyisége:{0}", kinai1.rizsKezd);
            Console.WriteLine("Mohóság:{0}", kinai1.mohosag);
            Console.WriteLine("{0} mutatta fel", b.k1felmutat);
            Console.WriteLine("A Rizs Mennyisége Játék Előtt:{0}", elotte1);
            Console.WriteLine("A Rizs Mennyisége Játék Után:{0}", kinai1.rizsMenny);
            Console.WriteLine("-----------------------------------");
            Console.WriteLine("A 2. Játékos Neve:{0}", kinai2.nev);
            Console.WriteLine("A Rizs kezdő Mennyisége:{0}", kinai2.rizsKezd);
            Console.WriteLine("Mohóság:{0}", kinai2.mohosag);
            Console.WriteLine("{0} mutatta fel", b.k2felmutat);
            Console.WriteLine("A Rizs Mennyisége Játék Előtt:{0}", elotte2);
            Console.WriteLine("A Rizs Mennyisége Játék Után:{0}", kinai2.rizsMenny);
            Console.WriteLine("-----------------------------------");
            if (nyero == "Egyenlő") Console.WriteLine("Bírói Döntés:{0}!", nyero);
            else if (nyero == "Nem játszottak") Console.WriteLine("Bírói Döntés:{0}!", nyero);
            else Console.WriteLine("Bírói Döntés:{0} játékos nyert!", nyero);
            Console.WriteLine("-----------------------------------");
        }
       
        public jatekbarlang(int jatekos, int biro)
        {
            _maxkinai = jatekos;
            _maxbiro = biro;
            jLista = new List<kinaijatekos>();
            bLista = new List<biro>();
       
        }

    }
    class Program
    {
        static Random rnd = new Random();
        static void Main(string[] args)
        {
            jatekbarlang jatekb = new jatekbarlang(60, 10);
            for (int i = 0; i < 50; i++)
            {
                bool kinai = rnd.Next(1, 100) < 70;
                int mohosag = rnd.Next(2,11);
                int rizskezd = rnd.Next(1, 101);
                if (kinai)
                {
                    string neve = String.Format("Kinai #{0}", i);
                    kinaijatekos k1 = new kinaijatekos(mohosag, rizskezd, neve);
                    jatekb.jlistadd(k1);

                }
                else
                {
                    string neve = String.Format("Fix kinai #{0}", i);
                    int f = rnd.Next(0, 3);
                    game fix = (game)f;
                    Fixkinai k1 = new Fixkinai(mohosag, rizskezd, neve, fix);
                    jatekb.jlistadd(k1);
                }
            }
            for (int j = 0; j < 8; j++)
            {
                bool birok = rnd.Next(1, 100) < 80;
                if (birok)
                {
                    biro k1 = new biro();
                    jatekb.bListaadd(k1);

                }
                else
                {
                    maffiabiro k1 = new maffiabiro();
                    jatekb.bListaadd(k1);
                }
 

            }
            for (int k = 0; k < 100; k++)
            {
                Console.WriteLine("{0}.Játék ==========================", k + 1);
                jatekb.lebonyolit();
            }
            int tonkre = 0;
            int boldog = 0;
            int maffia = 0;
            for(int i=0;i<jatekb.jlistadarab;i++)
            {
                kinaijatekos k = jatekb.jlistaindex(i);
                if (k.rizsMenny < 3) tonkre++;
                if (k.mohosag * k.rizsKezd < k.rizsMenny) boldog++;
            }
            for (int z = 0; z < jatekb.blistadarab;z++ )
            {
                if (jatekb.blistaindex(z) is maffiabiro)
                {
                    maffia += (jatekb.blistaindex(z) as maffiabiro).rizsgyujt;
                }
            }
            Console.WriteLine("===================================");
            Console.WriteLine("Tönkrement:{0}", tonkre);
            Console.WriteLine("Boldog:{0}", boldog);
            Console.WriteLine("Maffia:{0}", maffia);          
            Console.WriteLine("============= Game Over ===========");
            Console.ReadLine();
   
        }
    }
}
 

Kő-Papír-Olló megoldás (vázlat, Molnár Krisztán PTI megoldása)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace koPapirOllo
{
    enum Eszkoz { Ko, Papir, Ollo }

    class kinaiJatekos
    {
        static protected Random rand = new Random();
        public uint rizsAktual;
        public readonly uint rizsKezd;

        protected int _mohosag;
        public readonly string nev;
        public int mohosag
        {
            get
            {
                return _mohosag;
            }
            set
            {
                if (1 < value && value < 11)
                {
                    _mohosag = value;
                }
                else throw new Exception("Kellemetlen érték a mohóságban!");
            }
        }

        public bool akarJatszani()
        {
            if (rizsAktual < 3)
            {
                return false;
            }
            if (rizsKezd * mohosag <= rizsAktual)
            {
&nbs
Hernyák Zoltán
2013-05-01 21:09:14