Schach: Bewegungsradius der Figuren abchecken?!?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

BtbN

Betreff: Schach: Bewegungsradius der Figuren abchecken?!?

BeitragSa, Aug 06, 2005 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Function ZugLegal(figur,vonX,vonY,zuX,zuY)
Select figur
Case 1 ;Bauer Weiß
If vonY = 6 Then
If zuY = 4 And zuX = vonX And row(zuX,zuY) = 0 And row(zuX,zuY-1) = 0 Then
Return True
ElseIf zuY = 5 And zuX = vonX And row(zuX,zuY) = 0 Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX-1 And row(zuX,zuY) <> 0 And row(zuX,zuY) > 6 Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX+1 And row(zuX,zuY) <> 0 And row(zuX,zuY) > 6 Then
Return True
ElseIf zuY = vonY And zuX = vonX Then
Return True
Else
Return False
EndIf
Else
If zuY = vonY-1 And zuX = vonX-1 And row(zuX,zuY) <> 0 And row(zuX,zuY) > 6 Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX+1 And row(zuX,zuY) <> 0 And row(zuX,zuY) > 6 Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX And row(zuX,zuY) = 0 Then
Return True
ElseIf zuY = vonY And zuX = vonX Then
Return True
Else
Return False
EndIf
EndIf
Case 7 ;Bauer Schwarz
If vonY = 1 Then
If zuY = 2 And zuX = vonX And row(zuX,zuY) = 0 And row(zuX,zuY+1) = 0 Then
Return True
ElseIf zuY = 3 And zuX = vonX And row(zuX,zuY) = 0 Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX-1 And row(zuX,zuY) <> 0 And row(zuX,zuY) <= 6 Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX+1 And row(zuX,zuY) <> 0 And row(zuX,zuY) <= 6 Then
Return True
ElseIf zuY = vonY And zuX = vonX Then
Return True
Else
Return False
EndIf
Else
If zuY = vonY+1 And zuX = vonX-1 And row(zuX,zuY) <> 0 And row(zuX,zuY) <= 6 Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX+1 And row(zuX,zuY) <> 0 And row(zuX,zuY) <= 6 Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX And row(zuX,zuY) = 0 Then
Return True
ElseIf zuY = vonY And zuX = vonX Then
Return True
Else
Return False
EndIf
EndIf
Case 3 ;Pferd weiß
If zuY = vonY And zuX = vonX Then
Return True
ElseIf zuY = vonY-2 And zuX = vonX-1 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY-2 And zuX = vonX+1 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX+2 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX-2 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX+2 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX-2 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+2 And zuX = vonX-1 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+2 And zuX = vonX+1 And (row(zuX,zuY) > 6 Or row(zuX,zuY) = 0) Then
Return True
Else
Return False
EndIf
Case 9 ; Pferd Schwarz
If zuY = vonY And zuX = vonX Then
Return True
ElseIf zuY = vonY-2 And zuX = vonX-1 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY-2 And zuX = vonX+1 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX+2 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY-1 And zuX = vonX-2 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX+2 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+1 And zuX = vonX-2 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+2 And zuX = vonX-1 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
ElseIf zuY = vonY+2 And zuX = vonX+1 And (row(zuX,zuY) <= 6 Or row(zuX,zuY) = 0) Then
Return True
Else
Return False
EndIf
Case 2 ;Turm Weiß
If zuY = vonY And zuX = vonX Then
Return True
ElseIf zuX <> vonX And zuY <> vonY Then
Return False
ElseIf zuX = vonX And zuY <> vonY Then
For y7 = vonY+1 To 7 Step 1
If row(vonX,y7) <> 0 Then
maxY = y7
Exit
EndIf
Next
For y7 = vonY-1 To 0 Step -1
If row(vonX,y7) <> 0 Then
minY = y7
Exit
EndIf
Next
If row(zuX,maxY) <= 6 Then
maxY = maxY-1
EndIf
If row(zuX,minY) <= 6 Then
minY = minY+1
EndIf
Print minY+\" Min\"
Print maxY+\" Max\"
If zuY <= maxY And zuY >= minY Then
Return True
ElseIf zuY = maxY And row(zuX,maxY) > 6 Then
Return True
ElseIf zuY = minY And row(zuX,minY) > 6 Then
Return True
Else
Return False
EndIf
Else
Return False
EndIf
Default
Return True
End Select
End Function


Also, mein Problem liegt bei den Figuren, die bis zur Nächsten figur gehen können, und das nur auf einer Gerade Linie(Turm,Läufer,Dame).
Wie ihr seht, habe ich beim Turm meinen Probleme.
Die Funktionsweise der Funktion:

Man gibt ihr die Nummer der Figur, ihren aktuellen Standpukt und den Zielort an. Und dann bekommt men Ture zurück, wenn sie dort hin darf, False, wenn nicht.
Aber wie soll ichs anstellen, dass der Turm nur bis zur nächsten figur gehen kann, und diese, Wenn feindlich auch schlagen kann?
 

KHORN

BeitragSa, Aug 06, 2005 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz einfach...
Als erstes solltest du lieber Zahlen zurückgeben ...
0. Wenn er nicht dorthin gehen kann, 1 Wenn er dorthin gehen kann, 2 Wenn dort ein Gegner ist.
Aber das reicht ja nicht ^^
Du musst dir eine Funktion coden die überprüft ob an einer bestimmten Position eine Figur ist. Und diese Funktion soll auch Zahlen zurückgeben.
0: Wenn dort keine Figur steht, 1: Wenn dort eine Figur steht, die nicht vom Gegner ist und 2: Wenn dort eine feindliche Figur steht.
Dann überprüfst du einfach in der Funktion "ZugLegal" ob die stelle Frei ist oder nicht und gibst die entsprechende Zahl zurück Wink

Hoffe du hast was verstanden ...^^


MfG
KHORN

BtbN

BeitragSa, Aug 06, 2005 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
In dem Array row(7,7) habe ich das komplette Feld gespeichert.
Weiße Figuren haben die Nummern 1-6, die Schwarzen 7 bis 12.
Und null, wenn dort keine Figur is.
Folglich hab ich bereits eine solche Funktion ^^
Aber wenn ich einfach nur überprüfe, ob das Feld frei ist, könnte jde figur ja auf jedes Feld!
Also kommt das nicht in Frage.
Währ ja auch zu Einfach...
 

KHORN

BeitragSo, Aug 07, 2005 9:38
Antworten mit Zitat
Benutzer-Profile anzeigen
dann mach :
BlitzBasic: [AUSKLAPPEN]
If(SelectedFigurId = 1)
ZugLegal(1,figur\x,figur\y,figur\x,figur\y+1)
EndIf

(Ich rechne damit, das 1 ein normaler Bauer ist)

Das einzige was du tun musst ist, die ausgewählte Figur, also dessen id in ein er Variable zu speichern.
Ich denke das dürfte nicht alzu schwer sein.


Gruß KHORN

BtbN

BeitragSo, Aug 07, 2005 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Verstehst du mein Problem nicht?
naja, ok:

Ein Schachfeld

2 : Turm
1: andere gengnerische Figur
0: Eigene Figur

########
###1####
########
########
###2####
########
###0####
########

So, wie stell ichs jetzt an, dass der Turm nur bis AUF das Feld mit der 1 kann, und bis ein Feld VOR der eigenen Figur.

Edit:
Ich sollte vieleicht jetzt noch was zu meinem System sagen:
Ich habe ein Array row(x,y), in dem ich für jede X/Y koordinate speicher, was da für eine Figur steht.
 

#pointer#

Gast

BeitragSo, Aug 07, 2005 11:58
Antworten mit Zitat
ich code auch gerade an einem Schachspiel.
Bisher können sich nur Bauern, Pferd und König bewegen, sind ja auch die einfachen Wink
aber die restlichen Figuren werden bald folgen, das ist ja dann nur noch Formsache.

du kannst dich ja mal bei mir melden (am besten per ICQ) dann zeig ich dir mal meine Funktion.

mfg
#pointer#
 

KHORN

BeitragSo, Aug 07, 2005 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch ich verstehe sehr wohl dein problem.
Es ist nur schwer zu erklären :/
Ich glaub ich Code auch aus fun ein Schachspiel ^^ (OpenSource Wink )
hmm...
Ich kanns einfach nicht so gut erklären Sad
Oder du verstehst es nicht *fg*


Gruß KHORN

Alfadur

BeitragSo, Aug 07, 2005 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]

x= figurposition x
y= figurposition y

x=x+1 / x=x-1 / y=y+1 / y=y-1 ;je nach richtung in die gezogen wird...
While row(x,y)=0
x=x+1 / x=x-1 / y=y+1 / y=y-1

Wend
If row(x,y)=eigeneeinheit Then
x=x-1 ;/ wieder für jede richtung....
;position erreicht
Else
;gegnerschlagen
row(x,y)=row(figur x, figur y)
row(figur x, figur y) = 0
End If


habs nich getestet. aber das prinzip : du testet einfach die felder in der richtung in die der turm ziehen will, solange bis eben ein feld kommt welches nicht null ist ...
A Cray is the only computer that runs an endless loop in less than four hours.

BtbN

BeitragSo, Aug 07, 2005 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, hab jetzt auch selbst geschaft.
Hier meine Lösung:

BlitzBasic: [AUSKLAPPEN]
min = -1
For desty = zuY To vonY-1
If row(zuX,desty) <> 0 Then
min = desty
EndIf
Next
If zuY > min Or min = -1 Then
Return True
ElseIf zuY = min And row(zuX,zuY) >=7 Then
Return True
Else
Return False
EndIf
ElseIf zuX = vonX And zuY > vonY Then
max = -1
For desty = zuY To vonY+1 Step -1
If row(zuX,desty) <> 0 Then
max = desty
EndIf
Next
If zuY < max Or max = -1 Then
Return True
ElseIf zuY = max And row(zuX,zuY) >=7 Then
Return True
Else
Return False
EndIf


Im Prizip das selbe ^^
Aber jetzt bin ich beim Läufer, für Vorschläge bin ich immer offen!

Alfadur

BeitragSo, Aug 07, 2005 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
ist es so viel komplizierter die diagonalen zu testen?
A Cray is the only computer that runs an endless loop in less than four hours.

BtbN

BeitragMo, Aug 08, 2005 9:33
Antworten mit Zitat
Benutzer-Profile anzeigen
jep, ist es ^^
Vor dem Problem stehe ich gerade...

Edit: Ich hab gerade gemerkt, das dein Prinzip nicht in meine Funktion past, sorry.

Xaron

BeitragMo, Aug 08, 2005 9:48
Antworten mit Zitat
Benutzer-Profile anzeigen
BORNtobeNAMELESS hat Folgendes geschrieben:
jep, ist es ^^


Ist es nicht. Du musst doch nur x _und_ y erhöhen, anstatt nur x _oder_ y. Wink

Gruß - Xaron
Cerberus X - Monkey X Reloaded!

Alfadur

BeitragMo, Aug 08, 2005 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn mein prinzip nicht in deine funktion passt, dann ist eben deine funktion kacke... machs so wie ichs gesagt habe, hör auf xaron und alles wird gut.
A Cray is the only computer that runs an endless loop in less than four hours.

BtbN

BeitragMo, Aug 08, 2005 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs jetzt geschaft, mit im im Prizip schon dein Prinzip, nur anders umgesetzt.
Die funktion habe ich bei Rapidshare hochgeladen, flas sie ma wer begutachten will.

http://rapidshare.de/files/376...on.bb.html

Achtung: Die funktion funktioniert nicht , wenn man sie in sein Spiel kopiert!
Sie ist speziell auf meine Engine zugeschnitten.

Das nächste Problem ist die Rochade, das sollte aber kein alzugroßes Problem sein.
Für Vorschläge bin ich aber immer offen ^^

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group