kopfraucht: würfel-abgleich-routine

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Eisrabe

Betreff: kopfraucht: würfel-abgleich-routine

BeitragMo, Feb 02, 2004 7:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function wuerfeln(ein_a,ein_v)   ; ein_a = einheiten angreifer
  While sieger = 0
   If ein_a > 3 Then a = 3 Else a = ein_a   ; immer max 3 einheiten kämpfen
   If ein_v > 3 Then v = 3 Else v = ein_v
   For t=1 To a:w6a(t)=Rand(1,6):Next
   For t=1 To v:w6v(t)=Rand(1,6):Next
   If a=2 And w6a(1)< w6a(2) Then         ; sortieren bei 2 würfeln --- angreifer
     temp=w6a(1)
     w6a(1)=w6a(2)
     w6a(2)=temp
   EndIf
   If a=3 Then                            ; sortieren bei 3 würfeln --- angreifer
     While Not w6a(1)>=w6a(2) And w6a(2)>=w6a(3)
       If w6a(2)>w6a(1) Then temp=w6a(1):w6a(1)=w6a(2):w6a(2)=temp
       If w6a(3)>w6a(2) Then temp=w6a(2):w6a(2)=w6a(3):w6a(2)=temp
       If w6a(2)>w6a(1) Then temp=w6a(1):w6a(1)=w6a(2):w6a(2)=temp
     Wend
   EndIf
   If v=2 And w6v(1)< w6v(2) Then              ; sortieren bei 2 würfeln --- verteidiger
     temp=w6v(1)
     w6v(1)=w6v(2)
     w6v(2)=temp
   EndIf
   If v=3 Then                           ; sortieren bei 3 würfeln --- verteidiger
     While Not w6v(1)>=w6v(2) And w6v(2)>=w6v(3)
       If w6v(2)>w6v(1) Then temp=w6v(1):w6v(1)=w6v(2):w6v(2)=temp
       If w6v(3)>w6v(2) Then temp=w6v(2):w6v(2)=w6v(3):w6v(2)=temp
       If w6v(2)>w6v(1) Then temp=w6v(1):w6v(1)=w6v(2):w6v(2)=temp
     Wend
   EndIf
   If w6a(1)>w6v(1) Then    ; angreiferwürfel grösser --- würfel paar 1
     verluste_v=verluste_v+1
   ElseIf w6a(1)=w6v(1) Then   ; beide gleich
     verluste_a=verluste_a+1:verluste_v=verluste_v+1
   Else                       ; verteidiger grösser
     verluste_a=verluste_a+1
   EndIf
   ; hier gebe ich auf ;(     <---------------- was ist mit unterschiedlich vielen würfeln?
   ; man kann mit 1 würfel gegen 3 würfel gewinen, wenn der würfel höher ist als jeder einzelne der 3
 Wend ; ende wenn sieger ermittelt
Return sieger  ; wert pos angreifer gewinnt mit "wert" einheiten, wert negativ verteigiger gewinnt


ich werde wohn der einfachheit halber lieber die augen der würfel zusammenzählen, als die einzeln zu sortieren und zu vergleichen.
die function ist nicht fertig, weil ich aufgegeben habe. vielleicht lags auch an der uhrzeit, oder weil ich zeile für zeile schlechteren code geschrieben habe, das zum schluss nur müll rauskommt.
warum zur hölle gibts kein SWAP(wert1,wert2) befehl?? und ne function kann man da nicht schreiben, weil die nur 1 wert zurückgibt
und das sortieren? hölle

wer hat vorschläge?
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

BladeRunner

Moderator

BeitragMo, Feb 02, 2004 8:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur als Anregung:
bau erstmal Bubblesort ein (müsste auf blitzbase.de zu finden sein), sortier damit die Würfelergebnisse nach angreifer und verteidiger.
Der Vergleich sollte dann kein großes Problem mehr sein.

EDIT:
http://www.blitzbase.de/quellcode/sortieren.bb
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Markus2

Betreff: Re: kopfraucht: würfel-abgleich-routine

BeitragDi, Feb 03, 2004 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Eisrabe hat Folgendes geschrieben:
...warum zur hölle gibts kein SWAP(wert1,wert2) befehl??...


Hi,

du meinst so ?

function swapw6a(i1,i2)
temp=w6a(i1)
w6a(i1)=w6a(i2)
w6a(i2)=temp
end function
 

Eisrabe

BeitragDi, Feb 03, 2004 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Markus2: ob ich den code in einer fundtion drin stehen habe oder nciht macht kein unterschied. und das funktioniert auch nur bei arrays. bei anderen nicht globalen variablen oder strings geht deiner "function" die puste aus.
Qbasic macht einfach swap(a,b) oder swap(a$,b$). das ist ein wichtiger basic befehl und der gehört in BB rein. wenn er nicht schon in BB3D oder BBplus drin ist....

zu meinem obrigen problem: da ich ja nur maximal 3 würfel sortieren muss, habe ich etwas, was noch schneller ist als alle sorts und weniger code.
Code: [AUSKLAPPEN]

if w6a(2) > w6a(1) then temp=w6a(2):w6a(2)=w6a(1):w6a(1)=temp
if not w6a(3) = 0 then
   if w6a(3) > w6a(2) then temp=w6a(3):w6a(3)=w6a(2):w6a(2)=temp
   if w6a(2) > w6a(1) then temp=w6a(2):w6a(2)=w6a(1):w6a(1)=temp
endif


jetzt muss ich mir nurnoch überlegen, wie ich die würfel der angreifer und die der verteidiger vergleiche. das schwierige: beide seiten können je 1-3 würfel haben.
ich denke ich muss alle möglichkeiten abfragen:
if agr = vertei
abgleich
if angr 3 w - vertei 2w
if angr 3 w - vertei 1w
if angr 2 w - vertei 3w
if angr 2 w - vertei 1w
if angr 1 w - vertei 2w
if angr 1 w - vertei 3w

sind ja nur 6 ifs Smile


jemand nen besseren vorschlag?
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

Markus2

BeitragDi, Feb 03, 2004 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Eisrabe hat Folgendes geschrieben:
...das funktioniert auch nur bei arrays. bei anderen nicht globalen variablen oder strings geht deiner "function" die puste aus.
...


Mit Types gehts einfacher Smile
Hast aber Recht das sowas in BB rein gehört Wink
Min Max fehlt meine ich auch noch ...

Xenon

BeitragDi, Feb 03, 2004 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
LOL ihr habt Probleme Very Happy

Es gehören weder Swap, noch Min/Max Funktionen, sondern pointer und Referenzen rein, sowie standartinclude verzeichnisse, dann kann man sich das, und noch 10000000... Sachen mehr machen!

Markus2

BeitragDo, Feb 05, 2004 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Xenon hat Folgendes geschrieben:
...Es gehören weder Swap, noch Min/Max Funktionen, sondern pointer und Referenzen rein,...


Meinte ja nur das wenn man schon keine Referenzen nutzen kann
sowas rein gehört .
 

Eisrabe

BeitragDo, Feb 05, 2004 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Function wuerfeln(ein_a,ein_v)   ; ein_a = einheiten angreifer
  While sieger = 0
   If ein_a > 3 Then a = 3 Else a = ein_a   ; immer max 3 einheiten kämpfen
   If ein_v > 3 Then v = 3 Else v = ein_v
   For t=1 To a:w6a(t)=Rand(1,6):Next
   For t=1 To v:w6v(t)=Rand(1,6):Next
if w6a(2) > w6a(1) then temp=w6a(2):w6a(2)=w6a(1):w6a(1)=temp
if not w6a(3) = 0 then
   if w6a(3) > w6a(2) then temp=w6a(3):w6a(3)=w6a(2):w6a(2)=temp
   if w6a(2) > w6a(1) then temp=w6a(2):w6a(2)=w6a(1):w6a(1)=temp
endif
; ===== vergleichen ===========
if ein_a = ein_v then        ; wenn angreifer gleich viele würfel wie verteidiger
  abgleich....
elseif ein_a > ein_v then    ; wenn angreifer mehr würfel
  for t=1 to ein_a
   abgleich....
  next
elseif ein_v > ein_a then      ; wenn verteidiger mehr würfel
  for t=1 to ein_v
   abgleich....
  next
endif

Wend ; ende wenn sieger ermittelt
Return sieger
End Function


wie wäre das im vergleich zum obersten listing? kürzer und besser und übersichtlicher wie ich finde.
fehlt nur noch der code für den abgleich
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

BladeRunner

Moderator

BeitragDo, Feb 05, 2004 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein VorschlaG: setze alle Würfelwerte zu Beginn der Function auf -1 und w6e(1-3) auf -99.
Dann läßt du würfeln (und die benutzten Würfel erhalten ja automatisch einen anderen Wert).
Dann sortieren, und danach:
Code: [AUSKLAPPEN]

for zaehl =1 to 3
if w6a(i)<>-1 then if w6v(i)<>-1 then
    w6e(i)=w6a(i)-w6v(i)
next

dann hasat du in w6e() Die Ergebnisse der Vergleiche stehen, und bei -99 gab es keinen Vergleich.
Daraus kannst Du dann ja die Vereluste berechnen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Eisrabe

BeitragDo, Feb 05, 2004 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
versteh ich nicht ganz
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

BladeRunner

Moderator

BeitragDo, Feb 05, 2004 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Edit:

Zur Erkärung:

Code: [AUSKLAPPEN]

Function wuerfeln(ein_a,ein_v)   ; ein_a = einheiten angreifer
  While sieger = 0
for zaehl =1 to 3  ;setzen der Startwerte
  w6a(zaehl) =-1
  w6v(zaehl)=-1 
  w6e(zaehl)=-99
next

 If ein_a > 3 Then a = 3 Else a = ein_a   ; immer max 3 einheiten kämpfen : würefeln und Sortieren
   If ein_v > 3 Then v = 3 Else v = ein_v
   For t=1 To a:w6a(t)=Rand(1,6):Next
   For t=1 To v:w6v(t)=Rand(1,6):Next
if w6a(2) > w6a(1) then temp=w6a(2):w6a(2)=w6a(1):w6a(1)=temp
if not w6a(3) = -1 then
   if w6a(3) > w6a(2) then temp=w6a(3):w6a(3)=w6a(2):w6a(2)=temp
   if w6a(2) > w6a(1) then temp=w6a(2):w6a(2)=w6a(1):w6a(1)=temp
endif
if w6v(2) > w6v(1) then temp=w6v(2):w6v(2)=w6v(1):w6v(1)=temp
if not w6v(3) = -1 then
   if w6v(3) > w6v(2) then temp=w6v(3):w6v(3)=w6v(2):w6v(2)=temp
   if w6v(2) > w6v(1) then temp=w6v(2):w6v(2)=w6v(1):w6v(1)=temp
endif
; ===== vergleichen ===========
for zaehl =1 to 3 ; wenn angreifer und verteidigerwürfel existent wird die diff gebildet
  if w6a(zaehl)<>-1 then if w6v(zaehl)<>-1 then
    w6e(zaehl)=w6a(zaehl)-w6v(zaehl)
  endif
  if w6e(zaehl)<=0 then if w6e(zaehl) <> -99 then ein_a=ein_a-1
  if w6e(zaehl)>0 then ein_v=ein_v-1
next
if ein_a= 0 then sieger=2
if ein_v=0 then sieger=1

Wend ; ende wenn sieger ermittelt
Return sieger
End Function


Den Code kann man jetzt noch modifizieren. derzeit verlieren die Angreifer für jeden Würfel mit gleicher oder geringerer Augenzahl eine Armee, ansonsten die Verteidiger.
Würde die Diff abgezogen, also:
Code: [AUSKLAPPEN]

for zaehl =1 to 3 ; wenn angreifer und verteidigerwürfel existent wird die diff gebildet
  if w6a(zaehl)<>-1 then if w6v(zaehl)<>-1 then
    w6e(zaehl)=w6a(zaehl)-w6v(zaehl)
  endif
  if w6e(zaehl)<=0 then if w6e(zaehl) <> -99 then ein_a=ein_a+w6e(zaehl)
  if w6e(zaehl)>0 then ein_v=ein_v-w6e(zaehl)
next
if ein_a<= 0 then sieger=2
if ein_v<=0 then sieger=1
if (ein_a<=0 and ein_v<=0) then sieger=3 ; unentschieden

, dann würden die Differenzen als Verluste eingefahren. Hier wäre theoretisch auch ein Unentschieden möglich.

Was hier nicht gemacht wird, ist mit einem Würfel mehrere generische auszuschalten (BsP: A6 schlägt V4 und V1), da dies auch in den Originalregeln von Risiko nicht so vorgesehen ist. Wäre aber auch machbar.
Hoffe ich konnte helfen...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Eisrabe

BeitragFr, Feb 06, 2004 4:07
Antworten mit Zitat
Benutzer-Profile anzeigen
jo, danke, das ist wohl wirklich etwas kürzer als meine geplante methode. obwohl ich wohl irgendwann gemerkt hätte, dass ich nicht alle 6 ifs brauche.

aber beim lesen deines codes ist mir aufgefallen, dass du immer
Code: [AUSKLAPPEN]
... then if w6v(zaehl)<>-1 then ...


schreibst statt:

Code: [AUSKLAPPEN]
if w6a(zaehl)<>-1 AND w6v(zaehl)<>-1 then

ist zwar beides das selbe, aber ist der verwendung von AND nicht sauberer? obwohl deine schreibweise noch die erweiterung mit weiteren bedingungen erleichtern würde.

achja, ich habs jetzt so geshrieben:
Code: [AUSKLAPPEN]

If a = v Then   
  For t=1 To a
    If w6a(t) > w6v(t) Then v=v-1 Else a=a-1
  Next
ElseIf a > v Then   
  For t=1 To v
   If w6a(t) > w6v(t) Then v=v-1 Else a=a-1
  Next
ElseIf a < v Then   
  For t=1 To a
   If w6a(t) > w6v(t) Then v=v-1 Else a=a-1
  Next
EndIf
If v <= 0 Then sieger=a
If a <= 0 Then sieger=100+v

wend
return sieger


der trick ist, dass ich nach funktionsaufruf prüfen kann wer gewonnen hat mit wieviel einheiten übrig.

if rueckgabewert > 100 then
verteidiger hat gewonnen mit rueckgabewert - 100 einheiten
else
angreifer hat gewonnen mit rueckgabewert einheiten
endif

das ist nicht der code, sondern soll nur zeigen, wie ichs meine.
und eins ist noch unberücksichtigt: bei deinem code geht der kampf automatisch solange weiter, bis einer komplett alle einheiten verloren hat.
ich möchte aber nach jeder würfelrunde nachfragen, ob der angreifer weiterkämpfen möchte
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

BladeRunner

Moderator

BeitragFr, Feb 06, 2004 6:13
Antworten mit Zitat
Benutzer-Profile anzeigen
tja... die Feinheiten lass ich Dir .... Wink

Was das kombinierte if mit AND angeht, dass ist schlichterdings zu meiner persönlichen Beruhigung- da weiß ich dass es funzt. Bei der Kombi bin ich nie sicher ob ichs komplett in Klammern setzen müsste oder nicht.
Schätze mal Geschmackssache.

Drück dann mal weiterhin die Daumen für dein RISK.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Eisrabe

BeitragSa, Feb 07, 2004 0:10
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:


Drück dann mal weiterhin die Daumen für dein RISK.


ui danke. netta aufmunternde Worte kann ich echt gebrauchen. hab in letzter zeit nicht viel "verbale" unterstützung erhalten
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group