Pierwszy projekt C#

0

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.


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

0

Zasiadanie do nauki C# z książką od BASICa to nie jest najlepszy pomysł.

W każdym razie, nie polecam ci nauki korzystając z randomowych artykułów i tutoriali z internetu, bo nie potrafisz ocenić z czego warto, a z czego nie warto korzystać (i wybierasz tylko te drugie).

0

Nie czytalem kodu ale kibicujesz mega druzynie. Glory glory.

0

Przedobrzyłeś z tym goto.

0

no wiem wiem, ale jakoś nie mogłem rozkminić jak by to inaczej zrobić...

0

Podziel to na mniejsze funkcje i użyj odpowiednio pętli, to goto stanie się zbędne.

0

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

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

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 ;/

0

Wyrzuć ten kod i zacznij od początku, bo i tak i tak trzeba tutaj zmienić wszystko. I kup w końcu jakąś książkę o programowaniu, bo w pisaniu czegokolwiek w praktyce nie ogarniając takich podstawowych rzeczy jak zasięg zmiennych nie zajdziesz daleko.

A już używanie angielskiego na siłę robiąc błędy ortograficzne w co drugim wyrazie to przesada :/.

0

Umieść menu w pętli while, której wykonanie będzie uzależnione od wartości flagi np. typu bool, dzięki temu pozbędziesz się goto z kodu. Wartość flagi zmieniaj w kodzie w zależności od tego jak ma się zachować program.

Przykładowo:

bool flaga = true;
string choice;

while (flaga)
{
  Console.WriteLine("Menu:");
  Console.WriteLine("1. Wydrukuj 1");
  Console.WriteLine("2. Wyjdz");
  Console.WriteLine("Twoj wybor?: ");
  choice = Console.ReadLine();
  switch(choice) {
    case "1": Console.WriteLine("1"); break; //pozostawiamy bez zmian, dzieki czemu petla wykona sie ponownie
    case "2": flaga=false; break; //zmieniamy flagę na false dzieki czemu menu petla sie wiecej nie wykona
    default: break; //w innym wypadku pozostawiamy bez zmian, dzieki czemu petla wykona sie ponownie
  }
}

Btw. polecam na początek ten tutorial:
http://msdn.microsoft.com/pl-pl/library/cc676524.aspx#ID0EVFAC

0

Nudna gierka... Dodaj jakąś grafike ;p

Jak ktoś tam wyżej napisał żebyś się nie uczył na początek z randomowych tutoriali w necie podzielam jego zdanie.
Na początku też się z takich uczyłem jedak gdy kurier zapukał do mych drzwi z paczką której zawartością była książka do C# dużo lepiej mi się uczy.
Dobrze jest opisane nie jak w necie przedstawiamy i lecimy dalej ;p

Dodaj jakieś skile może jeszcze co obniżaja defa lub zwiększają atak!;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0