Informatika gyűjtemény

Egy szinttel feljebb tb_jatek.cs

2004050607080910

NézetNyomtat

tb_jatek.cs (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 3 KB
#define SZORGALMI

using System;

namespace Tablajatek
{
    public struct Mezo
    {
        private int  m_Ugras; // Amelyik mezore kerul a jatekos, ha ralep erre a mezore
        private byte m_Ertek;

        public Mezo(int ugras, byte ertek)
        {
            m_Ugras = ugras;
            m_Ertek = ertek;
        }

        public int Ugras
        {
            get { return m_Ugras; }
        }

        public byte Ertek
        {
            get { return m_Ertek; }
        }

#if SZORGALMI
        public bool Csapda
        {
            get { return Ertek >= 1 && Ertek <= 6; }
        }

        public bool EgyszerKimarad
        {
            get { return Ertek == 7; }
        }
#else
        public bool EgyszerKimarad
        {
            get { return Ertek > 0; }
        }
#endif
    }

    public struct Jatekos
    {
        private int  m_MezoIndex; // Annak a mezonek a sorszama, ahol a jatekos all
        private bool m_Kimarad;   // Igaz, ha a jatekos kimarad a kovetkezo korben
        
        public int MezoIndex
        {
            get { return m_MezoIndex; }
            set { if (value >= 0) m_MezoIndex = value; }
        }

        public bool Kimarad
        {
            get { return m_Kimarad; }
            set { m_Kimarad = value; }
        }

        public void Starthoz()
        {
            MezoIndex = 0;
            Kimarad = false;
        }
    }

    public class Jatek
    {
        int N = 0; // Mezok szama
        int M = 0; // Jatekosok szama
        Mezo[] mezok;
        Jatekos[] jatekosok;
        Random kocka = new Random();

        public Jatek()
        {
            Beolvas();
        }

        private int Dobas()
        {
            return kocka.Next(6) + 1;
        }

        private void Kiut(int mezoIndex)
        {
            // Az adott mezon levo osszes jatekos kezdo pozicioba allitasa
            for (int i = 0; i < jatekosok.Length; i++)
                if (jatekosok[i].MezoIndex == mezoIndex)
                    jatekosok[i].Starthoz();
        }

        private bool Kor()
        {
            bool vege = false;
            int dobas, index;

            for (int i = 0; i < jatekosok.Length && !vege; i++) {
                dobas = Dobas();
                index = jatekosok[i].MezoIndex;

                if (jatekosok[i].Kimarad) { // Ha a jatekos 'Egyszer kimaradsz' mezon all
                    jatekosok[i].Kimarad = false;
                    continue;
                }

#if SZORGALMI
                if (mezok[index].Csapda) {  // Ha a jatekos 'Csapda' mezon all
                    if (mezok[index].Ertek == dobas)
                        dobas = Dobas();
                    else
                        continue;
                }

                if (index + dobas >= N)     // Ha a jatekos tullepne a cel mezon
                    index = N - (index + dobas - N) - 2;
                else
                    index += dobas;
#else
                index += dobas;
                if (index >= N)             // Ha a jatekos tullepne a cel mezon
                    index = N - 1;
#endif

                index = mezok[index].Ugras; // Csuszda vagy letra eseten masik mezore ugras
                Kiut(index);                // Ellenfelek kiutese, mielott oda lepnenk

                jatekosok[i].MezoIndex = index;
                jatekosok[i].Kimarad = mezok[index].EgyszerKimarad;
                if (index == N - 1)         // Ha valaki a celba ert,
                    vege = true;            // vege a jatszmanak
            }

            return vege;
        }

        private int Jatszma()
        {
            int kor = 0;

            // A jatekosok kezdo pozicioba allitasa
            for (int i = 0; i < jatekosok.Length; i++)
                jatekosok[i].Starthoz();

            do
                kor++;
            while (!Kor() && kor <= 30000);

            return kor;
        }

        private double AtlagKorokSzama()
        {
            const int JatszmakSzama = 1000;
            double atlag = 0.0;

            for (int i = 0; i < JatszmakSzama; i++)
                atlag += Jatszma();

            return atlag / JatszmakSzama;
        }

        private void Beolvas()
        {
            try {
                System.IO.StreamReader sr = new System.IO.StreamReader("jatek1.be");
                string[] sor;

                sor = sr.ReadLine().Split();
                N = int.Parse(sor[0]);
                M = int.Parse(sor[1]);
                mezok = new Mezo[N];
                jatekosok = new Jatekos[M];

                for (int i = 0; i < N; i++) {
                    sor = sr.ReadLine().Split();
                    mezok[i] = new Mezo(int.Parse(sor[0]) - 1, byte.Parse(sor[1]));
                }

                sr.Close();
            }
            catch {
                Console.Error.WriteLine("Hiba a fajl betoltesenel!");
                System.Environment.Exit(1);
            }
        }

        public void Kiir()
        {
            Console.WriteLine(AtlagKorokSzama());
            Console.ReadLine();
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            Jatek jatek = new Jatek();
            jatek.Kiir();
        }
    }
}
(Vissza)