Pierwszy projekt [newbie]

Własne projekty oraz implementacje.

Moderator: xxSlayeRxx

Pierwszy projekt [newbie]

Sponsor

Sponsor
 

Pierwszy projekt [newbie]

Postprzez malymakar » Wt gru 27, 2011 3:58 pm

Dopiero zaczynam przygodę z C# i tak sobie w celach czysto edukacyjnych postanowiłem napisać coś w stylu walki robotów. Wystawiam tutaj ten program bardziej w celu poznania popełnionych przeze mnie błędów, niż jakiejkolwiek oceny [bo co tu oceniać...]. Na razie opcja Player vs Computer wygląda identycznie jak Computer vs Computer z tego względu iż nie wiem jak się za to zabrać, brakuje mi pomysłu, ale z czasem może coś wymyśle.

Kod: Zaznacz cały
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace MyApp
{
    class KlasaGlowna
    {
        static void Main(string[] args)
        {
            Robot r1 = new Robot();
            Robot r2 = new Robot();
            Console.WriteLine("Robots fight game.");
            Console.WriteLine("1. Computer vs Computer\n2. Player vs Computer\n3. Info\n4. End");
            MenuG:
            var key = Console.ReadKey(true);
            try
            {
            }
            catch(FormatException)
            {
                Console.WriteLine("Błędne dane. Wprowadź cyfrę 1-4.");
                goto MenuG;
            }
            switch (key.Key)
            {
                case ConsoleKey.D1:
                    goto WalkaPC;
                case ConsoleKey.D2:
                    goto Walka1P;
                case ConsoleKey.D3:
                    Console.WriteLine("Ver. 1.0 beta\nCreated by t0m3k");
                    goto MenuG;
                case ConsoleKey.D4:
                    Console.WriteLine("Zapraszamy ponownie...");
                    goto End;
                default:
                    Console.WriteLine("Błędne dane. Wprowadź cyfrę 1-4.");
                    goto MenuG;
            }

            WalkaPC:
            do
            {
                Console.WriteLine();
                r1.versus(r1.attack(), r2.deffence());
                Thread.Sleep(500);
                if(r1.HP < 0)goto loss;
                r2.versus(r2.attack(), r1.deffence());
                loss:
                Thread.Sleep(500);
            } while (r1.HP > 0 && r2.HP > 0);

            if (r1.HP == r2.HP)
                Console.WriteLine("Walka zakończona remisem");
            else if (r1.HP > r2.HP)
                Console.WriteLine("Zwycięża robot 1!\nPozostało HP: r1= {0}, r2={1}", r1.HP, r2.HP);
            else
                Console.WriteLine("Zwycięża robot 2!\nPozostało HP: r1= {0}, r2={1}", r1.HP, r2.HP);
            goto End;


            Walka1P:
            do
            {
                Console.WriteLine();
                r1.versus(r1.attack(), r2.deffence());
                Thread.Sleep(500);
                if(r1.HP < 0)goto loss;
                r2.versus(r2.attack(), r1.deffence());
                loss:
                Thread.Sleep(500);
            } while (r1.HP > 0 && r2.HP > 0);

            if (r1.HP == r2.HP)
                Console.WriteLine("Walka zakończona remisem");
            else if(r1.HP > r2.HP)
                Console.WriteLine("Zwycięża robot 1!\nPozostało HP: r1= {0}, r2={1}", r1.HP, r2.HP);
            else
                Console.WriteLine("Zwycięża robot 2!\nPozostało HP: r1= {0}, r2={1}", r1.HP, r2.HP);
            End:
            Console.ReadKey();
        }
    }

    public class Robot
    {
        public int HP = 10;
        int dmg = 0;
        static Random random = new Random();


        public int attack()
        {
            int attack = random.Next(5, 10);
            return attack;
        }

        public int deffence()
        {
            int deffence = random.Next(0, 10);
            return deffence;
        }

        public void versus(int atc, int def)
        {
            if (atc < def)
                Console.WriteLine("Block");
            else
            {
                dmg = atc - def;
                Console.WriteLine("Zadane obrażenia {0}!", dmg);
                HP -= dmg;
            }
        }
    }
}


http://www.megaupload.com/?d=IP8TMEOQ

Zależy mi na wszystkich opiniach i komentarzach, nawet tych najkrytyczniejszych :P
Pozdro
malymakar
Member
 
Posty: 38
Dołączył(a): N gru 11, 2011 2:24 pm

Re: Pierwszy projekt [newbie]

Postprzez NoBrain22 » Wt gru 27, 2011 4:45 pm

Wszystko byłoby ok, gdyby nie ta nieszczęsna instrukcja GoTo.
NoBrain22
Member
 
Posty: 30
Dołączył(a): So paź 16, 2010 7:30 pm

Re: Pierwszy projekt [newbie]

Postprzez malymakar » Wt gru 27, 2011 5:46 pm

no fakt, czytalem ze programiści raczej starają sie z niej nie korzystać, ale jakos nie mogłem znaleźć innego rozwiązania...
malymakar
Member
 
Posty: 38
Dołączył(a): N gru 11, 2011 2:24 pm

Re: Pierwszy projekt [newbie]

Postprzez NoBrain22 » Wt gru 27, 2011 5:55 pm

Zamiast tego goto użyj po prostu metod i instrukcji warunkowych.
NoBrain22
Member
 
Posty: 30
Dołączył(a): So paź 16, 2010 7:30 pm

Re: Pierwszy projekt [newbie]

Postprzez malymakar » Śr gru 28, 2011 1:23 pm

Jedno goto zostało, juz kompletnie nie wiedziałem jak je wyeliminować ;/ Co jeszcze mógłbym poprawić, dodać, usunąć?


Kod: Zaznacz cały
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace MyApp
{
    class KlasaGlowna
    {
        static void Main(string[] args)
        {
            Robot r1 = new Robot();
            Robot r2 = new Robot();
            FightPC fightpc = new FightPC();

            Console.WriteLine("Robots fight game.");
            Console.WriteLine("1. Computer vs Computer\n2. Player vs Computer\n3. Info\n4. End");

            MenuG:
            var key = Console.ReadKey(true);
            try
            {
            }
            catch(FormatException)
            {
                Console.WriteLine("Błędne dane. Wprowadź cyfrę 1-4.");
                goto MenuG;
            }
            switch (key.Key)
            {
                case ConsoleKey.D1:
                    do{
                    Console.WriteLine();
                    fightpc.FightPC1(r1, r2);
                    Thread.Sleep(500);
                    if(r1.HP < 0)fightpc.resoult(r1.HP, r2.HP);
                    fightpc.FightPC2(r1, r2);
                    Thread.Sleep(500);
                    } while (r1.HP > 0 && r2.HP > 0);
                    fightpc.resoult(r1.HP, r2.HP);
                    break;
                case ConsoleKey.D2:
                    do{
                    Console.WriteLine();
                    fightpc.FightPC1(r1, r2);
                    Thread.Sleep(500);
                    if(r1.HP < 0)fightpc.resoult(r1.HP, r2.HP);
                    fightpc.FightPC2(r1, r2);
                    Thread.Sleep(500);
                    } while (r1.HP > 0 && r2.HP > 0);
                    fightpc.resoult(r1.HP, r2.HP);
                    break;
                case ConsoleKey.D3:
                    Console.WriteLine("Ver. 1.0 beta\nCreated by t0m3k");
                    goto MenuG;
                case ConsoleKey.D4:
                    Console.WriteLine("Zapraszamy ponownie...");
                    break;
                default:
                    Console.WriteLine("Błędne dane. Wprowadź cyfrę 1-4.");
                    goto MenuG;
            }

            Console.ReadKey();
        }
    }

    public class Robot
    {
        public int HP = 10;
        int dmg = 0;
        static Random random = new Random();


        public int attack()
        {
            int attack = random.Next(5, 10);
            return attack;
        }

        public int deffence()
        {
            int deffence = random.Next(0, 10);
            return deffence;
        }

        public void versus(int atc, int def)
        {
            if (atc < def)
                Console.WriteLine("Block");
            else
            {
                dmg = atc - def;
                Console.WriteLine("Zadane obrażenia {0}!", dmg);
                HP -= dmg;
            }
        }
    }

    public class FightPC
    {
        public void FightPC1(Robot r1, Robot r2)
        {
            r1.versus(r1.attack(), r2.deffence());
        }

        public void FightPC2(Robot r1, Robot r2)
        {
            r2.versus(r2.attack(), r1.deffence());
        }

        public void resoult(int HpPc1, int HpPc2)
        {
            if (HpPc1 == HpPc2)
                Console.WriteLine("Walka zakończona remisem");
            else if (HpPc1 > HpPc2)
                Console.WriteLine("Zwycięża robot 1!\nPozostało HP: r1= {0}, r2={1}", HpPc1, HpPc2);
            else
                Console.WriteLine("Zwycięża robot 2!\nPozostało HP: r1= {0}, r2={1}", HpPc1, HpPc2);
        }
    }
}


I jeszcze jedno, coś jest chyba nie tak z blokiem try... niby wszystko działa prawidłowo, ale męczy mnie to, że
Kod: Zaznacz cały
var key = Console.ReadKey(true);
powinno być w bloku, a nie przed nim, ale jak wstawie to krzyczy mi, ze nie jest zadeklarowane key. Natomiast jak chce zadeklarowac przed blokiem var key; to nie trybi ;/
malymakar
Member
 
Posty: 38
Dołączył(a): N gru 11, 2011 2:24 pm

Re: Pierwszy projekt [newbie]

Postprzez Cubix651 » Śr gru 28, 2011 2:51 pm

Po 1. radzę poczytać o typach danych. Dzięki słowu kluczowemu var nie musimy podawać ręcznie typu, jest on rozpoznawany na podstawie typu zwracanego przez metodę po prawej stronie operatora przypisania. Jeśli nie przypisujemy od razu, to kompilator nie wie, jakiego typu będzie to zmienna. Wtedy trzeba to zrobić ręcznie.
Kod: Zaznacz cały
//...
ConsoleKeyInfo key;
try
{
      key = Console.ReadKey(true);
}
//...

A po 2, po co łapiesz wyjątek FormatException, skoro metoda ReadKey() może wyrzucić tylko InvalidOperationException? http://msdn.microsoft.com/en-us/library/471w8d85.aspx
Avatar użytkownika
Cubix651
Member
 
Posty: 353
Dołączył(a): Cz sty 03, 2008 5:17 pm

Re: Pierwszy projekt [newbie]

Postprzez Radomiej » Śr gru 28, 2011 10:03 pm

Jak się już tak bawisz konsolą to może zrób prostą grę w stylu Roguelike:)
Radomiej
Member
 
Posty: 53
Dołączył(a): So gru 24, 2011 7:52 pm

Re: Pierwszy projekt [newbie]

Sponsors

Sponsor
 


Powrót do Projekty i kody źródłowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość