Informatika gyűjtemény

Egy szinttel feljebb jatek.cs

2004050607080910

NézetNyomtat

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: utf-8
Méret: 3 KB
#define SZORGALMI

using System;

namespace Tablajatek
{
    public struct Mezo
    {
        private int  m_Ugras; // Amelyik mezőre kerül a játékos, ha rálép erre a mezőre
        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 mezőnek a sorszáma, ahol a játékos áll
        private bool m_Kimarad;   // Igaz, ha a játékos kimarad a következő körben
        
        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; // Mezők száma
        int M = 0; // Játékosok száma
        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 mezőn lévő összes játékos kezdő pozícióba állítása
            for (int i = 0; i < jatekosok.Length; i++)
                if (jatekosok[i].MezoIndex == mezoIndex)
                    jatekosok[i].Starthoz();
        }

        private int Jatszma()
        {
            bool vege = false;
            int dobas, index;
            int kor = 0;

            // A játékosok kezdő pozícióba állítása
            for (int i = 0; i < jatekosok.Length; i++)
                jatekosok[i].Starthoz();

            while (!vege) {
                kor++;

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

                    if (jatekosok[i].Kimarad) { // Ha a játékos 'Egyszer kimaradsz' mezőn áll
                        jatekosok[i].Kimarad = false;
                        continue;
                    }

#if SZORGALMI
                    if (mezok[index].Csapda) {  // Ha a játékos 'Csapda' mezőn áll
                        if (mezok[index].Ertek == dobas)
                            dobas = Dobas();
                        else
                            continue;
                    }

                    if (index + dobas >= N)     // Ha a játékos túllépne a cél mezőn
                        index = N - (index + dobas - N) - 2;
                    else
                        index += dobas;
#else
                    index += dobas;
                    if (index >= N)             // Ha a játékos túllépne a cél mezőn
                        index = N - 1;
#endif

                    index = mezok[index].Ugras; // Csúszda vagy létra esetén másik mezőre ugrás
                    Kiut(index);                // Ellenfelek kiütése, mielőtt oda lépnénk

                    jatekosok[i].MezoIndex = index;
                    jatekosok[i].Kimarad = mezok[index].EgyszerKimarad;
                    if (index == N - 1)         // Ha valaki a célba ért,
                        vege = true;            // vége a játszmának
                }
            }

            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 fájl betöltésénél!");
                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)