![Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht](misc/logos/logo.png) |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Schnism
![](images/avatars/669524975416d101427814.gif)
Anmeldungsdatum: 13.10.2004 Beiträge: 58 Wohnort: Schweiz
|
Verfasst am: 06.02.2016, 17:02 Titel: |
|
|
Mist.. stimmt..
Zitat: | 1972 RANDOMIZE TIMER: z = INT((RND * 3) + 1): RETURN
|
da isser
Denk dran, das ist nur ein Schnipsel
oh.. code.. tatsächlich ..
Code: |
1970 spioneentsendet = 1: z = 0: ezufall = 0: fzufall = 0: go = 0: in = 0: ka = 0: ar = 0: sc = 0
ko = 0: ga = 0: fe = 0: ha = 0: mu = 0: pa = 0: kat = 0: fsp = 0: esp = 0: erfolg = 0: spionage = spy(a2)
FOR t = 1 TO spionage: COLOR 10: LOCATE 7, 1: PRINT "Ergebnis Spion"; t: LOCATE 23, 1: PRINT " "
RANDOMIZE TIMER:schlaf = INT(RND * 3) + 1
fsp = kfas(a3): esp = kfas(a2): COLOR 10: rezufall = kfas(a2) * spy(a2): rfzufall = kfas(a3) * spy(a3)
1971 RANDOMIZE TIMER: erfolg = (RND * rang(a2)): fzufall = (RND * rfzufall): ezufall = (RND * rezufall):IF ezufall < spy(a2) THEN GOTO 1971
IF (esp * ezufall * spy(a2)) > (fsp * fzufall * spy(a3)) THEN
PRINT : LOCATE 3, 1: COLOR 8: PRINT "Ihre Spione konnten folgendes sabotieren/stehlen:": PRINT : COLOR 10
RANDOMIZE TIMER: a = (RND * 100): gold = INT(a * rang(a2) * ezufall): IF gold > a9(a3) THEN gold = a9(a3)
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND a9(a3) > 0 THEN
LOCATE 10, 1: PRINT "Gold: "; gold; t$: go = go + gold: a9(a3) = a9(a3) - gold: a9(a2) = a9(a2) + gold: LOCATE 10, 20: PRINT "Gesamterfolg: "; go
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND inf(a3) > 1 THEN
GOSUB 1972: LOCATE 11, 1: PRINT "Infanteristen: "; z: in = in + z: inf(a3) = inf(a3) - z: LOCATE 11, 20: PRINT "Gesamterfolg: "; in
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND kav(a3) > 1 THEN
GOSUB 1972: LOCATE 12, 1: PRINT "Kavalleristen: "; z: ka = ka + z: kav(a3) = kav(a3) - z: LOCATE 12, 20: PRINT "Gesamterfolg: "; ka
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND art(a3) > 1 THEN
GOSUB 1972: LOCATE 13, 1: PRINT "Artilleristen: "; z: ar = ar + z: art(a3) = art(a3) - z: LOCATE 13, 20: PRINT "Gesamterfolg: "; ar
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND schnigge(a3) > 1 AND ents(a3) = 0 THEN
GOSUB 1972: LOCATE 14, 1: PRINT "Schniggen: "; z: sc = sc + z: schnigge(a3) = schnigge(a3) - z: LOCATE 14, 20: PRINT "Gesamterfolg: "; sc
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND kogge(a3) > 1 AND entk(a3) = 0 THEN
GOSUB 1972: LOCATE 15, 1: PRINT "Koggen: "; z: ko = ko + z: kogge(a3) = kogge(a3) - z: LOCATE 15, 20: PRINT "Gesamterfolg: "; ko
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RN1D * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND galleone(a3) > 1 AND entg(a3) = 0 THEN
GOSUB 1972: LOCATE 16, 1: PRINT "Galleonen: "; z: ga = ga + z: galleone(a3) = galleone(a3) - z: LOCATE 16, 20: PRINT "Gesamterfolg: "; ga
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND feld(a3) > 1 THEN
GOSUB 1972: LOCATE 17, 1: PRINT "Felder: "; z: fe = fe + z: feld(a3) = feld(a3) - z: LOCATE 17, 20: PRINT "Gesamterfolg: "; fe
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b3(a3) > 1 THEN
GOSUB 1972: LOCATE 18, 1: PRINT "H„user: "; z: ha = ha + z: b3(a3) = b3(a3) - z: LOCATE 18, 20: PRINT "Gesamterfolg: "; ha
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b2(a3) > 1 THEN
GOSUB 1972: LOCATE 19, 1: PRINT "Mhlen: "; z: mu = mu + z: b2(a3) = b2(a3) - z: LOCATE 19, 20: PRINT "Gesamterfolg: "; mu
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b4(a3) > 1 THEN
GOSUB 1972: LOCATE 20, 1: PRINT "Palastteile: "; z: pa = pa + z: b2(a3) = b2(a3) - z: LOCATE 20, 20: PRINT "Gesamterfolg: "; pa
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b5(a3) > 1 THEN
GOSUB 1972: LOCATE 21, 1: PRINT "Kathedralenteile: "; z: kat = kat + z: b5(a3) = b5(a3) - z: LOCATE 21, 20: PRINT "Gesamterfolg: "; kat
END IF
kfas(a2) = kfas(a2) + (RND * 1): kfas(a3) = kfas(a3) - (RND * 1)
IF (kfas(a2) * ezufall) > (kfas(a3) * fzufall) AND spy(a3) > 0 THEN LOCATE 23, 1: PRINT "Ein gegnerischer Spion wurde ausgeschaltet": spy(a3) = spy(a3) - 1
END IF
IF (esp * ezufall * spy(a2)) <= (fsp * fzufall * spy(a3)) AND spy(a3) > 0 THEN
COLOR 10: LOCATE 7, 1: PRINT "Ergebnis Spion"; t: LOCATE 23, 1: COLOR 12
PRINT "Tut mir leid, die gegnerischen Spione haben ihren Spion getötet": spy(a2) = spy(a2) - 1: schlaf = 10: PRINT esp; ezufall; spy(a2), fsp; fzufall; spy(a3)
kfas(a2) = kfas(a2) - (RND * 2): kfas(a3) = kfas(a3) + (RND * 2)
END IF
IF kfas(a2) > 95 THEN kfas(a2) = 95
IF kfas(a3) > 95 THEN kfas(a3) = 95
IF kfas(a2) < 0 THEN kfas(a2) = 0
IF kfas(a3) < 0 THEN kfas(a3) = 0
SLEEP schlaf
LOCATE 23, 1: COLOR 12: PRINT " "
NEXT t
LOCATE 25, 1: PRINT "Zurckgekehrte Spione:"; spy(a2)
SLEEP 100
RETURN
1972 RANDOMIZE TIMER: z = INT((RND * 3) + 1): RETURN |
_________________ "...nichts ist so schlimm wie mein programmcode!" |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 06.02.2016, 17:13 Titel: |
|
|
Schön. Und an welcher Stelle hakt es jetzt? Ich bekomme nur die Meldung: "Zurückgekehrte Spione: 0"
Gruß
grindstone
EDIT: Ich fürchte, so kommen wir nicht weiter. a2, a3 usw. sind immer 0 und damit auch spy(a2), genauso wie rezufall und damit auch ezufall. Und da 0 < 0 immer falsch ist, wird es bei Code: | If ezufall < spy(a2) THEN GOTO 1971 | auch nie einen Sprung geben.
Wenn dein Programm keine Geheimnisse enthält, könntest du es vielleicht komplett bei NoPaste hochladen, dann könnte ich es mir einmal in Ruhe ansehen (und vielleicht auch -nur so zum Spass- nach FB portieren; ich liebe Strategiespiele ). Der Fehler steckt bestimmt an einer ganz anderen Stelle. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 06.02.2016, 19:43 Titel: |
|
|
Das Problem ist nach wie vor, dass ich nicht weiß, ob es an einer seltsamen Variablenbelegung liegen kann. Aktuell sind (im Code-Schnipsel) alle Variablen 0, wodurch natürlich mit RND*0 nichts übermäßig interessantes herauskommen kann.
Nochmal zu RANDOMIZE TIMER - das brauchst du nicht vor jedem RND aufzurufen (und solltest du auch nicht). Wenn du das mehrmals innerhalb einer Sekunde aufrufst, stellst du die Zahlenfolge immer wieder auf dieselbe Folge zurück. Das würde wohl erklären, warum das erste RND z. B. so oft kleiner ist wie das zweite - es sind ja immer wieder dieselben beiden Zahlen. Erst wenn TIMER eine Sekunde weiterspringt, erhältst du eine neue Zahlenfolge. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Schnism
![](images/avatars/669524975416d101427814.gif)
Anmeldungsdatum: 13.10.2004 Beiträge: 58 Wohnort: Schweiz
|
Verfasst am: 06.02.2016, 20:38 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Schön. Und an welcher Stelle hakt es jetzt? Ich bekomme nur die Meldung: "Zurückgekehrte Spione: 0"
Gruß
grindstone
EDIT: Ich fürchte, so kommen wir nicht weiter. a2, a3 usw. sind immer 0 und damit auch spy(a2), genauso wie rezufall und damit auch ezufall. Und da 0 < 0 immer falsch ist, wird es bei Code: | If ezufall < spy(a2) THEN GOTO 1971 | auch nie einen Sprung geben.
Wenn dein Programm keine Geheimnisse enthält, könntest du es vielleicht komplett bei NoPaste hochladen, dann könnte ich es mir einmal in Ruhe ansehen (und vielleicht auch -nur so zum Spass- nach FB portieren; ich liebe Strategiespiele ). Der Fehler steckt bestimmt an einer ganz anderen Stelle. |
Huch
Ich dachte, das setzen der Variablen wäre für euch "ein klacks"
a2 ist der Spieler
Ist spieler 1 dran, dann ist a2 immer 1:
a9(a2) ist somit das gleiche wie a9(1)
a3 ist der "gegenspieler" .. da es bis zu 6 haben kann, kann der wert a3 zwischen 2 und 6 liegen (1 geht ja nicht, das ist man ja selbst)
ist die runde beendet, kommt a2 = a2 +1 und der nächste spieler ist dran. 1 Variable für unendlich spieler.
In dem Beispiel:
kfas(a2) = kfas(a2) - (RND * 2): kfas(a3) = kfas(a3) + (RND * 2)
wäre also kampfkraftspion(spieler1) = kampfkraftspion(spieler1) - (RND *2): Kampfkraftspion(spieler2) = kampfkraftspion(spieler2) + (RND *2)
d.h. ihr könnt einfach alle werte selber setzen *lach*
Das hier Code: | PRINT esp; ezufall; spy(a2), fsp; fzufall; spy(a3) | habe ich NUR gesetzt, um die werte zu kontrollieren. die gehören eigentlich NICHT in das Spiel (ebenso das hier Code: | IF ezufall < spy(a2) THEN GOTO 1971 | )
auf die seite kann ich mich nicht registrieren.. er gibt mir immer einen fehler aus (kein eingabefehler, sondern "Code.." bla bla )
Also .. das "nötige" hab ich hier drin.
KLICK
Vor dem Start musst du die Pfade noch an deinen Ort anpassen: C:\QB45GER\...
Der Weg, den du gehen musst, ist:
7 , 6 , Return , j , und die 2 (Du willst also den gegenspieler sabotieren)
Beide haben 10 Spione mit einer Erfahrung (Kampfkraftspione) von 50
Ich hoffe, du kommst damit zurecht (was ich echt NICHT glauben werde )
Betreffend RANDOMIZE TIMER
Da hab ich gegenteilige erfahrungen gemacht.
Wenn ich kein RANDOMIZE TIMER drin habe, verändern sich meine RND Zahlen nach neustart NICHT.. es kommen immer diesselben bei raus??? _________________ "...nichts ist so schlimm wie mein programmcode!" |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 06.02.2016, 20:52 Titel: |
|
|
Ich rede nicht von ohne RANDOMIZE TIMER, ich rede von nur einmal RANDOMIZE TIMER. RANDOMIZE initialisiert den Zufallsgenerator, und der muss fast nie öfter als einmal initialisiert werden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Zuletzt bearbeitet von nemored am 06.02.2016, 20:53, insgesamt einmal bearbeitet |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
dreael Administrator
![](images/avatars/112279543641421ec80e8e2.gif)
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.02.2016, 20:53 Titel: |
|
|
grindstone hat Folgendes geschrieben: | [offTopic]
dreael hat Folgendes geschrieben: | ...Festplattenlöschtool von mir... | Funktioniert das Tool auch mit modernen SATA - Platten? Wäre schön, ein Löschtool zu haben, dem ich absolut vertrauen kann. :)
[/offTopic] |
Auch SATA ist möglich, weil INT 13h im BIOS auch dort zur Verfügung steht. Sogar RAID-Controller in professionellen Servern sind kein Problem. Einzige Einschränkung der aktuellen Version: Festplattengrösse (bei RAID logischer Volumegrösse) bis maximal 1 TB, da es in QB keinen 64-Bit-Integertyp gibt.
Schnism hat Folgendes geschrieben: | Code: | (esp * ezufall * spy(a2)) > (fsp * fzufall * spy(a3)) THEN
PRINT : LOCATE 3, 1: COLOR 8: PRINT "Ihre Spione konnten folgendes sabotieren/stehlen:": PRINT : COLOR 10
RANDOMIZE TIMER: a = (RND * 100): gold = INT(a * rang(a2) * ezufall): IF gold > a9(a3) THEN gold = a9(a3)
IF .. |
|
Ohne Dir irgendwie zu nahe zu treten wollen: Passt wieder einmal ziemlich gut zu
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/Anfaengerfehler.html
Bei den vielen IFs würde ich unbedingt einmal die gemeinsamen Muster analysieren. Ich würde an Deiner Stelle einmal mit
Code: | DIM kaempfer$(10)
FOR i%=0 TO 10
READ kaempfer$(i)
NEXT I
DATA "Infanteristen", "Kavalleristen", "Artilleristen", "Schniggen"
DATA "Koggen", "Galleonen", "Felder", "Häuser", "Mühlen", "Palastteile"
DATA "Kathedralenteile" |
=> Variablen wie sc, ar, ko usw. können durch ein Feld ersetzt werden. All Deine Blöcke kannst Du in ein grosses FOR-Statement zusammenfassen, etwa so:
Code: | FOR i%=0 TO 10
a = RND * 100
ezufall = RND * rang(a2)
erfolg = RND * rang(a2)
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND schnigge(a3) > 1 AND ents(a3) = 0 THEN
GOSUB Label1972
LOCATE 11 + i%, 1
PRINT kaempfer$(i): "; z
fig(i%) = fig(i%) + z
kaempfer%(i%, a3) = kaempfer%(i%, a3) - z
LOCATE 11 + i%, 20
PRINT "Gesamterfolg: "; fig(i%)
END IF
NEXT i% |
Übrigens jedes Mal RANDOMIZE TIMER kannst Du Dir sparen, es reicht ein einziges Mal zu Beginn aufgerufen völlig aus.
Und unmittelbar sollte ein wichtiger Erfolg resultieren: Plötzlich kommt die refaktorierte Version mit den 64 KB (Segmentgrösse in der Intel 8088/8086-Architektur!) zurecht, weil der Code massiv kürzer geworden ist.
Empfehlung von mir (und auch den anderen): Nebst einer besseren Lesbarkeit und Nachvollziehbarkeit würde ein solches Code-Refactoring mit grosser Sicherheit Dein zu Beginn genanntes Speicherproblem lösen! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 07.02.2016, 00:52 Titel: |
|
|
Schnism hat Folgendes geschrieben: | Ich dachte, das setzen der Variablen wäre für euch "ein klacks" | Du bist ein Scherzkeks!
Aber ich habe den Fehler gefunden (zumindest diesen einen):
Code: | ...
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b2(a3) > 1 THEN
GOSUB 1972: LOCATE 19, 1: PRINT "Mhlen: "; z: mu = mu + z: b2(a3) = b2(a3) - z: LOCATE 19, 20: PRINT "Gesamterfolg: "; mu
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b4(a3) > 1 THEN
GOSUB 1972: LOCATE 20, 1: PRINT "Palastteile: "; z: pa = pa + z: b2(a3) = b2(a3) - z: LOCATE 20, 20: PRINT "Gesamterfolg: "; pa
END IF
RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b5(a3) > 1 THEN
GOSUB 1972: LOCATE 21, 1: PRINT "Kathedralenteile: "; z: kat = kat + z: b5(a3) = b5(a3) - z: LOCATE 21, 20: PRINT "Gesamterfolg: "; kat
END IF
kfas(a2) = kfas(a2) + (RND * 1): kfas(a3) = kfas(a3) - (RND * 1)
ezufall = (RND * rezufall) '<<<<<<<<<<<< einfuegen!
IF (kfas(a2) * ezufall) > (kfas(a3) * fzufall) AND spy(a3) > 0 THEN LOCATE 23, 1: PRINT "Ein gegnerischer Spion wurde ausgeschaltet": spy(a3) = spy(a3) - 1
END If
If (esp * ezufall * spy(a2)) <= (fsp * fzufall * spy(a3)) AND spy(a3) > 0 THEN
COLOR 10: LOCATE 7, 1: PRINT "Ergebnis Spion"; t: LOCATE 23, 1: COLOR 12
PRINT "Tut mir leid, die gegnerischen Spione haben ihren Spion getötet": spy(a2) = spy(a2) - 1: schlaf = 10: PRINT esp; ezufall; spy(a2), fsp; fzufall; spy(a3)
kfas(a2) = kfas(a2) - (RND * 2): kfas(a3) = kfas(a3) + (RND * 2)
END IF
IF kfas(a2) > 95 THEN kfas(a2) = 95
IF kfas(a3) > 95 THEN kfas(a3) = 95
IF kfas(a2) < 0 THEN kfas(a2) = 0
IF kfas(a3) < 0 THEN kfas(a3) = 0
SLEEP schlaf
LOCATE 23, 1: COLOR 12: PRINT " "
NEXT t
LOCATE 25, 1: PRINT "Zurckgekehrte Spione:"; spy(a2)
GOSUB 50
RETURN
... |
Versuch mal, selber drauf zu kommen, was das Problem ist.
Noch ein Tip: Schmeiss alle RANDOMIZE TIMER raus, bis auf einen am Beginn jeder Runde. Das alleine spart schon 1 kB Speicherplatz. Wenn du mir den anderen Teil des Programms zukommen lässt, kann ich ja mal versuchen, eine "schlanke" Version daraus zu basteln.
@dreael:
Ich habe im Hinterkopf die Idee von einer bootfähigen CD mit freeDOS und deinem Löschtool.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Schnism
![](images/avatars/669524975416d101427814.gif)
Anmeldungsdatum: 13.10.2004 Beiträge: 58 Wohnort: Schweiz
|
Verfasst am: 07.02.2016, 09:59 Titel: |
|
|
Guten Morgen
Zuerst: meinen fetten dank dafür, dass du dort drüberschaust ..
Na, das weiss ich doch Hab ich geschrieben.
Du kannst mir gar nicht zu nahe treten. Du kennst mich nicht, ich kenn dich nicht. Du hast deine Meinung und das ist gut so.
Leider werde ich ohne konkrete Beispieländerungen meines Codes nie schlau aus den "Beispielen". Da reicht meine Transferleistung nicht.
Ich schaue es mir trotzdem an. Dein Beitrag ist nicht umsonst.
Ähm grindstone ..
Dein geposteter Code ist NICHT der, den ich dir gesendet habe
ah ..du bist im der vorherigen version. ok
Code: | ezufall = (RND * rang(a2)) |
gehört neu zum ausspionieren, nicht zum zerstören.
Und wo soll ich das nochmal einfügen?
Code: | ezufall = (RND * rezufall) '<<<<<<<<<<<< einfuegen! |
Das ist doch drin ..
Code: | erfolg = (RND * rang(a2)): fzufall = (RND * rfzufall): ezufall = (RND * rezufall) |
zusammen gehört doch das hier:
Code: | FOR t = 1 TO spionage: COLOR 10: LOCATE 7, 1: PRINT "Ergebnis Spion"; t: LOCATE 23, 1: PRINT " "
RANDOMIZE TIMER:schlaf = INT(RND * 3) + 1
fsp = kfas(a3): esp = kfas(a2): COLOR 10: rezufall = kfas(a2) * spy(a2): rfzufall = kfas(a3) * spy(a3)
RANDOMIZE TIMER: erfolg = (RND * rang(a2)): fzufall = (RND * rfzufall): ezufall = (RND * rezufall)
IF (esp * ezufall * spy(a2)) > (fsp * fzufall * spy(a3)) THEN
......
END IF
IF (esp * ezufall * spy(a2)) <= (fsp * fzufall * spy(a3)) AND spy(a3) > 0 THEN
COLOR 10: LOCATE 7, 1: PRINT "Ergebnis Spion"; t: LOCATE 23, 1: COLOR 12
PRINT "Tut mir leid, die gegnerischen Spione haben ihren Spion getötet": spy(a2) = spy(a2) - 1: schlaf = 10: PRINT esp; ezufall; spy(a2), fsp; fzufall; spy(a3)
kfas(a2) = kfas(a2) - (RND * 2): kfas(a3) = kfas(a3) + (RND * 2)
END IF
.....
NEXT t
|
und diese Abfrage funktioniert ja nicht, weil ezufall immer kleiner ist.
RANDOMIZE TIMER: Done! _________________ "...nichts ist so schlimm wie mein programmcode!" |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Jojo alter Rang
![](images/avatars/10930814364b9fe4465f34c.jpg)
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 07.02.2016, 15:34 Titel: |
|
|
Schnism hat Folgendes geschrieben: | Leider werde ich ohne konkrete Beispieländerungen meines Codes nie schlau aus den "Beispielen". Da reicht meine Transferleistung nicht. |
Mal als Starthilfe:
1. Nicht mehrere Befehle in eine Zeile packen! Keine Sorge, dein Rechner hat noch genug Zeilenumbrüche auf Lager und es erhöht nebenbei noch die Lesbarkeit, wenn man nur einen Befehl pro Zeile verwendet.
2. Vielsagende Variablennamen: Lies dir selbst mal deinen Sourcecode laut vor und wundere dich dann, was zur Hölle nun "a2" bedeutet. Für simple Laufvariablen in einer FOR-Schleife ist es meist in Ordnung, einfach die Variable z.B. "i" zu nennen, aber für sonstige Variablen sind aussagekräftige Namen ein Muss.
3. Häufige Verwendung von GOTO/GOSUB erzeugt Spaghetticode. Das Program erhält eine klarere Struktur und wird leichter Verständlich, wenn du einzelne Funktionalitäten in SUBs und FUNCTIONs packst, z.B. eine für Nutzereingaben, eine um Züge auszuwerten, etc... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
![](https://sagamusix.de/other/nectarine/playing.png) |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 07.02.2016, 19:42 Titel: |
|
|
Also gut, nochmal langsam zum Mitdenken: Zitat: | Das ist doch drin ..
Code:
erfolg = (RND * rang(a2)): fzufall = (RND * rfzufall): ezufall = (RND * rezufall) | Richtig, an der Stelle ist der Wert ja auch noch in Ordnung. 7 Zeilen darunter steht aber: Code: | RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2)) |
Und die letzte Wertzuweisung an ezufall vor dem Vergleich mit fzufall in Code: | IF (kfas(a2) * ezufall) > (kfas(a3) * fzufall) AND spy(a3) > 0 THEN LOCATE 23, 1: PRINT "Ein gegnerischer Spion wurde ausgeschaltet": spy(a3) = spy(a3) - 1 | ist (4 Zeilen darüber): Code: | RANDOMIZE TIMER: a = (RND * 100): RANDOMIZE TIMER: ezufall = (RND * rang(a2)): RANDOMIZE TIMER: erfolg = (RND * rang(a2)) | Und da der Wert von rang(a2) wesentlich kleiner ist als der von rezufall, ist in der Folge auch ezufall immer wesentlich kleiner als fzufall, dem ja bis dahin kein neuer Wert zugewiesen wurde. Also musst du, um Probleme zu vermeiden, ezufall vor dem nächsten Vergleich mit fzufall mit Code: | ezufall = (RND * rezufall) | wieder einen "konkurrenzfähigen" Wert zuweisen (oder den ursprünglichen Wert irgendwo zwischenspeichern und wieder zurückschreiben).
Ansonsten kann ich mich nur den Ratschlägen von Jojo anschließen. Vergleiche mal das hier: Code: | IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND b5(a3) > 1 THEN
GOSUB 1972: LOCATE 21, 1: PRINT "Kathedralenteile: "; z: kat = kat + z: b5(a3) = b5(a3) - z: LOCATE 21, 20: PRINT "Gesamterfolg: "; kat
END IF | mit dem: Code: | IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND _
Int(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND _
b5(a3) > 1 THEN
GOSUB 1972
LOCATE 21, 1
PRINT "Kathedralenteile: "; z
kat = kat + z
b5(a3) = b5(a3) - z
LOCATE 21, 20
Print "Gesamterfolg: "; kat
END IF | und sag selbst, was sich besser lesen lässt. Und in der Programmdatei belegt ein Zeilenumbruch nicht mehr Platz als ein Doppelpunkt, nämlich genau ein Byte.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
dreael Administrator
![](images/avatars/112279543641421ec80e8e2.gif)
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 07.02.2016, 21:40 Titel: |
|
|
Schnism hat Folgendes geschrieben: | Ich schaue es mir trotzdem an. Dein Beitrag ist nicht umsonst. |
Gut so. :-)
Falls Du uns allen die letzte noch voll lauffähige Version (ich hätte noch eine WinUAE-Umgebung mit Kickstart 1.3 zur Hand für die AmigaBASIC-Version) zur Verfügung stellst, könnten wir uns dieses Spiel einmal anschauen und Vorschläge für ein geeignetes Software-Design (SUB und FUNCTIONs, evtl. sogar Klassen in FreeBasic) machen.
An dieser Stelle ein paar Beispiele von mir als Inspiration:
http://www.dreael.ch/Deutsch/Download/Zahnrad.html
http://www.dreael.ch/Deutsch/Download/Billard-Simulation.html
http://www.dreael.ch/Deutsch/Download/Pyramide3D.html
Das allererste Beispiel ist besonders gut geeignet für zum Anschauen: Ich hatte es ursprünglich auch vor meinem Studium noch in BASIC geschrieben und später auf C++ portiert: Kann man schön die Evolution von Zeilennummer mit GOTO/GOSUB (GW-BASIC) bis zur Objektorientierung (C++) mit all den Zwischenversionen sehen.
Da schliesslich kleine Schritte immer am erfolgsversprechendsten sind: Bereits die Elimination sämtlicher GOTOs und GOSUBs (Schritt zur strukturierten Programmierung) und dafür SUB und FUNCTION wird Dein Projekt massiv übersichtlicher und wartungsfreundlicher werden lassen. In QB als Vorstufe der Objektorientierung möglich: Zusammengesetzte Datentype mit TYPE. Ist u.a. bei der Billard-Simulation so gelöst, was den Code auch schon bei der QB-Version recht leserlich macht. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Schnism
![](images/avatars/669524975416d101427814.gif)
Anmeldungsdatum: 13.10.2004 Beiträge: 58 Wohnort: Schweiz
|
Verfasst am: 07.02.2016, 23:42 Titel: |
|
|
Schnism hat Folgendes geschrieben: | (ich habe schon früher versucht, das mit den SUBs zu verstehen und bin gescheitert. Mal schauen, ob ich heute schlauer bin) |
An dieser Stelle auch wieder ein Link aus meiner Sammlung:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SUB-Unterprogramme.html
Am besten einmal durchgehen. Hinweis: Viele in QB noch nicht mögliche Dinge sind in FreeBasic möglich. _________________ "...nichts ist so schlimm wie mein programmcode!"
Zuletzt bearbeitet von Schnism am 08.02.2016, 00:33, insgesamt einmal bearbeitet |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 07.02.2016, 23:58 Titel: |
|
|
Das Problem ist, dass im ersten (grünen) IF-Block Änderungen in den Werten vorgenommen werden, die sich auf die zweite Abfrage (rotes IF) auswirken. Du hast daher schon Recht, wenn grün nicht zum Tragen kommt, dann wanderst du (für spy(a3) > 0) in die rote Bedingung; umgekehrt kann es aber durchaus passieren, dass du sowohl in die grüne als auch anschließend (nach Berücksichtigung der Wertänderung) in die rote Bedingung wanderst. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Schnism
![](images/avatars/669524975416d101427814.gif)
Anmeldungsdatum: 13.10.2004 Beiträge: 58 Wohnort: Schweiz
|
Verfasst am: 08.02.2016, 00:39 Titel: |
|
|
nemored hat Folgendes geschrieben: | Das Problem ist, dass im ersten (grünen) IF-Block Änderungen in den Werten vorgenommen werden, die sich auf die zweite Abfrage (rotes IF) auswirken. Du hast daher schon Recht, wenn grün nicht zum Tragen kommt, dann wanderst du (für spy(a3) > 0) in die rote Bedingung; umgekehrt kann es aber durchaus passieren, dass du sowohl in die grüne als auch anschließend (nach Berücksichtigung der Wertänderung) in die rote Bedingung wanderst. |
Das ist für mich so nicht ganz zu verstehen.
Das ist ja eine For to NExt schleife.
vor allen IF abfragen kommen die wertebestimmungen.
Ist die grüne nicht erfüllt, springt er zum End IF und fragt die rote ab. die MUSS stimmen.
Dann kommt das Next und die wertebestimmung erfolgt erneut.
Es ist aber so, das diese immer kleiner ist. denn das next T hat vor den IF abfragen ja ezufall immer wieder neu berechnet. auch mit hohen werten .. da sind die anderen wertebestimmungen, die zwischen der grünen IF / END IF stehen noch gar nicht drangekommen.
Und trotzdem ist ezufalll IMMER kleiner..
und warum klappt dann 1971 nicht? Dort, wo ich die sicherung reingetan habe, das ezufall eigentlich NIE unter 1 kommen dürfte (zumindest nicht die ersten male. spy(a2) = 10 .. also MUSS ezufall doch MIN 10 sein ???
ich raff das nicht..
@EDIT
Ich werd irre.. er HAT sie erfüllt (die grüne Bedingung) .. und durch den durchgang durchs grüne erfüllt er auch gleichfalls die rote.. da ezufall per rang(a2) (also kleinem wert) in der Grünen neu erzeugt wird.. boah !
Ich muss einfach innerhalb der grünen IF / END IF die variable "ezufall" ersetzen .. (hab ich) und schon klappt es wie es soll .. das ist doch zum aus der haut fahren..
DANKE .. ihr habt mich gerettet .. _________________ "...nichts ist so schlimm wie mein programmcode!" |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 08.02.2016, 01:22 Titel: |
|
|
Zitat: | Ich werd irre.. er HAT sie erfüllt (die grüne Bedingung) .. und durch den durchgang durchs grüne erfüllt er auch gleichfalls die rote.. da ezufall per rang(a2) (also kleinem wert) in der Grünen neu erzeugt wird.. boah ! |
Sag ich doch. Hier ist ein ELSEIF deutlich empfehlenswerter.
Hat sich dann das Problem mit ezufall < fzufall gelöst? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 08.02.2016, 01:44 Titel: |
|
|
@Schnism: Das kommt durch deinen Spaghetticode! Ich habe dein Beispiel von oben mal in eine leserliche Form gebracht (ich habe dafür extra ein Programm geschrieben, das die Doppelpunkte durch Zeilenumbrüche ersetzt) und so abgeändert, daß entweder die grüne oder die rote Bedingung ausgeführt wird - und niemals beide: Code: | IF (esp * ezufall * spy(a2)) > (fsp * fzufall * spy(a3)) THEN
PRINT
LOCATE 3, 1
COLOR 8
PRINT "Ihre Spione konnten folgendes sabotieren/stehlen:"
PRINT
COLOR 10
RANDOMIZE TIMER
a = (RND * 100)
gold = INT(a * rang(a2) * ezufall)
IF gold > a9(a3) THEN
gold = a9(a3)
ENDIF
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND a9(a3) > 0 THEN
LOCATE 10, 1
PRINT "Gold: "; gold; t$
go = go + gold
a9(a3) = a9(a3) - gold
a9(a2) = a9(a2) + gold
LOCATE 10, 20
PRINT "Gesamterfolg: "; go
END IF
RANDOMIZE TIMER
a = (RND * 100)
RANDOMIZE TIMER
ezufall = (RND * rang(a2))
RANDOMIZE TIMER
erfolg = (RND * rang(a2))
IF INT(a * rang(a2)) > INT(((esp * ezufall) - rang(a2)) * erfolg) AND INT(a * rang(a2)) < INT(((esp * ezufall) + rang(a2)) * erfolg) AND inf(a3) > 1 THEN
GOSUB 1972
LOCATE 11, 1
PRINT "Infanteristen: "; z
in = in + z
inf(a3) = inf(a3) - z
LOCATE 11, 20
PRINT "Gesamterfolg: "; in
END IF
kfas(a2) = kfas(a2) + (RND * 1)
kfas(a3) = kfas(a3) - (RND * 1)
IF (kfas(a2) * ezufall) > (kfas(a3) * fzufall) AND spy(a3) > 0 Then
LOCATE 23, 1
ENDIF
PRINT "Ein gegnerischer Spion wurde ausgeschaltet"
spy(a3) = spy(a3) - 1
ELSEIF (esp * ezufall * spy(a2)) <= (fsp * fzufall * spy(a3)) AND spy(a3) > 0 THEN
COLOR 10
LOCATE 7, 1
PRINT "Ergebnis Spion"; t
LOCATE 23, 1
COLOR 12
PRINT "Tut mir leid, die gegnerischen Spione haben ihren Spion getötet"
spy(a2) = spy(a2) - 1
schlaf = 10
PRINT esp; ezufall; spy(a2), fsp; fzufall; spy(a3)
kfas(a2) = kfas(a2) - (RND * 2)
kfas(a3) = kfas(a3) + (RND * 2)
END IF
| Alles, was nach dem IF eingerückt ist, wird als Block ausgeführt, sobald die Bedingung erfüllt ist, ansonsten wird es komplett ignoriert und das Programm macht nach dem Block weiter.
Zitat: | Ich muss einfach innerhalb der grünen IF / END IF die variable "ezufall" ersetzen .. (hab ich) und schon klappt es wie es soll .. das ist doch zum aus der haut fahren..
| Ich glaube, jetzt hast du's begriffen. Denk immer dran: Der Computer tut nicht das, was du willst, sondern das, was du ihm sagst. Und das mit einer unglaublichen Sturheit...
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Schnism
![](images/avatars/669524975416d101427814.gif)
Anmeldungsdatum: 13.10.2004 Beiträge: 58 Wohnort: Schweiz
|
Verfasst am: 08.02.2016, 09:38 Titel: |
|
|
Guten Morgen meine Helden
Das lag einfach daran, das ich ausser beim Gold den eigenen und gegnerischen Zufall am rang wert festmachen wollte. (je höher der Rang, desto effektiver der erfolg), hab dabei aber übersehen, das er dann in der (roten) anderen Abfrage natürlich direkt kleiner sein musste ..
Was deine CODE Schreibweise betrifft:
Das macht mich irre. Du hast in deinem beispiel 2 abfragen drin.. meine bestehen derzeit aus 11? wenn ich alles einzeln schreiben würde, wird mir der abschnitt viel viel zu lang (scrollthema) ..
Denn ich tu ja nix anderes, nur eben dass meins in einer / zwei Zeile(n) steht.
Wenn ich das alles korrigiert habe, kommen wir zum nächsten Thema. Wenn wer mag, kann er ja einen effektiven Vorschlag machen.
Im alten Code (auf dem AMIGA.. leider habe ich das Programm nicht mehr) war die BAS Datei 357k gross. Dort gab es eine unmengen an if Then abfragen betreffend:
KRIEG!
Infanterie (inf(a2)), Kavallerie (kav(a2)), Artillerie, (art(a2)) und Milizen (mil(a2)) und ihre dazugehörige Kampfkraft kfai(a2), kfak(a2), kfaa(a2) und kfam(a2)
Prinzipiell ist ein Krieg der alten Zeit immer ein (geordnetes) Chaos.
Somit wäre mein Ansatz als erstes die zufällige begegnung. Wer kämpft gegen wen.
(a2 = ich, a3 = gegner)
inf(a2) gg art(a3) oder kav(a2) gg mil(a3) .. etc
dann die Kampfroutine (übergabe variablen, kämpfen lassen (kampfkraftvergleich, mengenrelation, glück))
also da kämpft nicht 1 gg 1 sondern inf gegen kav im gesamten. 10 Infanteristen gegen 20 artilleristen. Da artilleristen im Nahkampf unterlegen sind, gäbe es einen Malus. Wenn art gegen kav angreifen würde, wären die Kavalleristen deutlich unterlegen.
Man braucht nicht steuern zu können, wer wen angreift (daher ja auch chaos) sondern der Zufall wählt das aus. So bleibt es unberechenbar und man muss schon mit einer überlegenheit angreifen.
Auch die Relation von der Kampfkraft soll mit einfliessen. Denn 10 Infanteristen mit einem Kampfwert von 95 sollten 20 kavallisten mit einem kampfwert von 20 eher überlegen sein.
Wenn also jemand mag, kann er einen vorschlag machen
ich hab da schon was im Kopf.. aber das ist (noch? ) Spagetticode
Nur mal kleine Anmerkung:
Mein Code kommt von hier:
http://www.atarimania.com/game-atari-400-800-xl-xe-kaiser_2729.html
DAS ist das Original. Alles andere sind Nachahmungen. Und DORT drin findet ihr auch meine Variablennamen wie a9(a2) und dergleichen
Das Spiel ist von 1984. Somit beschäftige ich mich damit schon über 30 Jahre .. und solange habe ich "das Konstrukt" auch schon im Kopf und hole es immer wieder hervor.
Ich habe es also vom ATARI BASIC ins AMIGA BASIC und davon ins QBASIC portiert. Und das ein jedes mal aus dem Kopf ![durchgeknallt](images/smiles/icon_mad.gif) _________________ "...nichts ist so schlimm wie mein programmcode!" |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 08.02.2016, 18:43 Titel: |
|
|
Schnism hat Folgendes geschrieben: | ...hab dabei aber übersehen, das er dann in der (roten) anderen Abfrage natürlich direkt kleiner sein musste .. | Einsicht ist der erste Schritt zur Besserung.
Zitat: | Du hast in deinem beispiel 2 abfragen drin.. meine bestehen derzeit aus 11? | Ein Grund mehr, das Ganze übersichtlicher zu gestalten.
Zitat: | wenn ich alles einzeln schreiben würde, wird mir der abschnitt viel viel zu lang (scrollthema) .. | Ich nehme an, du arbeitest mit dem originalen QBasic-Editor. Zur Zeit seiner Entstehung war das Stand der Technik, nach heutigen Maßstäben ist er eine Zumutung. Wenn du schon partout beim QBasic-Interpreter bleiben möchtest, solltest du wenigstens einen modernen Editor wie FbEdit oder FBIde benutzen. Du hast damit- Darstellung von bis zu 70 Programmzeilen
- Farbliche Kennzeichnung von Befehlen, Strings, Satzzeichen, Text etc.
- Scrollen mit dem Mausrad
- Benutzung der normalen Zwischenablage
- Effektive Suchen / Ersetzen - Funktion
- Automatische Formatierung (Einrücken)
und vieles mehr. Du kannst das editierte Programm dann abspeichern, in den QBasic-Editor laden und dort ausführen (so bin ich bei der Suche nach dem ezufall - Fehler vorgegangen).
Zitat: | (a2 = ich, a3 = gegner) | Das ist eine schönes Beispiel zu Jojos Ratschlag mit den "sprechenden" Namen. Wenn du die Opponenten nicht a2 und a3 nennst, sondern ich und gegner, ist beim Lesen des Programms sofort klar, was gemeint ist.
Zitat: | ...kommen wir zum nächsten Thema. Wenn wer mag, kann er ja einen effektiven Vorschlag machen. | Gerne! Wie ich sehe, bist du gedanklich auch schon auf dem richtigen Weg zum strukturierten Programmieren:1. Was soll das Programm(stück) machen?
2. Welche Werte muß ich ihm dazu übergeben?
3. Welches Ergebnis soll es zurückliefern? Ein abgeschlossenes Programmstück, das eine solche Aufgabe erledigt, nennt man eine FUNCTION. Vielleicht können wir dir ja auf diesem Weg beibringen, wie sowas funktioniert.
Und noch ein Gedanke zum Thema "Strukturierung": Da jeder Spieler eine bestimmte Menge an Besitztümern, Soldaten, Spionen, usw. hat, die an seine Person gebunden sind, wäre es eine enorme Erleichterung beim Programmieren, wenn man all dies in einen eigenen Datentyp packen würde. Dann brauchte man jedem Spieler bei jedem Spielzug immer nur eine Variable mitzugeben. Das ist zwar erst mal etwas Arbeit, aber danach wirst du mit großen Augen und offenem Mund vor deinem Rechner sitzen und staunen, wie einfach das Programmieren plötzlich ist.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 08.02.2016, 20:02 Titel: |
|
|
Ich hätte übrigens ein ganz kurzes einfaches Beispiel für eine Funktion: statt
Code: | GOSUB 1972
'...
1972 z = INT((RND * 3) + 1): RETURN |
sähe das mit Funktionsaufruf so aus:
Code: | z = zufallszahl1bis3
' ...
FUNCTION zufallszahl1bis3
zufallszahl1bis3 = INT((RND * 3) + 1)
END FUNCTION |
und damit das Programm diese Funktion kennt, muss ganz nach oben noch die Zeile
Code: | DECLARE FUNCTION zufallszahl1bis3 |
Kann aber sein, dass diese Zeile vom QBasic-Editor automatisch ergänzt wird, ich weiß nicht mehr so genau.
Wie du siehst, sind Funktionen gar nicht so kompliziert.
Hat nebenbei den Vorteil, dass man damit nicht nur z auf einen Wert von 1 bis 3 setzen kann, sondern bei Bedarf auch eine andere Variable. Und mit etwas Modifikation ist mithilfe von Parameter-Übergabe auch jede beliebige andere Zufallszahl von x bis y möglich, ohne dass es dafür mehrere GOSUB-Sprungmarken bräuchte. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Schnism
![](images/avatars/669524975416d101427814.gif)
Anmeldungsdatum: 13.10.2004 Beiträge: 58 Wohnort: Schweiz
|
Verfasst am: 10.02.2016, 20:20 Titel: |
|
|
Hab euch nicht vergessen.. bin noch dranne Melde mich, wenn "mein" Werk fertig ist, das IHR dann auseinandernehmen dürft ![happy](images/smiles/icon_happy.gif) _________________ "...nichts ist so schlimm wie mein programmcode!" |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|