Permalänk

hjälp med programmering 1 c#

hej, ska skapa ett spel där jag ska använda mig av en array med 5 index, där användaren ska kunna lägga till 5 ord som sedan ska kunna användas för att man ska ta dom orden användaren har skrivit in och random ta fram ett ord som användaren själv ska gissa sig fram till rätt ord.

vet att man ska använda sig av en while-loop tills användaren gissar rätt och annars ska det bara fortsätta tills ordet är rätt.
vet dock inte hur jag ska få till så att man använder sig av sin array för att random ta ett ord och sedan låta användaren gissa sig fram, har letat skitlänge och inte hitta något. har en bok som "ska" vara till hjälp men den förklara så dåligt och den ger inget vettigt att använda så skulle behöva lite hjälp.

så här långt har jag kommit än så länge.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Projekt___komplettering { class Program { static void Main(string[] args) { string[] spelord = new string[5]; bool isRunning = true; while (isRunning) { Console.WriteLine("\n\t------Välkommen till Menyn------"); Console.WriteLine("\n\t[1] Mata in spelord"); Console.WriteLine("\n\t[2] Mata in gissning"); Console.WriteLine("\n\t[3] Avsluta spelet"); Console.Write("Välj mellan 1-3: "); int menyVal = Convert.ToInt32(Console.ReadLine()); int.TryParse(Console.ReadLine(), out menyVal); switch (menyVal) { case 1: Console.WriteLine("\tMata in spelord"); spelord[0] = Console.ReadLine(); spelord[1] = Console.ReadLine(); spelord[2] = Console.ReadLine(); spelord[3] = Console.ReadLine(); spelord[4] = Console.ReadLine(); Console.Clear(); break; case 2: Console.WriteLine("\tMata in gissning"); while (true) { Console.WriteLine("Grattis du har gissat rätt"); } case 3: isRunning = false; break; default: Console.WriteLine("\n\tFelaktig inmatnig, pröva något annat"); break; } Console.ReadLine(); } } } }

Lagt till [code]-taggar //mod
Permalänk

Du får nog skriva mer specifikt vad du behöver hjälp med?

Permalänk

glömde det, la till det där uppe

Permalänk
Medlem
Skrivet av freshadesha:

vet dock inte hur jag ska få till så att man använder sig av sin array för att random ta ett ord och sedan låta användaren gissa sig fram, har letat skitlänge och inte hitta något.

Vilken del är det du har problem med? Att slumpa fram ett index? För det kan du använda Random:

Random rnd = new Random(); int index = rnd.Next(0, 5); // 0 <= index < 5

Notera gränserna ovan, det lägsta värdet som kommer returneras är 0 och det största 4 (inte 5). Random är sen inte slumpmässig på riktigt, vilket kan skapa problem om du anropar new Random() flera gånger i följd. Du kan läsa mer om det här om du är intresserad.

Permalänk

@perost:

så om jag lägger till så här:

bool isRunning = true; while (isRunning) { Console.WriteLine("\n\t------Välkommen till Menyn------"); Console.WriteLine("\n\t[1] Mata in spelord"); Console.WriteLine("\n\t[2] Mata in gissning"); Console.WriteLine("\n\t[3] Avsluta spelet"); Console.Write("Välj mellan 1-3: "); int menyVal = Convert.ToInt32(Console.ReadLine()); int.TryParse(Console.ReadLine(), out menyVal); switch (menyVal) { case 1: Console.WriteLine("\tMata in spelord"); spelord[0] = Console.ReadLine(); spelord[1] = Console.ReadLine(); spelord[2] = Console.ReadLine(); spelord[3] = Console.ReadLine(); spelord[4] = Console.ReadLine(); Console.Clear(); break; case 2: Console.WriteLine("\tMata in gissning"); Random word = new Random(); int index = word.Next(0, 5); while (true) { Console.WriteLine("Grattis du har gissat rätt"); } case 3: isRunning = false; break; default: Console.WriteLine("\n\tFelaktig inmatnig, pröva något annat"); break; } Console.ReadLine();

blir det rätt då eller kommer jag behöva lägga till mer grejer för att få det att funka och vad isåfall?

Permalänk

eller hur ska jag skriva för när jag gör att man skrivit in fel ord så att loopen körs igen tills det blir rätt?

Permalänk
Medlem

@freshadesha: Då har du ett index du kan använda för att plocka ut ett slumpmässigt ord ur arrayen, ja. Sen måste du förstås lägga till kod för att faktiskt låta användaren gissa också. Just nu slumpar du ju bara fram ett index som du sen inte använder.

Permalänk
Medlem
Skrivet av freshadesha:

eller hur ska jag skriva för när jag gör att man skrivit in fel ord så att loopen körs igen tills det blir rätt?

Du är lite svår att förstå ibland. Men för att få loopen att fortsätta tills du fått rätt ord kan du ha typ
PSUEDO:

slumpa ord
do {

ta inmatning
while (inmatning != ord)

Visa signatur

Corsair Air 540 | Asus strix x470-f gaming | AMD Ryzen 7 3700x| 2x8gb 3200mhz RAM | Asus GTX 2070 |2xSSD 512GB(boot) | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK, Benq 27" 144hz | Win 11 pro N 64-bit

Permalänk
Medlem
Skrivet av freshadesha:

eller hur ska jag skriva för när jag gör att man skrivit in fel ord så att loopen körs igen tills det blir rätt?

Just nu har du skrivit så att din while-loop alltid kommer att köras. Du måste på något vis kunna avsluta din loop, t.ex. när användaren gissat rätt ord.

bool continue = true; while(continue){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ continue = false; }else{ //Du har gissat fel } }

Det går även att göra på ditt sätt, men då måste du bryta loopen med "break;" där du vill att det ska brytas. T.ex.

while(true){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ break; }else{ //Du har gissat fel } }

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Skrivet av Pamudas:

Just nu har du skrivit så att din while-loop alltid kommer att köras. Du måste på något vis kunna avsluta din loop, t.ex. när användaren gissat rätt ord.

bool continue = true; while(continue){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ continue = false; }else{ //Du har gissat fel } }

Det går även att göra på ditt sätt, men då måste du bryta loopen med "break;" där du vill att det ska brytas. T.ex.

while(true){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ break; }else{ //Du har gissat fel } }

har skrivit in det här nu men får felmeddelande Operator '==' cannot be applied to operands of type 'string' and 'Random'. varför blir det så?

case 2: Console.WriteLine("\tMata in gissning"); Random word = new Random(); int index = word.Next(0, 5); while (true) { string Ord = Console.ReadLine(); if (Ord == word) { Console.WriteLine("Grattis du gissa rätt"); break; } else { Console.WriteLine("Du har gissat fel"); } } break;

Permalänk
Legendarisk
Skrivet av freshadesha:

blir det rätt då eller kommer jag behöva lägga till mer grejer för att få det att funka och vad isåfall?

Som andra redan har nämnt så har du nu bara slumpat fram ett index som sedan aldrig används för att testa gissningar. Fastnar man på den här typen av problem så kan det vara hjälpsamt att börja skriva ner vilka steg som behöver genomföras som så kallad pseudokod, och när man har en tydligare bild av stegen så kan man fokusera på hur det ska uttryckas i t.ex. C# som separata, mindre problem.

En rutin för gissningar skulle kunna se ut så här:

låt lösning = ett slumpvis valt ord i listan upprepa: låt gissning = ord från användaren till dess att gissning = lösning

Visa signatur

Abstractions all the way down.

Permalänk
Legendarisk
Skrivet av freshadesha:

har skrivit in det här nu men får felmeddelande Operator '==' cannot be applied to operands of type 'string' and 'Random'. varför blir det så?

Du jämför strängen i Ord mot word, som inte alls innehåller ett ord utan istället en instans av Random, din slumptansgenerator, och det är nonsens för kompilatorn. Hur jämför man ett äpple med ett päron? Du behöver använda slumptalsgeneratorn för att hitta ett index till din lista över ord, och ordet som lagrats på den motsvarande positionen är din lösning:

Random random = new Random(); String solution = spelord[random.Next(spelord.Length)]; String guess; do { guess = Console.ReadLine(); } while(guess != solution);

Visa signatur

Abstractions all the way down.

Permalänk
Medlem
Skrivet av freshadesha:

har skrivit in det här nu men får felmeddelande Operator '==' cannot be applied to operands of type 'string' and 'Random'. varför blir det så?

case 2: Console.WriteLine("\tMata in gissning"); Random word = new Random(); int index = word.Next(0, 5); while (true) { string Ord = Console.ReadLine(); if (Ord == word) { Console.WriteLine("Grattis du gissa rätt"); break; } else { Console.WriteLine("Du har gissat fel"); } } break;

Det du har tagit fram med Random är ett index. Detta index är alltså positionen i din array som du själv matat in värdena.
Du måste använda ditt index i din array för att på så vis kunna jämföra det värde som finns lagrat vid ditt index.
T.ex. ord == spelord[word]

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

fan sorry fattar nada, kan ni förklara på något annat sätt. känner mig helt ut och cyklar nu, men förstår ingenting....

Permalänk
Medlem
Skrivet av Pamudas:

T.ex. ord == spelord[word]

Du menar spelord[index].

Permalänk

https://www.draw.io/#G0By8h1fe2h1BqU2JDT2pMRjZia00

så här ska programmet fungera om det blir lättare att förklara.

Permalänk
Legendarisk
Skrivet av freshadesha:

fan sorry fattar nada, kan ni förklara på något annat sätt. känner mig helt ut och cyklar nu, men förstår ingenting....

Det här kanske hjälper?

// Låt variabeln "word" innehålla en slumptalsgenerator. // * Observera att "word" knappast är ett lämpligt namn för en sådan. Random word = new Random(); // Låt variabeln "index" innehålla ett slumpat tal 0 <= x < 5. // * Här bör du vara försiktig med "magiska tal" eftersom att subtila buggar // kan uppstå om du ändrar på antalet gissningar, det är säkrare att hänvisa // till spelord.Length eftersom att den alltid kommer innehålla rätt värde. int index = word.Next(0, 5); // Upprepa... // * Eftersom att du alltid vill köra loopen minst en gång så är det antagligen // bättre att använda sig av do { ... } while (condition); istället (ex. ovan). // * På det viset behöver inte heller de som senare läser koden leta efter villkor // eller avbrott längre ner eller skiljda från varandra. while (true) <<-------+ Loopa för alltid? { | // Låt variabeln "Ord" innehålla en rad text inläst från terminalen | // * Tidigare variabler har varit namngivna med små bokstäver och på engelska, | // din kod blir lättare att läsa om den är konsekvent formaterad. | // * Är "Ord" tillräckligt beskrivande? Är koden lättare att förstå om du | // t.ex. kallar variabeln "gissning" istället? | string Ord = Console.ReadLine(); | | // Jämför värdet i "Ord" mot värdet i "word". Eftersom att "Ord" innehåller | // text och "word" (förvirrande nog) innehåller en slumptalsgenerator så | // misslyckas jämförelsen. | // För att jämförelsen ska göra vad du vill så måste du jämföra gissningen | // med det ord i listan som har din slumpade position / index, och det kan du | // t.ex. göra så här: | // if(Ord == spelord[index]) | if (Ord == word) <<-------+ Villkor { | Console.WriteLine("Grattis du gissa rätt"); | break; <<-------+ Avbryt loopen } else { Console.WriteLine("Du har gissat fel"); } }

Ser inget där.

Visa signatur

Abstractions all the way down.