Laden...

Forenbeiträge von ingram333 Ingesamt 72 Beiträge

03.05.2009 - 16:10 Uhr

aha, so geht das also. Danke hat wunderbar geklappt!

Ist zwar sicher nicht die beste Telefonbuch Suche die jeh geschrieben wurde,
aber sollte reichen zum bestehen.

Danke noch mal für eure Zeit.

02.05.2009 - 22:08 Uhr

Vielen Dank erstmal für eure hilfreichen Antworten.

Ich hab den ersten Tip (nachdem ich mich erstmal einlesen musste)
mal versuchsweise umgesetzt.


public class Eintrag : IComparable
    {
        string name;
        string vorname;
        string ort;
        long telefonNummer;

       public Eintrag(string name, string vorname, string ort, long telefonNummer)
        {
            this.name = name;
            this.vorname = vorname;
            this.ort = ort;
            this.telefonNummer = telefonNummer;
        }

       // we need to overwrite ToString() to use our own structure
       // and handling the long value
       public override string ToString()
       {
           return String.Format("{0} {1} {2} {3}", this.name,
                this.vorname, this.ort, this.telefonNummer.ToString());
       }
       
      //implementing ICompare for telefon numbers, so they are our new index
      public int CompareTo(object obj)
       {
           if (obj is Eintrag)
           {
               Eintrag a1 = (Eintrag)obj;
               return this.telefonNummer.CompareTo(a1.telefonNummer);
           }
           else
               throw new ArgumentException("Wrong Object Type!");
       }
    }

    
    class Telefonbuch
    {
        static void Main(string[] args)
        {
            
            // first option, sort the array by number
            ArrayList entriesBynumber = new ArrayList();
            entriesBynumber.Add(new Eintrag("Aname", "Anton", "Frankfurt", 03912345678));
            entriesBynumber.Add(new Eintrag("Bname", "Peter", "Aachen", 04912345678));
            entriesBynumber.Add(new Eintrag("Cname", "Franz", "Ulm", 05912345678));
            entriesBynumber.Add(new Eintrag("Dname", "Franz", "Ulm", 01912345678));

            // Sort() now uses the telefon numbers as index thanks to ICompare
            entriesBynumber.Sort();

            foreach (Eintrag e in entriesBynumber)
            {
                Console.WriteLine(e);
            }

            Console.ReadLine();

            
        }
    }

Funktioniert soweit prima, aber wie kann ich das nun in der Eintrag
Klasse für die anderen Suchkriterien auch verfügbar machen? Ich bin
ja nicht so der erfahrene Programmierer, aber rein von der logik kann
ich das doch so nur einmal pro Klasse machen, oder? Also müsste ich
nun verschiedene Eintrag Klassen erstellen und jeweils ein anderes
Kriterium bei ICompare angeben? Geht das ggf. eleganter?

Zur Suche werde ich dann mal String.Compare genauer anschauen, sieht
genau nachdem aus das ich gesucht habe, danke.

Das "long" war in der Aufgabenstellugn vorgegeben... hmm... ich lass
das erstmal so, aber danke für den Hinweis.

02.05.2009 - 19:07 Uhr

Hallo Community!

habe eine Aufgabe in der Uni, die ich nicht geknackt bekomme und hoffe
ihr könnt mir ein bisschen auf die Sprünge helfen.

Aufgabenstellung

"Gegeben sei die Klasse Eintrag:
public class Eintrag
{
string name;
string vorname;
string ort;
long telefonNummer;
}

Erstellen sie eine Klasse TelefonBuch. Jedes Telefonbuch hat eine Menge von
Einträgen und bietet Funktionen für die Suche nach Einträgen bei gegebener
Telefonnummer bzw. für die Suche nach Telefonnummern bei gegebenen
Werten für name, Vorname und Ort an. Setzen sie dazu (manuel!) binäre Suche ein."

Soweit ich verstanden habe, brauche ich also eine Klasse die Objekte der Klasse
Eintrag irgendwie speichert (array?) und zwei Suchfunktionen bietet: Einmal
Nummer, dafür gibts Name, Vorname und Ort und einmal genau umgekehrt.

Wie man generell eine binäre Suche in einem int[] durchführt ist mir klar,
darum gehts mir hier auch nicht wirklich. Was ich konkret nicht verstehe ist,
wie ich das ganze am besten aufbaue und wie man die binäre Suche auf diese
Einträge (Klassen) am besten anwendet.

Die Einträge in ein Array zu werfen war meine erster Versuch, aber ich kann
bei einer binären Suche ja nur Nummern und keine Strings vergleichen, zudem
besteht das array ja nicht aus einzelnen Werten sondern Objekten (damit komm
ich mal gar nicht klar). Dazu kommt, das je nach Kriterium das Ganze ja gar nicht
alphabetisch sortiert ist (also wenn ich nach der Nummer suche z.B.) muss ich
das dann vorher erstmal sortieren!?

Ich poste hier mal meinen Ansatz, auch wenn der sicherlich nicht so ganz richtig
ist.

Klasse Eintrag:


public class Eintrag
    {
        string name;
        string vorname;
        string ort;
        long telefonNummer;

       public Eintrag(string name, string vorname, string ort, long telefonNummer)
        {
            this.name = name;
            this.vorname = vorname;
            this.ort = ort;
            this.telefonNummer = telefonNummer;
        }
    }

Klasse Telefonbuch:


   class Telefonbuch
    {
       // static test with 5 Entries only
        Eintrag[] entries = new Eintrag[4];

        public Telefonbuch(Eintrag e1, Eintrag e2, Eintrag e3, Eintrag e4, Eintrag e5)
        {
            entries[0] = e1;
            entries[1] = e2;
            entries[2] = e3;
            entries[3] = e4;
            entries[4] = e5;
        }

        public long searchEntry(long number)
        {
            //do something to return correct name, surname and place
        }
        public long searchNumber(string name, string vorname, string ort)
        {
            //do something to return correct number
        }


Meine Versuche, das Array mit den Objekten in ein int[] zu verwandeln zeig ich
mal aus peinlichkeitsgründen lieber nicht, das geht sicherlich eh nicht wirklich so...

Vielen Dank für eure Zeit.

kind regards,
Ingram

29.11.2007 - 15:31 Uhr

du meinst


 SendKeys.SendWait("(%{F1})");

oder? Geht leider auch nicht... noch eine Idee? Irgendwie seltsam,
scheint immer nur die F-Taste ohne die STRG/ALT zu senden.

Gibts möglicherweise noch eine andere Methode diese Keys
zu senden?

Danke!

29.11.2007 - 02:52 Uhr

gut soweit hat nun alles geklappt, ich kann problemlos
die Tasten F1, F2,... an meine Anwendung senden und sie werden
auch aktzeptiert.

Was nur nicht funktioniert, ist die Kombination STRG+Fx und ALT+Fx
an die Anwendung zu senden.

Die folgenden Zeilen gehen alle nicht senden einfach nur F2


SendKeys.Send("^({F2})");
SendKeys.Send("^{F2}");

SendKeys.Send("%{F2}");

STRG und ALT scheinen einfach ignoriert zu werden... Jemand eine Idee?
Hab leider googlemäßig nix gefunden.

Danke!

27.11.2007 - 17:29 Uhr

supi, das wars, danke dir!!!

27.11.2007 - 17:12 Uhr

ok, habs fast hinbekommen. Mir fehlt nur eine Info, dich ich einfach nicht
ergoogelt bekomme und zwar:

Wo stehen die Keycodes für lParam bzw. vkCode?

Ich würde gerne schauen ob eine taste (z.B. F1) gedrückt wurde und
wenn ja eben statt dessen F1, F2, F3, Fx an das prog senden, aber ich
finde keine Tabelle mit diesen Keycodes (also woher weiß ich was F1 ist?).

Also etwa so:


  int vkCode = Marshal.ReadInt32(lParam);
  if (vkCode == "Wie frag ich hier nach F1?")
  { 
          SetForegroundWindow(calculatorHandle);
                SendKeys.SendWait("{F1}");
                SendKeys.SendWait("{F2}");
                SendKeys.SendWait("{F3}");
                SendKeys.SendWait("{F4}");
                SendKeys.SendWait("{F5}");
}


27.11.2007 - 00:49 Uhr

klingt super, kannst du mir da ein paar links bzw. suchbegriffe posten?

Merci!

26.11.2007 - 21:27 Uhr

Hi Community,

kann man mit C# folgendes umsetzen:

Ich möchte das wenn ich die F1 Taste drücke, das bei allen Programmen
statt dessen das Kommando: F1 (0.1s pause) F2 (0.1s pause) F3 ... ankommt.
also alle F-Tasten mit einem kurzem Abstand.

Problem ist, das soll dann bei allen laufenden Programmen so funktionieren,
daher hab ich die Befürchtung das es Kernel Sache ist...

Wenn jemand da ein Beispiel hat (egal welche Sprache, aber am besten C#)
wäre super!

Danke für eure Zeit.

27.06.2006 - 20:10 Uhr

achso, das ja nur eine Zeile, lol, hab mehr erwartet, danke nochmal 😉

27.06.2006 - 19:44 Uhr

muss ich mich mal einlesen danke, hättest du gütigerweise
einen pseudocode bzw. die nötigen Methodennamen für mich?

Danke für deine Zeit.

27.06.2006 - 19:34 Uhr

8o oh man... danke, wieso und wo ich jetzt den strangen Methodenaufruf
her hab kann ich dir auch nicht sagen.

ok, das scheint jetzt so einigermaßen zu klappen (siehe Anhang),
gehe ich recht in der Annahme, das ich jetzt bitblt und masks einsetzen
muss um das schwarz aus den tiles transparent zu machen (damits
halt "richtig" aussieht)?

27.06.2006 - 15:51 Uhr

Hallo Leute,

ich versuche mich gerade an einem Map-Editor für ein isometrisches
Spiel und habe mich mal an einer "Diamond" Karte versucht, wie
hier beschrieben:
http://www.djs4life.de/Iso-Tut/Teil2.htm

Jetzt hab ich dann mal eine kleine Anwendung geschrieben, die mir
ein 64x64 grosses Tile als 64x32 grosses rectangle auf mein Form
zeichnet. Klappt auch soweit wunderbar, nur sobald ich versuche
dieses "tile walking" zu implementieren kommt alles andere als
eine wie in dem Tutorial abgebildete Karte dabei raus (es ist eher
ein langer Strick aus Bitmaps, siehe Screenshot im Anhang).

Daher meine Frage, ist die Formel:
PositionX = (X-Koordinate auf Map - Y-Koordinate auf Map) * Breite eines Tiles / 2
PositionY= (X-Koordinate auf Map + Y-Koordinate auf Map) * Höhe eines Tiles / 2

überhaupt korrekt wie im Tutorial beschrieben?

wenn ja hab ich wohl was falsch im code, wäre nett wenn mich wer
drauf stoßen könnte 😉


/* Algorithmus zum erstellen der Diamondkarte */
for(i=0;i<=mapWidth;i++)
{
    for(j=0;j<=mapWidth;j++)
	{
	plotX=(i-j)*(tileWidth/2);
	plotY=(i+j)*(tileHeight/2);
	DrawDiamond(plotX,plotY,g);
		
	}
}
.
.
.
private void DrawDiamond(int offsetX, int offsetY, Graphics g)
{
 	Bitmap MyBitmap = new Bitmap("test.bmp");
 	Rectangle myRec = new Rectangle(offsetX, tileWidth,offsetY,tileHeight);
 	g.DrawImage(MyBitmap, myRec);
}

Gleich noch eine Frage zum gleichen Thema, hat jemand mal ein Beispiel
wie man BitBlt mit C# anwendet um Masked Tiles zu erzeugen? Ich find
immer nur C++ code und den kann ich so schlecht entziffern...

Danke fürs lesen dieses Postings!

17.02.2006 - 11:29 Uhr

danke für die Aufklärung Jungs, da wäre ich selber nie drauf
gekommen!

17.02.2006 - 02:16 Uhr

nein, lediglich eine Klasse mit einzelnen Methoden, ich ruf
die Random Methode mehrmals auf, aber sonst gibts nur
einen Methodenaufruf aus der Main herraus auf die gesamte
Verteilungssache.

17.02.2006 - 02:05 Uhr

also dein Beispielprogramm läuft ohne Probleme...
ich bin echt ratlos was das jetzt sein könnte, weil rein
von der Programmierlogik, sollte doch eine Ausgabe nie
einen externen Einfluss auf eine Schleife etc. haben.

17.02.2006 - 00:34 Uhr

Ändert leider nichts, weiterhin mit auskommentierter
Zeile falsch und sobald das COnsole.WriteLine wieder
drin steht, gehts...

*verzweifel*

17.02.2006 - 00:17 Uhr

gib mir einen guten für das Problem 😉

17.02.2006 - 00:06 Uhr

Hi folks,

ich hab hier einen ganz seltsamen Fehler in meinem
Code, den ich mir überhaupt nicht erklären kann.

also erstmal der Code:


private static int Randomizer(int startvalue)
		{
			 Random random = new Random();
             return random.Next(startvalue)+1;
		}

 for(i=(tmpkunden/2); i>=0; i--)
			 {
			 	int tmpsorte = Randomizer(5);
			 	//Console.WriteLine("Randomverteiler:" + tmpsorte);
			 	switch (tmpsorte)
			 	{
			 		case 1:
			 			sorte1kunden++;
			 			break;
					case 2:
			 			sorte2kunden++;
			 			break;			 			
					case 3:
			 			sorte3kunden++;
			 			break;			 			
					case 4:
			 			sorte4kunden++;
			 			break;
					case 5:
			 			sorte5kunden++;
			 			break;			 			
			 	}
Console.WriteLine("Kunden Sorte1 nach 1. Verteilung: " + sorte1kunden);
			 Console.WriteLine("Kunden Sorte2 nach 1. Verteilung: " + sorte2kunden);
			 Console.WriteLine("Kunden Sorte3 nach 1. Verteilung: " + sorte3kunden);
			 Console.WriteLine("Kunden Sorte4 nach 1. Verteilung: " + sorte4kunden);
			 Console.WriteLine("Kunden Sorte5 nach 1. Verteilung: " + sorte5kunden);

tmpkunden ist ein festgelegter Wert von 3000

Also, führe ich den Code so aus wie er ist
stimmt die Verteilung nicht, es bekommen immer nur zwei Variablen
Werte zugeteilt oder manchmal keine, aber es verteilt sich nie
relativ zufallsmässig zwischen allen, wie man es von der Random
Methode erwarten würde.

Beispielausgaben:
Kunden Sorte2 nach 1. Verteilung:2401
Kunden Sorte2 nach 1. Verteilung:0
Kunden Sorte2 nach 1. Verteilung:0
Kunden Sorte2 nach 1. Verteilung:0
Kunden Sorte2 nach 1. Verteilung:0

oder

Kunden Sorte2 nach 1. Verteilung:1866
Kunden Sorte2 nach 1. Verteilung:0
Kunden Sorte2 nach 1. Verteilung:0
Kunden Sorte2 nach 1. Verteilung:0
Kunden Sorte2 nach 1. Verteilung:693

und jetzt kommt der seltsamste Fehler den ich jemals hatte:
Sobal ich die auskommentierte Zeile oben im code:
//Console.WriteLine("Randomverteiler:" + tmpsorte);
wieder einschalte, verteilt er plötzlich alles korrekt!

Beispielausgaben:
Kunden Sorte2 nach 1. Verteilung:416
Kunden Sorte2 nach 1. Verteilung:140
Kunden Sorte2 nach 1. Verteilung:240
Kunden Sorte2 nach 1. Verteilung:255
Kunden Sorte2 nach 1. Verteilung:1950

oder

Kunden Sorte2 nach 1. Verteilung:140
Kunden Sorte2 nach 1. Verteilung:416
Kunden Sorte2 nach 1. Verteilung:1805
Kunden Sorte2 nach 1. Verteilung:520
Kunden Sorte2 nach 1. Verteilung:120

Ich habs jetzt 50x mit den zwei verschiedenen codes getestet,
kann mir bitte jemand erklären wie eine simple Console.WriteLine
Anweisung eine derartige Veränderung erzeugen kann?

Oder ist das gar ein Bug in Sharpdevelop?
Oder übersehe ich irgendwas ganz banales!?

Ich benutzte .Net 2.0 und SharpDevelop 2.0

16.02.2006 - 15:39 Uhr

Hi folks,

ich möchte eine kleine Wirtschaftsfunktion zum
Thema Angebot und Nachfrage basteln, am besten
mal gleich ein Beispiel, das erklärts glaub ich am besten:

  1. Wir kaufen ein paar Waren ein

Steel Bought for: 5.00 Amount: 300
Stone Bought for: 6.00 Amount: 300
Wood Bought for: 3.00 Amount: 500

  1. Im nächsten Monat verkaufen wir sie nachdem wir
    einen Verkaufspreis gesetzt haben

Steel Selling for: 5.50
Stone Selling for: 6.80
Wood Selling for: 5.00

Meine frage nun, wie schreibe ich eine Methode, die den Absatz berechnet,
je nachdem wie hoch ich den Verkaufspreis setze!?

Ein paar ideen hab ich mir schon gemacht:

*man brauch die Nachfrage aller Personen wenns beim EK bleibe (also Max Einkäufer)
* man brauch den Prohibitivpreis (wenns allen zu teuer wird)
* man brauch die Elastizität des Angebots,
also (%Preisänderung / %Mengenänderung) um zu bestimmen
ob sich eine Preissenkung oder Preismehrung positiv auf den Umsatz
auswirkt.

Jetzt müsste man irgendwie noch eine Methode entwickeln um
eben den Absatzunterschied bei Preissteigerung/senkung zu haben...

Jemand ne Idee?

22.09.2005 - 23:23 Uhr

Hi folks!

Ich programmiere gerade an einem "Panzer General/Battle Isle" Clone
http://www.nux-acid.org/newhexfield.gif

Ich suche nun eine Lösung, mit der ich mein Hexfeld (siehe Image) nahezu
beliebig gross machen kann, es aber trotzdem nur in einem ca 500 x 600
pixel Ausschnitt zu sehen ist. Will man den Rest der Karte sehen, soll man in
alle Richtungen scrollen können...

Jemand eine Idee wie das gehen könnte? Hab für GDI+ leider nix gefunden...

Danke!

12.09.2005 - 22:54 Uhr

jo habs auch gerade rausbekommen, sollte ich mir auchmal angewöhnen...

Danke nochmal 🙂

12.09.2005 - 22:31 Uhr

danke dir, da kann ich mir schonmal alleine ne Menge an
Formatierung und Kommentaren abschaun (schieltvorsichtigaufseinkuddelmuddel)

1000 Dank für den Code! 🙂

...kleine Frage warum machst du das _ vor manchen Variablen?

12.09.2005 - 13:00 Uhr

Hehe, ja ging mir eigentlich primär darum wie du die Hexfelder
aufbaust und speicherst, wollte mal sehen ob das meinem
Kuddelmuddel etwas ähnelt, das mit den Zahlen drin währ halt
ein "nice Feature" um das A* ding schneller zu testen. Ich code
noch nicht sooo lange c#, daher dachte ich mir so mal einen
eine Blick auf einen etwas "besseren" code zu erhaschen 😉

Poste ruhig irgendwann mal, würd mich freuen 🙂

11.09.2005 - 22:34 Uhr

ach, kannst du mir den Code von dem Hexfeld mit der Nummerierung
geben, mit dem du oben das Bild gemacht hast?
Wäre mal interessiert wie sowas von einem Profi umesetzt wird so
zum Vergleich mit meinem Spaghetticode 😉

Ist zudem recht praktisch zum nachvollziehen vom A*.

11.09.2005 - 22:05 Uhr

ok, hast recht, das macht natürlich etwas aus... na dann... an die Vorschläge ran 😉

11.09.2005 - 20:55 Uhr

ja, es ging mir eher darum ob es nicht mit dem Umschalten
der Systemauflösung einfacher wäre, als diese ganzen
Anpassungen zu machen (sind einige Forms...).

Also z.B. aktuelle auflösung = 1024x768
Game startet = Auflösung 800x600
Game endet = wieder zurück auf 1024x768

Falls das wirklich nicht geht oder blödsinn ist, wollte ich mich
schon an seine Vorschläge wagen 😉

11.09.2005 - 14:52 Uhr

ok, denke dann hab ichs gelöst 🙂

Danke dir vielmals, ...man kann User in diesem Forum nicht
bewerten, oder? Ansonsten würd ich dir die absolute
Höchstwertung geben 😉

Danke nochmal!

11.09.2005 - 14:31 Uhr

Hab etwas...

Wenn man die Heuristic umstellt auf:


// "Manhattan Distance" - Used when search can only move vertically and 
// horizontally.
GoalEstimate = Math.Abs(xd) + Math.Abs(yd); 

Gibt er einen sinnvollen weg aus:
Starting...
X:0Y:0
X:0Y:1
X:1Y:2
X:1Y:3
X:2Y:4
X:2Y:5
X:3Y:5
X:4Y:5
X:5Y:5

Mich irritiert allerdings das Kommentar:
// "Manhattan Distance" - Used when search can only move vertically and
// horizontally.

Das ja bei mir nicht unbedingt der Fall...

11.09.2005 - 14:06 Uhr

ok hab ich, jetzt ist die Ausgabe:

X:0Y:0
X:0Y:1
X:1Y:2
X:2Y:2
X:2Y:3
X:2Y:4
X:3Y:4
X:4Y:4
X:4Y:5
X:5Y:5

(hab nur die Felder ausgeben lassen)

Da verwirrt mich nur [2,4] weil der Schritt IMHO wenn man
dein Bild betrachtet unnötig währe (es gibt noch keine
TerrainKosten, ist alles auf 1).

Danke dir 1000000x!!!

EDIT:

der Code:


AddSuccessor(ASuccessors,FX-1,FY);
			AddSuccessor(ASuccessors,FX+1,FY);
			AddSuccessor(ASuccessors,FX,FY-1);
			AddSuccessor(ASuccessors,FX,FY+1);
			if(FY%2 == 1)
			{
				// ungerade Zeilen
				AddSuccessor(ASuccessors,FX+1,FY-1);
				AddSuccessor(ASuccessors,FX+1,FY+1);
			}
			else
			{
				// gerade Zeilen
				AddSuccessor(ASuccessors,FX-1,FY-1);
				AddSuccessor(ASuccessors,FX-1,FY+1);
			}

11.09.2005 - 13:46 Uhr

hmm... müssten aber nicht die koordinaten zumindest
stimmen? Weil, andere als diese hab ich ja nicht als
Lösung irgendwo.

Ausgegeben wird es derzeit so, aber ich brauche ja
eigentlich nur die Koordinaten jedes einzelnen
hexfeldes um es dann später auf die echten
hexfelder anzuwenden:


static public void PrintSolution(ArrayList ASolution)
		{
			for(int j=0;j<10;j++) 
			{
				for(int i=0;i<10;i++) 
				{
					bool solution = false;
					foreach(AStarNode2D n in ASolution) 
					{
						AStarNode2D tmp = new AStarNode2D(null,null,0,i,j);
						solution = n.IsSameState(tmp);
						if(solution)
							break;
					}
					if(solution)
						Console.Write("S ");
					else
						if(MainClass.GetMap(i,j) == -1)
						Console.Write("X ");
					else
						Console.Write(". ");
				}
				Console.WriteLine("");
			}
		}

Also auch wenn der Weg mit "S" falsch ist, müsste dann nicht trotzdem:
X: 0 Y: 0 Cost: 0 Est: 5 Total: 5
X: 0 Y: 1 Cost: 1 Est: 5 Total: 6
X: 1 Y: 2 Cost: 2 Est: 4 Total: 6
X: 1 Y: 0 Cost: 2 Est: 5 Total: 7
X: 1 Y: 1 Cost: 3 Est: 4 Total: 7
X: 2 Y: 2 Cost: 4 Est: 3 Total: 7
X: 2 Y: 3 Cost: 5 Est: 3 Total: 8
X: 3 Y: 4 Cost: 6 Est: 2 Total: 8
X: 2 Y: 1 Cost: 5 Est: 4 Total: 9
X: 3 Y: 3 Cost: 7 Est: 2 Total: 9
X: 4 Y: 4 Cost: 8 Est: 1 Total: 9
X: 4 Y: 5 Cost: 9 Est: 1 Total: 10
X: 4 Y: 3 Cost: 9 Est: 2 Total: 11
X: 5 Y: 4 Cost: 10 Est: 1 Total: 11

Korrekt sein? Weil die werden doch jetzt über die neu eingebaute
Nachbarmethode ermittelt, oder täusche ich mich jetzt!?
Wenn ich die Felder über X/Y nachverfolge, ist der Weg ziemlicher
blödsinn...

Danke!

11.09.2005 - 12:59 Uhr

Hi nochmal!

Also eine Kleinigkeit in der Logik scheint noch nicht zu funktionieren.

Die Originalfunktion war:


public override void GetSuccessors(ArrayList ASuccessors)
		{
			ASuccessors.Clear();
			AddSuccessor(ASuccessors,FX-1,FY  );
			AddSuccessor(ASuccessors,FX-1,FY-1);
			AddSuccessor(ASuccessors,FX  ,FY-1);
			AddSuccessor(ASuccessors,FX+1,FY-1);
			AddSuccessor(ASuccessors,FX+1,FY  );
			AddSuccessor(ASuccessors,FX+1,FY+1);
			AddSuccessor(ASuccessors,FX  ,FY+1);
			AddSuccessor(ASuccessors,FX-1,FY+1);
		}	

Ich hab sie jetzt so abgeändert:


public override void GetSuccessors(ArrayList ASuccessors)
		{
			ASuccessors.Clear();
			/*
			Für HexFelder:
			a[i,j-2]
			a[i,j+2]
			a[i,j-1]
			a[i,j+1]
			sowie 
			[i+1,j-1]
			a[i+1,j+1]
			bei den ungeraden Zeilen bzw.
			i-1,j-1]
			a[i-1,j+1]
			bei den geraden Zeilen. 
			  */
			AddSuccessor(ASuccessors,FX,FY-2);
			AddSuccessor(ASuccessors,FX,FY+2);
			AddSuccessor(ASuccessors,FX,FY-1);
			AddSuccessor(ASuccessors,FX,FY+1);
			if(FY%2 != 0)
			{
				AddSuccessor(ASuccessors,FX+1,FY-1);
				AddSuccessor(ASuccessors,FX+1,FY+1);
			}
			else
			{
				AddSuccessor(ASuccessors,FX-1,FY-1);
				AddSuccessor(ASuccessors,FX-1,FY+1);
			}
			
			
		}	

Wäre doch so richtig eingebaut, oder?

Mein HexArray wird gerade durch eine statische map dargestellt:


static int[,] Map = {
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 },
			{ 1,1, 1,1, 1,1, 1, 1, 1, 1 }
		};

Problem:

Wenn ich nun sage, suche mir einen Weg von:
AStarNode2D GoalNode = new AStarNode2D(null,null,0,5,5);
AStarNode2D StartNode = new AStarNode2D(null,GoalNode,0,0,);

Also von [0,0] nach [5,5] gibt er mir fologendes aus:


Starting...
X:	0	Y:	0	Cost:	0	Est:	5	Total:	5
X:	0	Y:	1	Cost:	1	Est:	5	Total:	6
X:	1	Y:	2	Cost:	2	Est:	4	Total:	6
X:	1	Y:	0	Cost:	2	Est:	5	Total:	7
X:	1	Y:	1	Cost:	3	Est:	4	Total:	7
X:	2	Y:	2	Cost:	4	Est:	3	Total:	7
X:	2	Y:	3	Cost:	5	Est:	3	Total:	8
X:	3	Y:	4	Cost:	6	Est:	2	Total:	8
X:	2	Y:	1	Cost:	5	Est:	4	Total:	9
X:	3	Y:	3	Cost:	7	Est:	2	Total:	9
X:	4	Y:	4	Cost:	8	Est:	1	Total:	9
X:	4	Y:	5	Cost:	9	Est:	1	Total:	10
X:	4	Y:	3	Cost:	9	Est:	2	Total:	11
X:	5	Y:	4	Cost:	10	Est:	1	Total:	11
S S . . . . . . . . 
S S . . . . . . . . 
. . S . . . . . . . 
. . S S S . . . . . 
. . . S S S . . . . 
. . . . . S . . . . 
. . . . . . . . . . 
. . . . . . . . . . 
. . . . . . . . . . 
. . . . . . . . . . 


Scheint ja irgendwie nicht annähernd der schnellste Weg zu sein,
ist da noch ein Fehler in meiner abgeänderten Methode oben,
oder liegt das an der heuristic?

Die HeuristicMethode ist derzeit:


/// <summary>
		/// Calculates the estimated cost for the remaining trip to the goal.
		/// </summary>
		public override void Calculate()
		{
			if(GoalNode != null) 
			{
				double xd = FX - ((AStarNode2D)GoalNode).X;
				double yd = FY - ((AStarNode2D)GoalNode).Y;
				// "Euclidean distance" - Used when search can move at any angle.
				//GoalEstimate = Math.Sqrt((xd*xd) + (yd*yd));
				// "Manhattan Distance" - Used when search can only move vertically and 
				// horizontally.
				//GoalEstimate = Math.Abs(xd) + Math.Abs(yd); 
				// "Diagonal Distance" - Used when the search can move in 8 directions.
				GoalEstimate = Math.Max(Math.Abs(xd),Math.Abs(yd));
			}
			else
			{
				GoalEstimate = 0;
			}
		}

10000000000000 Dank, ich habs jetzt fast denke ich (hoffe) 🙂

11.09.2005 - 12:36 Uhr

danke dir, ich bin schon etwas weiter gekommen!

10.09.2005 - 23:54 Uhr

ok, die Koordinaten für ein StartFeld und EndFeld bekomme ich jetzt
aus dem HexArray[i,j] und kann sie an A* übergeben.

...nun ist mir nur noch nicht klar wo ich das:

a[i,j-2]
a[i,j+2]
a[i,j-1]
a[i,j+1]
sowie
a[i+1,j-1]
a[i+1,j+1]
bei den ungeraden Zeilen bzw.
a[i-1,j-1]
a[i-1,j+1]
bei den geraden Zeilen.

bei dem Beispiel einbauen muss, damit er versteht das
es sich bei mir um kein "normales" 2D Grid handelt, sondern
das er die Nachbarn eben mit dem von dir genannten Weg
berechnen muss...
etwa bei:
"public override void GetSuccessors(ArrayList ASuccessors)" ?

10000 Dank!

10.09.2005 - 23:29 Uhr

leider immer noch so, das mein designtes Form links oben
in der Ecke "klebt", es ist jetzt nur ein "rahmen" in einer
höheren Auflösung (ich hab 1024 im System, designt ists
auf 800x600) drumherum.

10.09.2005 - 22:17 Uhr

ja das mit der Repräsentation war schonmal mein erstes Problem,
danke! Habs jetzt so in einem Array wie du vorgeschlagen hast
(derzeit 8x8 Felder zum test, also int HexArray[8,8]).

Aber ich muss doch wenn ich jetzt weiss welches die Nachbarn sind
so einen "Suchbaum" aufbauen (hat man mir gesagt), damit A*
weiss welche Felder Zugriff auf andere haben, oder?
In anderen Implementationen hab ich dafür auch solche "maps"
gesehen die ca. so aussahen "static map[,] = {1,1,1,1,1,1,-1,-1 ...}"
wobei -1 unpassabel und 1 passable war... oder brauch ich das nicht?

2000 Dank 😉

10.09.2005 - 21:16 Uhr

könnte man theoretisch die Forms für z.B. 800x600
designen und die aktuelle Auflösung des Systems bei Start
des Programms einfach umstellen? Dann würde es ja passen... oder?

Wenn ja, wie würde das gehen? Spricht da was dagegen?

Danke!

10.09.2005 - 21:10 Uhr

hmm, ich glaub ich hab soviel gelesen, das ich nicht mehr
weiss wo vorne und hinten ist bei dem Thema,
kannst du mir einen PseudoCode posten was
ich tun müsste um mein Sechseckfeld mit A*
zu implementieren? Gerade diese Sache mit
den "Nachbarn" in Nodes macht mir Kopfzerbrechen...

Falls ich da was komplett missverstehe bitte, bitte aufklären 😉
Vielleicht einfach mal die "korrekte" Vorgehensweise
bei der Implementierung von A* posten, denke ich
bring da noch was durcheinander irgendwie.

10.09.2005 - 20:11 Uhr

Hi folks!

Ich versuche gerade verzweifelt seit einigen Tagen den
A* Alghorithmus im Bezug auf Wegpfindung zum laufen zu
kriegen, blicke aber einfach nicht ganz durch...

Gefunden habe ich folgende Implementierung für C#:
http://www.codeproject.com/csharp/CSharpPathfind.asp

(wer andere für C# kennt bitte posten!)

Nur verwendet er in dem Artikel oben ein 2D Feld, wie in
den meisten Artikeln die ich gefunden habe. Ich möchte das
Ganze aber mit "Sechsecken" machen, finde aber dazu leider
nirgens einen Ansatz 🙁

Jemand dazu eine Idee? Bin echt verzweifelt was das Thema
Pathfinding angeht gerade...

Ein Bild wofür ich es brauche:
http://www.nux-acid.org/hexfeld.gif

Son Game ala "Battle Isle", geht darum wie eine Einheit
sich nun auf dem Feld bewegt.

04.09.2005 - 18:57 Uhr

danke habs!

04.09.2005 - 16:53 Uhr

Hi Leute!

Hab ein keines Problem mit dem Graphics handler bei OnPaint.

Situation:
Ich hab eine Klasse, in der einige Methoden den Handler
"Graphics g" benötigen, den ich zumindest innerhalb der MainForm
mit:


public void OnPaint(PaintEventArgs pea)
  		{
			Graphics g = pea.Graphics;

bekomme. Ich brauche also 'g' um einge Funktionen
in der Klasse aufzurufen.

Problem:
Die Klasse ist nicht innerhalb des MainForms und wird
auch erst in einem userControl instanziert, d.h. ich habe
in der Klasse selbst keinen Zugriff auf den Handler, genausowenig
wie im UserControl. Ich habe nun versucht innerhalb dieser
Klasse einen "override OnPaint" zu erstellen, da weiss er aber
nicht was er overriden soll.

Frage:
Wie komme ich ausserhalb meines MainForm, in meiner
Klasse oder dem UserControl an den
oben genannten "Graphics g" handler?

Danke für eure Zeit!

03.09.2005 - 03:07 Uhr

Gleich mal vorneweg, es geht nicht um:


this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;

Zumindest nicht alleine. Mein problem, ich habe einige Forms
die ich im Fullscreenmode laufen lassen möchte, der wenn ich
richtig verstanden habe ja von der Auflösung abhängig ist. Wenn
ich nun den FullScreenMode setze, ist mein Form linksoben in
die Ecke geklatsch, was ja nicht so sein soll. Würde ich es jetzt
umdesignen, müsste ich ja für jede Auflösung die ich erlaube
neue Forms erstellen, damit die Controls/buttons etc. auch
richtig platziert sind -> das kanns ja nicht sein.

Ich weiss, das man mit DirectX (das ich nicht verwende, ich nehm GDI+)
soetwas machen kann, das die Auflösung im Fullscreenmode das
"Form" (oder wie man es da dann nennt) einfach "zoomt", heisst ich
designe es z.B. für 800x600, hat jetzt jemand eine höhere Auflösung,
wird das Ganze einfach kleiner gezoomt... denke so machen es
z.B. auch die meisten kommerziellen Games (oder!?). So würde es
reichen, wenn ich einmal ein Form erstelle und designe.

Also, ich suche also einen Weg, das oben erklärte mit GDI+
umzusetzen, sofern ich nicht irgendwie die Theorie verwurschtelt habe
oder das etwas total kniffliges ist... dann die Bitte um Aufklärung 😉

02.09.2005 - 19:34 Uhr

Hi Leute!

Kleine Frage, wie verwendet man die Resource Dateien bei
SharpDevelop richtig? Ich hab eine neue angelegt, dort alle
meine BMP Dateien manuell eingefügt, aber immer wenn ich drauf
zugreife bekomme ich einen Ausnahmefehler.

So greife ich drauf zu:


System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TitleForm));
.
.
.
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("titlescreen")));

Muss ich diese neue von mir angelegte Datei noch irgendwie
bekannt machen?

Danke!

02.09.2005 - 18:58 Uhr

habs danke, falsche Suchbegriffe eingegeben sry.

02.09.2005 - 18:53 Uhr

Gleich noch ne kleine Frage die ich nicht gelöst bekomme,
ich hab ein Event das in Form1 instanziert wird, auf das aber
bei Form2 mit einem OnClick zugegriffen wird. Wie kann
ich in meinem Form1 den OnClick von Form2 abfangen?
Form2 ist "nur" ein UserControl.

Und wie würde man (auch wenns nicht gut ist, nur zum testen)
das Form1 dem Form2 bekannt machen?

Danke!

02.09.2005 - 15:26 Uhr

Hi leute,

kleines Problem hier, ich möchte bei einer Methode in einer
ListBox selektierte Items löschen, sobald jemand einen
Button drückt (konkret, eine art "Shop", wenn jemand etwas
anklickt kann er es kaufen, oder wenn er es schon hat bei sich
verkaufen).

Läuft auch alles prima, bis auf eine Sache:
Wenn nichts in der ListBox selektiert ist, bekomme ich einen
Fehler, da in meiner Methode auf ein nicht referenziertes Objekt
zugegriffen wird (ist ja auch klar). Meine Frage nun, mit welcher
Eigenschaft der ListBox Klasse kann ich prüfen od überhaupt
etwas selektiert ist?

Ich habs mit sachen wie ".SelectedItems.Equals(null)" etc. versucht, aber da greift
leider nix.

  1. Problem:
    Wie kann ich verhindern, das mehr als ein Item selektiert wird?

Danke für eure Zeit.

01.09.2005 - 15:53 Uhr

jo, jetzt hab ichs, danke euch!!!

01.09.2005 - 15:25 Uhr

glaube das ist schon ungefähr das, aber so 100% hab ichs noch
nicht gecheckt.

Also, ich muss irgendwie meinem GameStateManager die
"public static Arch myArchHandle;" übergeben um dort
dann das UserControl zum state hinzuzufügen?

Derzeit erstelle ich das UserControl ja im State selbst, soll
ich das dann im GameStateManager statt dessen machen?

🤔