kopfraucht: würfel-abgleich-routine
Übersicht

EisrabeBetreff: kopfraucht: würfel-abgleich-routine |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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!
|
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
Markus2Betreff: Re: kopfraucht: würfel-abgleich-routine |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() jemand nen besseren vorschlag? |
||
ich habe einCode: [AUSKLAPPEN] GOTO und ich bin bereit es einzusetzen!
|
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Hast aber Recht das sowas in BB rein gehört ![]() Min Max fehlt meine ich auch noch ... |
||
![]() |
Xenon |
![]() Antworten mit Zitat ![]() |
---|---|---|
LOL ihr habt Probleme ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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!
|
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
versteh ich nicht ganz | ||
ich habe einCode: [AUSKLAPPEN] GOTO und ich bin bereit es einzusetzen!
|
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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!
|
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
tja... die Feinheiten lass ich Dir .... ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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!
|
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group