Kezdőoldal » Számítástechnika » Programozás » Kezdő C# programozó vagyok és...

Kezdő C# programozó vagyok és írtam egy kis kvízjátékot az órára. Hogyan kellene kiegészítenem, ha azt szeretném hogy a minden kérdés csak egyszer jelenjen meg körönként?

Figyelt kérdés

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace ConsoleApplication27

{

class Program

{

static void Main(string[] args)

{

Random r = new Random();

int pont = 0;



string val;


Console.WriteLine("Üdvözlöm a játékban!");

Console.WriteLine("Hogyan szólíthatom?");

string nev=Console.ReadLine();

Console.WriteLine("{0} Legyen Ön is Milliomos!",nev);

Console.WriteLine("A kategóriák a következőek: Történelem, Földrajz , Sport ");

Console.WriteLine("A kategóriáról döntsön a szerencse. Nyomjon le egy billentyűt");

do

{


Console.ReadKey();

int dob = r.Next(1, 3);

Console.WriteLine("{0}", dob);

if (dob == 1)

{

Console.WriteLine("A kategória: Történelem");

Console.WriteLine("Kérdés:Mikor volt a Mohácsi csata?");

int valasz = Convert.ToInt32(Console.ReadLine());


if (valasz == 1526)

{

Console.WriteLine("A valasz helyes!");

pont++;

}

else

{ Console.WriteLine("A valasz rossz"); }

}


else if (dob == 2)

{

Console.WriteLine("A kategória: Földrajz");

Console.WriteLine("Kérdés:Mi Törökország fővárosa?");

string valaszka = Console.ReadLine();


if (valaszka == "Ankara")

{

Console.WriteLine("A valasz helyes!");

pont++;

}

else

{

Console.WriteLine("A valasz rossz");


}

}


else if (dob == 3)

{

Console.WriteLine("A kategória: Sport");

Console.WriteLine("Kérdés:Hányszoros világbajnok Michael Schumaceher?");

int valasz = Convert.ToInt32(Console.ReadLine());


if (valasz == 7)

{

Console.WriteLine("A valasz helyes!");

pont++;

}

else

{ Console.WriteLine("A valasz rossz"); }

}

else

{

Console.WriteLine("hiba");


}


Console.WriteLine("Folytatja? i/n");

val = Console.ReadLine();


} while (val == "i") ;

Console.WriteLine("Köszönöm a játékot {0}! A végső pontszáma:{1}", nev, pont);


Console.ReadKey();


}

}

}



2019. márc. 3. 19:00
 1/3 anonim ***** válasza:

Hát legfőképp Objektumorientáltan, ahol például egy kérdés osztály nem ártana. Mellé tárolhatod, hogy az volt-e már, vagy pedig külön tárolsz referenciákat egy listában azokra amik nem voltak, és abból válogatsz mindig. Nagyon nem szép így ez a kód, tele van if-ekkel, meg hasonlókkal, de értékelem, hogy gyakorolsz.

Kezdetnek próbáld meg, amit mondtam, nézz utána, hogy működnek az osztályok, az c#-ban nagyon alap dolog, utána kezdd el függvényekbe rakni a dolgokat :)

2019. márc. 3. 21:46
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:

Először is, ezt a programba égetett kérdéssort felejtsd el. Helyette legyen egy fájlod, mondjuk valami ilyesmi formában:

Kérdés nehézségi szintje|kérdés|A válasz|B válasz|C válasz|D válasz|Helyes válasz indexe (0=A,3=D)

Például:

1|Mi Magyarország jelenlegi fővárosa?|Budapest|Bukarest|Kocsord|Pozsony|0

1|Mi az, aminek négy lába van, szék, de nem asztal?|Szék|Asztal|Józsi bá cigit vesz a boltban|Orbán VikThor|2

2|Mennyi 5+5*0|5|10|0|1|0


Mivel nehézségi szintekre osztottad az adatbázist, nem kell ellenőrizned, hogy egy adott kérdés szerepelt-e már, és a játékod is valósághűbb lett azáltal, hogy a 40.000.000 Ft-ot érő kérdést 5.000 Ft-os bemelegítő kérdésként teszed fel.


Felmerült egy fogalom, mégpedig a kérdés. Szóval húzzunk rá egy osztályt gyorsban:

class Question {

.. public int Level {get;}

.. public string QuestionText {get;}

.. public string[] PossibleAnswers {get;}

}


Joggal merülhet fel a vita, hogy a Question osztály felelőssége-e eldönteni, hogy egy adott kérdésre jó választ adtak-e meg, vagy egyszerűen csak tárja nyilvánosságra a helyes választ, aztán majd a játékvezérlő logika ellenőrzi. Válasszuk az utóbbit az egyszerűség kedvéért:

class Question {

.. //...

.. public int CorrectAnswerIndex {get;}

.. //Lehet vitázni azon is, hogy miért nem tömbként kérem be a válaszokat. Nos, a LÖIM-ben csak 4 válasz lehet, ezért. Egy tömböt pedig bármekkorára lehet méretezni, és nem látszik belőle, hogy hány eleműnek várjuk el.

.. public Question(int level, string questionText, string ansA, string ansB, string ansC, string ansD, int correctAnswer) {...}

.. //Csinálsz még Equals-t és GetHashCode-ot, de ez már menni fog neked is, nem? Ez azért kell, hogy el tudjuk dönteni, hogy két kérdés megegyezik-e.

}


Továbbá, lesz egy logika, ami a fájlunkat fogja felolvasni. De jó lenne azt nem teleszemetelni. Szóval akár még egy parse metódust is bevezethetünk rá, ami feldolgoz egy sort a fájlunkból:

class Question {

.. //...

.. //tehát a line egy lehetséges értéke: 2|Mennyi 5+5*0|5|10|0|1|0

.. public static Question Parse(string line) {

.. .. string[] parts = line.Split('|');

.. .. return new Question(paraméterezd fel a parts-ban tárolt értékekből);

.. }

}


Ízlés kérdése, hogyan tárolod a kérdéseidet. Lehet például

- Dictionary<int, List<Question>>, ahol a kulcs a kérdés nehézségi szintje, az érték pedig az ehhez a nehézségi szinthez tartozó kérdések, vagy egyszerűen csak

- IEnumerable<Question>, és majd LINQ-t használva bányásszuk nehézség alapján a kérdéseket.

Mindkettő teljesen életszerű, előbbit kicsit nehezebb kezelni de teljesítményben jobb. Maradjunk az utóbbinál, és csináljuk meg hozzá a fájl felolvasását:

class Program {

.. const string QuestionDatabaseFileName = "questions.txt";


.. public static void Main(string[] args) {

.. .. IEnumerable<Question> questions = LoadQuestions();

.. }


.. private static IEnumerable<Question> LoadQuestions() {

.. .. foreach (string line in File.ReadAllLines(QuestionDatabaseFileName))

.. .. .. yield return Question.Parse(line);

.. }

}


Innentől kezdve elég egyszerű. Kell valami, ami

- egy nehézségi szintnek megfelelően ad egy véletlenszerű kérdést, és valami, ami

- ellenőrzi, hogy egy kérdésre adott válasz helyes-e. Állapodjunk meg abban, hogy a játékos válaszként azt írja, hogy "A".


class Program {

.. //...

.. private static Question GetQuestion(IEnumerable<Question> questions, int level) {...}

.. private static bool CheckAnswer(Question question, string playerAnswer) {...}

}


Innentől kezdve a játék ennyi:

public static void Main(string[] args) {

.. IEnumerable<Question> questions = LoadQuestions();

.. bool gameOver = false;

.. for (int level = 1; !gameOver && level <= 15; level++) {

.. .. Question q = GetQuestion(questions, level);

.. .. //kiíratod a kérdést és a válaszokat, illetve szépen megkéred a játékost, hogy tippeljen

.. .. string guess = Console.ReadLine(); //nem ártana újra bekérni a tippet, ha nem "a", "b", "c" vagy "d" betűt írt be, de ezzel most nem foglalkozunk

.. .. if (!CheckAnswer(q, guess)) { gameOver = true; Console.WriteLine("Helytelen válasz."); }

.. .. else Console.WriteLine("Helyes válasz");

.. }

.. Console.WriteLine("Vége a játéknak.");

}

2019. márc. 4. 00:39
Hasznos számodra ez a válasz?
 3/3 anonim ***** válasza:

.. //Csinálsz még Equals-t és GetHashCode-ot, de ez már menni fog neked is, nem? Ez azért kell, hogy el tudjuk dönteni, hogy két kérdés megegyezik-e.

Bocsmá, ez nem kell.

2019. márc. 4. 00:41
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!