Informatika gyűjtemény

Egy szinttel feljebb tb_klickety.cs

2004050607080910

NézetNyomtat

tb_klickety.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
using System;

namespace Klickety
{
    public class Klickety
    {
        const int Szinek = 3, Ures = 0;
        char[] mezoKarakterek = {' ', 'O', '+', '@', '#', '*'};
        int N = 5, M = 5;
        int[,] mezok;

        public Klickety()
        {
            Random rand = new Random();

            mezok = new int[N, M];
            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                    mezok[i, j] = rand.Next(Szinek) + 1;
        }

        private void Kirajzol()
        {
            Console.Write("\n  |");
            for (int i = 0; i < M; i++)
                Console.Write(i);
            Console.Write("\n--+" + new string('-', M));

            for (int i = 0; i < N; i++) {
                Console.Write("\n{0,2}|", i);
                for (int j = 0; j < M; j++)
                    Console.Write(mezoKarakterek[mezok[i, j]]);
            }
            Console.WriteLine();
        }

        private void AdatotBeker(out int sor, out int oszlop)
        {
            string[] cmd;

            sor = -1;
            oszlop = -1;

            do {
                Console.Write("> ");
                cmd = Console.ReadLine().Split();

                if (cmd[0] == "q")
                    System.Environment.Exit(0);

                try {
                    sor = int.Parse(cmd[0]);
                    oszlop = int.Parse(cmd[1]);
                }
                catch {
                    Console.WriteLine("Hibas formatum!");
                }
            } while (sor < 0 || oszlop < 0 || sor >= N || oszlop >= M);
        }

        private bool LehetTorolni(int sor, int oszlop)
        {
            int szin = mezok[sor, oszlop];

            if (mezok[sor, oszlop] != Ures &&
                (sor - 1    >= 0 && mezok[sor - 1, oszlop] == szin ||
                 oszlop - 1 >= 0 && mezok[sor, oszlop - 1] == szin ||
                 sor + 1     < N && mezok[sor + 1, oszlop] == szin ||
                 oszlop + 1  < M && mezok[sor, oszlop + 1] == szin ))
                return true;

            return false;
        }

        private void Torol(int sor, int oszlop)
        {
            int szin = mezok[sor, oszlop];

            mezok[sor, oszlop] = Ures;
            if (sor - 1    >= 0 && mezok[sor - 1, oszlop] == szin) Torol(sor - 1, oszlop);
            if (oszlop - 1 >= 0 && mezok[sor, oszlop - 1] == szin) Torol(sor, oszlop - 1);
            if (sor + 1     < N && mezok[sor + 1, oszlop] == szin) Torol(sor + 1, oszlop);
            if (oszlop + 1  < M && mezok[sor, oszlop + 1] == szin) Torol(sor, oszlop + 1);
        }

        private void Lepottyan()
        {
            int uresDb;

            for (int oszlop = 0; oszlop < M; oszlop++) {
                uresDb = 0;
                for (int sor = N - 1; sor >= 0; sor--)
                    if (mezok[sor, oszlop] != Ures) {
                        if (uresDb > 0) {
                            mezok[sor + uresDb, oszlop] = mezok[sor, oszlop];
                            mezok[sor, oszlop] = Ures;
                        }
                    }
                    else {
                        uresDb++;
                    }
            }
        }

        private void UresOszlopokTorlese()
        {
            int uresDb = 0;

            for (int oszlop = 0; oszlop < M; oszlop++) {
                if (mezok[- 1, oszlop] != Ures) {
                    if (uresDb > 0)
                        for (int sor = 0; sor < N; sor++) {
                            mezok[sor, oszlop - uresDb] = mezok[sor, oszlop];
                            mezok[sor, oszlop] = Ures;
                        }
                }
                else {
                    uresDb++;
                }
            }
        }

        private bool LehetLepni()
        {
            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                    if (mezok[i, j] != Ures &&
                        (> 0     && mezok[- 1, j] == mezok[i, j] ||
                         j > 0     && mezok[i, j - 1] == mezok[i, j] ||
                         i < N - 1 && mezok[+ 1, j] == mezok[i, j] ||
                         j < M - 1 && mezok[i, j + 1] == mezok[i, j] ))
                        return true;

            return false;
        }

        private int MezokSzama()
        {
            int mezoSzam = 0;

            for (int i = 0; i < N; i++)
                for (int j = 0; j < M; j++)
                    if (mezok[i, j] != Ures)
                        mezoSzam++;

            return mezoSzam;
        }

        private bool Lepes()
        {
            int sor, oszlop;

            AdatotBeker(out sor, out oszlop);
            if (LehetTorolni(sor, oszlop)) {
                Torol(sor, oszlop);
                Lepottyan();
                UresOszlopokTorlese();
                Kirajzol();
            }

            if (LehetLepni()) {
                return true;
            }
            else {
                Console.WriteLine("\nVege a jateknak!\nFennmaradt mezok szama: " + MezokSzama());
                return false;
            }
        }

        public void Jatek()
        {
            Kirajzol();
            while (Lepes())
                ;
        }
    }

    public class Program
    {
        public static void Main()
        {
            Klickety klickety = new Klickety();
            klickety.Jatek();
        }
    }
}
(Vissza)