C# Verwendung der nicht zugewiesenen lokalen Variable?

locomarco

Commander
Registriert
Aug. 2009
Beiträge
2.446
Hi, ich hab hier ein kleines Problem das ich echt nicht kapieren.

Ich habe Gestern zur Übung ein kleines "Spiel" (wenn man es so nenn kann) in VC++ geschrieben.

C++
Code:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <ctime>
using namespace std;

int main()
{
	start:
	
	int hp_spieler = 100, hp_gegner = 100;
	string attacke;

	while(hp_spieler > 0 && hp_gegner > 0)
	{
		system("cls");
		srand(time(NULL)/3);
		int attacke_gegner = 0 + rand()%(29-0+1);
		string att_name;
		
		cout << endl << "Du: " << hp_spieler << "HP" << "  -  " << "Gegner: " << hp_gegner << "HP" << endl << endl;
		cout << "Wie willst du angreifen?" << endl;
		cout << "    ___________________________" << endl;
		cout << "   #  Angriff     |    Schaden #" << endl;
		cout << "   #              |            #" << endl;
		cout << "   #   Schlag     |       5    #" << endl;
		cout << "   #   Tritt      |       10   #" << endl;
		cout << "   # Messerhieb   |       20   #" << endl;
		cout << "    ___________________________" << endl << endl;
		cout << "Tippe den Angriff einfach ein und bestaetige mit Enter" << endl << endl;
		cin >> attacke;
		cout << endl;

		if(attacke == "Schlag")
		{
			hp_gegner -= 5;
		}
		else if(attacke == "Tritt")
		{
			hp_gegner -= 10;
		}
		else if(attacke == "Messerhieb")
		{
			hp_gegner -= 20;
		}

		
		switch(attacke_gegner)
		{
		case 0:
        case 3:
        case 6:
		case 9:
        case 12:
        case 15:
		case 18:
        case 21:
        case 24:
		case 27:
			att_name = "Schlag";
			hp_spieler -= 5;
		}
		switch(attacke_gegner)
		{
		case 1:
        case 4:
        case 7:
		case 10:
        case 13:
        case 16:
		case 19:
        case 22:
        case 25:
		case 28:
			att_name = "Tritt";
			hp_spieler -= 10;
		}
		switch(attacke_gegner)
		{
		case 2:
        case 5:
        case 8:
		case 11:
        case 14:
        case 17:
		case 20:
        case 23:
        case 26:
		case 29:
			att_name = "Messerhieb";
			hp_spieler -= 20;
		}

		cout << "Dein Gegner hat dich mit " << att_name << " angeriffen!" << endl << endl << endl;
		system("pause");
	}
	
	if(hp_spieler <= 0)
	{
		cout << endl << "Du hast Verloren!" << endl << endl;
	}
	else if(hp_gegner <= 0)
	{
		cout << endl << "Du hast Gewonnen!" << endl << endl;
	}

	system("pause");
	goto start;

}

Das Funktioniert soweit auch wie es soll.
Heute hab ich Versucht das in C# zu übersetzen. Allerdings bekomme ich an einer Stelle den Fehler Verwendung der nicht zugewiesenen lokalen Variablen "att_name".
Der Fehler kommt in Zeile 101 bei
Console.WriteLine("Dein Gegner hat dich mit {0} angeriffen!\n\n", att_name);
att_name wird doch vor der while Schleife Deklariert und bekommt dann von einem der if-Blöcke einen Wert (Schlag, Tritt oder Messerhieb) zugewiesen.
Wenn ich die betroffene Zeile auskommentiere, bekomm ich die Warnung das ich att_name deklariert habe, es aber nie benutzt wird.

Kann mir das jemand erklären?

C#
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using nsClearConsole;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            ClearConsole ClearMyConsole = new ClearConsole();
            
            start:

            int hp_spieler = 100, hp_gegner = 100;
            int attacke_gegner;
            string attacke;
            string att_name;
         
            while (hp_spieler > 0 && hp_gegner > 0)
            {
                ClearMyConsole.Clear();

                Console.WriteLine("\nDu: {0} HP  -  Gegner: {1} HP",hp_spieler, hp_gegner);
                Console.WriteLine("Wie willst du angreifen?");
                Console.WriteLine("    ___________________________");
                Console.WriteLine("   #  Angriff     |    Schaden #");
                Console.WriteLine("   #              |            #");
                Console.WriteLine("   #   Schlag     |       5    #");
                Console.WriteLine("   #   Tritt      |       10   #");
                Console.WriteLine("   # Messerhieb   |       20   #");
                Console.WriteLine("    ___________________________\n");
                Console.WriteLine("Tippe den Angriff einfach ein und bestaetige mit Enter\n");
                attacke = Convert.ToString(Console.ReadLine());
                Console.WriteLine();

                if (attacke == "Schlag")
                {
                    hp_gegner -= 5;
                }
                else if (attacke == "Tritt")
                {
                    hp_gegner -= 10;
                }
                else if (attacke == "Messerhieb")
                {
                    hp_gegner -= 20;
                }


                Random zufall = new Random();
                attacke_gegner = zufall.Next(0, 29);
                
                if(attacke_gegner == 0 ||
                   attacke_gegner == 3 ||
                   attacke_gegner == 6 ||
                   attacke_gegner == 9 ||
                   attacke_gegner == 12 ||
                   attacke_gegner == 15 ||
                   attacke_gegner == 18 ||
                   attacke_gegner == 21 ||
                   attacke_gegner == 24 ||
                   attacke_gegner == 27) 
                {
                        att_name = "Schlag";
                        hp_spieler -= 5;
                }
                else if(attacke_gegner == 1 ||
                        attacke_gegner == 4 ||
                        attacke_gegner == 7 ||
                        attacke_gegner == 10 ||
                        attacke_gegner == 13 ||
                        attacke_gegner == 16 ||
                        attacke_gegner == 19 ||
                        attacke_gegner == 22 ||
                        attacke_gegner == 25 ||
                        attacke_gegner == 28)
                {
                        att_name = "Tritt";
                        hp_spieler -= 10;
                }
                else if(attacke_gegner == 2 ||
                        attacke_gegner == 5 ||
                        attacke_gegner == 8 ||
                        attacke_gegner == 11 ||
                        attacke_gegner == 14 ||
                        attacke_gegner == 17 ||
                        attacke_gegner == 20 ||
                        attacke_gegner == 23 ||
                        attacke_gegner == 26 ||
                        attacke_gegner == 29)
                {
                        att_name = "Messerhieb";
                        hp_spieler -= 20;
                }

                Console.WriteLine("Dein Gegner hat dich mit {0} angeriffen!\n\n", att_name);
                Console.ReadLine();
            }

            if (hp_spieler <= 0)
            {
                Console.WriteLine("\nDu hast Verloren!\n");
            }
            else if (hp_gegner <= 0)
            {
                Console.WriteLine("\nDu hast Gewonnen!");
            }

            Console.ReadLine();
            goto start;
        }

    }
}
 
Zuletzt bearbeitet:
Initialisier die Variable att_name einfach mit "" (leerer String) oder mit = NOTHING.
Denn es kann ja der Fall eintreten, dass keine deiner ganzen Bedingungen erfüllt wird, sodass versucht wird, eine Variable auszugeben, die keinen Wert zugewiesen bekommen hat.
 
Tip am Rande: Statt 30x zu schreiben "if attacke_gegner == xy" könntest du auch mit % überprüfen, welchen Wert du hast - oder gleich eine Zufallszahl erzeugen, die nur die Werte 0..2 annehmen kann :)
 
Erdmännchen schrieb:
Initialisier die Variable att_name einfach mit ""
Danke, das hat funktioniert :)
Denn es kann ja der Fall eintreten, dass keine deiner ganzen Bedingungen erfüllt wird, sodass versucht wird, eine Variable auszugeben, die keinen Wert zugewiesen bekommen hat.
Nein, der Fall kann bei dem Code nicht eintreten :D

toeffi schrieb:
Hier in C# nimmst du lieber string.Empty.
Wie benutzt man das denn?
Einfach string str = String.Empty?

EDIT:
@NullPointer:
Wenn ich die Zufallszahl nur von 0-2 mache, dann bekomm ich immer so oft hintereinander die gleiche Zahl, deswegen hab ich mehr genommen.
 
Zuletzt bearbeitet:
Ganz einfach

Code:
string att_Name = string.Empty;
Ist aber das selbe wie
Code:
string att_Name = "";
Wollte nur der Richtigkeit halber sagen das es nothing so in C# nicht gibt, sondern nur in VB.
 
Hast du "Next(0, 2)" oder "Next(0,3)" geschrieben? Letzteres wäre richtig, ersteres liefert dir nämlich nur 0 oder 1 als Ergebnis. (Genauso müßtest du oben eigentlich schreiben "Next(0, 30)", aber bei dem größeren Zahlenbereich fällt das nicht so auf...)
 
Ich hatte "Next(0, 2)". Das würde dann natürlich einiges erklären :D
 
Zurück
Oben