Avatar
GunSpawn
Redaktor
Avatar
GunSpawn:

Ahoj všem,
rád bych, jestli by jste zkontrolovali můj již hotový kód pro jednu konzolovou aplikaci, jestli nemám nějaké chyby.

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

namespace ConsoleNim
{
    class Program
    {
        static int pocetSirek = 0;
        static bool kdoHraje = true;
        static int odecitaneSirky = 0;

        static void Main(string[] args)
        {
            Program hra = new Program();
            Random cislo = new Random();

            Console.WriteLine("Vítejte ve hře Nim.");
            Console.WriteLine("Hru spustíte \"a\" \nnávod \"b\" \nkonec \"c\" \n(vše potvrďte Enterem.)");
            string volba = Console.ReadLine();

            switch (volba) //výběr v menu
            {
                case "a":
                    {
                        pocetSirek = cislo.Next(10, 21);
                            hra.KdoZacina();
                            Console.Clear();
                        stridani:
                            if (pocetSirek > 0)
                            {
                                if (kdoHraje == true)
                                {
                                    hra.Hrac();
                                    goto stridani;
                                }
                                else
                                {
                                    hra.PC();
                                    pocetSirek -= odecitaneSirky;
                                    Console.WriteLine("Počítač odebral {0} sirek. Zbývá {1} sirek", odecitaneSirky, pocetSirek);
                                    goto stridani;
                                }
                            }
                            else if (pocetSirek == 0)
                            {
                                if (kdoHraje == true)
                                {
                                    Console.WriteLine("PC vyhrál!");
                                }
                            }
                        break;
                    }
                case "b":
                    {
                        Console.WriteLine("Nim je hra, kde můžete odebrat 1 až 3 zápalky z hromady,\nkde jich bude 10 až 100. Vaším cílem je odebrat poslední zápalku dřív než PC.");
                        break;
                    }
                case "c":
                    {
                        Exit(0);
                        break;
                    }
            }
            Console.ReadKey();

        }

        /// <summary>
        /// Rozhodnutí kdo začne
        /// </summary>
        /// <returns> Vrací bool hodnotu, kdoZacne</returns>
        public bool KdoZacina()
        {
        kdoZacne:
            Console.WriteLine("Chcete začít? ano/ne");
            string volba = Console.ReadLine();

            if (volba == "ano")
            {
                kdoHraje = true;
                return kdoHraje;
            }
            else if (volba == "ne")
            {
                kdoHraje = false;
                return kdoHraje;
            }
            else
            {
                Console.WriteLine("Špatný vstup.");
                Console.Clear();
                goto kdoZacne;
            }
        }
        public bool Hrac()
        {
            Console.WriteLine("Kolik sirek chcete odebrat? Aktualní počet sirek: {0}.Můžete odebrat 1-3 sirky.", pocetSirek);
            try
            {
                odecitaneSirky = int.Parse(Console.ReadLine());
            }
            catch (FormatException)
            {
                Console.WriteLine("Zadávejte čísla.");
                Hrac();
            }
            if (odecitaneSirky >= 1 && odecitaneSirky <= 3)
            {
                pocetSirek -= odecitaneSirky;
                if (pocetSirek == 0)
                {
                    Console.WriteLine("Blahopřeji, vyhrál si.");
                }
                else if (pocetSirek < 0)
                {
                    pocetSirek = 0;
                    Console.WriteLine("Blahopřeji, vyhrál si.");
                }
                kdoHraje = false;
                return kdoHraje;
            }
            else
            {
                Console.WriteLine("Jde o interval od 1 do 3. Opakujte znovu.");
                Hrac();
                return kdoHraje;
            }

        }

        public bool PC()
        {
                if (pocetSirek % 4 == 0)
                {
                    odecitaneSirky = 1;
                    kdoHraje = true;
                    return kdoHraje;
                }
                else if (pocetSirek % 4 == 1)
                {
                    odecitaneSirky = 1;
                    kdoHraje = true;
                    return kdoHraje;
                }
                else if (pocetSirek % 4 == 2)
                {
                    odecitaneSirky = 2;
                    kdoHraje = true;
                    return kdoHraje;
                }
                else if (pocetSirek % 4 == 3)
                {
                    odecitaneSirky = 3;
                    kdoHraje = true;
                    return kdoHraje;
                }
                else
                {
                    return kdoHraje;
                }
            }
        public static void Exit(int exitCode)
        {
            exitCode = 0;
        }
        }
    }

Díky všem.

Odpovědět 6.8.2014 8:24
Save early, save often, save everything, everywhere, everytime.
Avatar
sadlomaslox25:
  • program neni napsany objektove
    • staticke promene vs nestaticke metody
    • nepouzivani navratovych typu funkci (proc nejsou teda void?)
    • nekonzistentni chovani metody PC a Hrac (proc kazda dela "uplne" jine veci)
  • v programovani (ve vyssich jazycich) se snazime vyhybat pouziti goto
  • proc metoda exit? a proc se v ni prepisuje parametr?
  • proc je metoda PC tak slozita kdyz de napsat na 3 radky
  • proc se metoda Hrac vola rekurzivne? sak to ani nemoze fungovat
  • proc je v kdoZacina Console.Writeline a Console.Clear pod sebou ? to WriteLine pak nema smysl

asi to bude chtit vic studovat :D

 
Nahoru Odpovědět 6.8.2014 21:24
Avatar
qwertyW
Redaktor
Avatar
Odpovídá na GunSpawn
qwertyW:

xyz) proč se mi po přečtení návodu vypne hra;
xyz)chybí ošetření jiných vstupů při prvním switchi (a,b,c)
xyz)

"Nim je hra, kde můžete odebrat 1 až 3 zápalky z hromady,\nkde jich bude 10 až 100.
cislo.Next(10, 21);
Editováno 6.8.2014 21:48
Nahoru Odpovědět 6.8.2014 21:47
Programuji, tedy jsem.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:

Zkus popsat slovně jak má ta hra fungovat a já ti ukážu, jak by to mohlo vypadat :)

 
Nahoru Odpovědět 7.8.2014 2:37
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na qwertyW
GunSpawn:

Já jsem to upravoval a zapomněl jsem to přepsat v návodu, protože u počtu sirek větší jak 20 už to bylo hodně na dlouho;
Zapoměl jsem napsat, abych se po přečtení návodu vrátil do menu;
Na tohle jsem taky zapomněl :(;
Je to moje první aplikace, kterou nedělám podle tutoriálu, tak jsem chtěl aby jste my pomohli odhalit chyby, abych je už nedělal

Editováno 7.8.2014 8:03
Nahoru Odpovědět 7.8.2014 7:58
Save early, save often, save everything, everywhere, everytime.
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

Vybereš si v menu nová hra, náhodně se ti vygeneruje počet sirek od 10 do 20, potom si vybereš jestli budeš začínat ty a nebo PC a střídáte se v odbírání 1-3 sirek za kolo. Kdo odebere jako poslední vyhrál.

Nahoru Odpovědět 7.8.2014 8:00
Save early, save often, save everything, everywhere, everytime.
Avatar
qwertyW
Redaktor
Avatar
Nahoru Odpovědět 7.8.2014 8:16
Programuji, tedy jsem.
Avatar
coells
Redaktor
Avatar
Odpovídá na GunSpawn
coells:

A víš o tom, že vždy existuje vyhrávající strategie pro jednoho z hráčů? :-)

 
Nahoru Odpovědět  +1 7.8.2014 9:56
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na coells
GunSpawn:

Vím, ale zatím jsem to neupravoval, později udělám náročnější verzi, aby to nebylo tak lehké najít.

Nahoru Odpovědět 7.8.2014 11:04
Save early, save often, save everything, everywhere, everytime.
Avatar
Martin Gabriel:

Vždy když vidím někde v kódu "neuvážené" goto, tak mě v noci budí noční můry z raptorů (viz. obrázek).

PS: Vyhýbej se goto, nebo Tě sežere raptor.. True story.

Editováno 7.8.2014 12:34
Nahoru Odpovědět  +1 7.8.2014 12:33
"Be the change you want to see in the world" - Michael Scofield
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:
internal static class Program
{

    [STAThread]
    private static void Main(string[] args)
    {
        Console.WriteLine("Chceš začít? ano/ne");
        Player playerOnTurn = Console.ReadLine().ToLower() == "ano" ? Player.Human : Player.Pc;

        Console.WriteLine("Kolik sirek? (10-20)");
        int matchesCount = int.Parse(Console.ReadLine());

        Console.Clear();

        while (matchesCount > 0)
        {
            Console.WriteLine("Kolik sirek chceš odebrat? (1-3) Je jich aktualne {0}",
                matchesCount);

            int minus = 0;
            if (playerOnTurn == Player.Human)
                minus = int.Parse(Console.ReadLine());
            else
                minus = (matchesCount % 4 == 0) ? 1 : matchesCount % 4;

            Console.WriteLine("Hráč {0} odebral {1} z celkoveho poctu {2}",
                playerOnTurn,
                minus,
                matchesCount);

            matchesCount -= minus;
            if (matchesCount > 0)
                playerOnTurn = (playerOnTurn == Player.Human) ? Player.Pc : Player.Human;

            Console.WriteLine();
        }

        Console.WriteLine("Vyhrál "+ playerOnTurn.ToString());
    }
}

enum Player
{
    Pc, Human,
}
Editováno 7.8.2014 16:35
 
Nahoru Odpovědět  +2 7.8.2014 16:35
Avatar
GunSpawn
Redaktor
Avatar
Odpovídá na Jan Vargovský
GunSpawn:

A teď mi budeš muset pár věcí objasnit :D .
Co je za a) tohle
[STAThread]
b)proč je u třídy internal
c)Player playerOnTurn = Console.ReadLi­ne().ToLower() == "ano" ? Player.Human : Player.Pc;
d)minus = (matchesCount % 4 == 0) ? 1 : matchesCount % 4;
e)playerOnTurn = (playerOnTurn == Player.Human) ? Player.Pc : Player.Human;
f)Console.Wri­teLine("Vyhrál " + playerOnTurn.ToS­tring());
Promiň, že tě tak otravuju.Díky za všechno.
S pozdravem GunSpawn

Nahoru Odpovědět 7.8.2014 17:22
Save early, save often, save everything, everywhere, everytime.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na GunSpawn
Jan Vargovský:
  1. http://msdn.microsoft.com/…eadattribute(v=vs.110).aspx

Ani to nemusíš chápat, ono to tam VS za tebe dává automaticky :)

  1. je to jen defaultní modifikátor přístupu a jsem zvyklý je tam psát
  2. jestli napíšeš do konzole ano (nebo ANO a všechny její permutace s malými/velkými) tak se přiřadí do enumu Player hodnota Human, jinak Pc

Je to v podstatě jednořádková podmínka (odborně ternární operátor). Dá se to napsat i jako:

if(Console.ReadLine().ToLower() == "ano")
 playerOnTurn = Player.Human;
else
 playerOnTurn = Player.Pc;
  1. to je jen přepsaných tvých 20 řádků do jednoho :) vždycky ti to přiřadí zbytek po dělení 4. Dělá to úplně to samé co máš ty ve svém kódu, takže jestli jsi ho psal, měl by jsi to chápat. Zase se to dá napsat do normálních podmínek jako:
if(matchesCount % 4 == 0)
 minus = 1
else
 minus = matchesCount % 4;
  1. Human a Pc prohodí
  2. Vypíše se "Vyhrál Pc" nebo "Vyhrál Human"
 
Nahoru Odpovědět  +1 7.8.2014 17:49
Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

Tuhle hru už jsem viděl, stačí, aby člověk udělal 1 chybu a už nemůže vyhrát :)

 
Nahoru Odpovědět 7.8.2014 18:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.