Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Eine Wirtschaftssimulation und ihre Umsetzung.
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Schnism



Anmeldungsdatum: 13.10.2004
Beiträge: 58
Wohnort: Schweiz

BeitragVerfasst am: 06.02.2016, 16:02    Titel: Antworten mit Zitat

Mist.. stimmt..

Zitat:
1972 RANDOMIZE TIMER: z = INT((RND * 3) + 1): RETURN


da isser lächeln

Denk dran, das ist nur ein Schnipsel happy

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 06.02.2016, 16:13    Titel: Antworten mit Zitat

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. traurig 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 zwinkern ). 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 06.02.2016, 18:43    Titel: Antworten mit Zitat

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. grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
Schnism



Anmeldungsdatum: 13.10.2004
Beiträge: 58
Wohnort: Schweiz

BeitragVerfasst am: 06.02.2016, 19:38    Titel: Antworten mit Zitat

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. traurig 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 zwinkern ). 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 lächeln (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 lachen (was ich echt NICHT glauben werde grinsen )

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 06.02.2016, 19:52    Titel: Antworten mit Zitat

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, 19:53, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.02.2016, 19:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 06.02.2016, 23:52    Titel: Antworten mit Zitat

Schnism hat Folgendes geschrieben:
Ich dachte, das setzen der Variablen wäre für euch "ein klacks"
Du bist ein Scherzkeks! mit den Augen rollen

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. Ich brauch nen Kaffee...

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Schnism



Anmeldungsdatum: 13.10.2004
Beiträge: 58
Wohnort: Schweiz

BeitragVerfasst am: 07.02.2016, 08:59    Titel: Antworten mit Zitat

Guten Morgen

Zuerst: meinen fetten dank dafür, dass du dort drüberschaust ..

dreael hat Folgendes geschrieben:

Ohne Dir irgendwie zu nahe zu treten wollen: Passt wieder einmal ziemlich gut zu

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/Anfaengerfehler.html

Na, das weiss ich doch lachen 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. Daumen rauf!
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 lachen
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. traurig

RANDOMIZE TIMER: Done!
_________________
"...nichts ist so schlimm wie mein programmcode!"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.02.2016, 14:34    Titel: Antworten mit Zitat

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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 07.02.2016, 18:42    Titel: Antworten mit Zitat

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. lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 07.02.2016, 20:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Schnism



Anmeldungsdatum: 13.10.2004
Beiträge: 58
Wohnort: Schweiz

BeitragVerfasst am: 07.02.2016, 22:42    Titel: Antworten mit Zitat

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 07.02.2016, 23:33, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 07.02.2016, 22:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Schnism



Anmeldungsdatum: 13.10.2004
Beiträge: 58
Wohnort: Schweiz

BeitragVerfasst am: 07.02.2016, 23:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 08.02.2016, 00:22    Titel: Antworten mit Zitat

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. grinsen 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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 08.02.2016, 00:44    Titel: Antworten mit Zitat

@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. lächeln Denk immer dran: Der Computer tut nicht das, was du willst, sondern das, was du ihm sagst. Und das mit einer unglaublichen Sturheit... grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Schnism



Anmeldungsdatum: 13.10.2004
Beiträge: 58
Wohnort: Schweiz

BeitragVerfasst am: 08.02.2016, 08:38    Titel: Antworten mit Zitat

Guten Morgen meine Helden lächeln

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. lächeln

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 lächeln
ich hab da schon was im Kopf.. aber das ist (noch? ) Spagetticode lachen

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 lachen
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
_________________
"...nichts ist so schlimm wie mein programmcode!"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 08.02.2016, 17:43    Titel: Antworten mit Zitat

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. zwinkern

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! lächeln 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. zwinkern

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. lächeln

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 08.02.2016, 19:02    Titel: Antworten mit Zitat

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. grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
Schnism



Anmeldungsdatum: 13.10.2004
Beiträge: 58
Wohnort: Schweiz

BeitragVerfasst am: 10.02.2016, 19:20    Titel: Antworten mit Zitat

Hab euch nicht vergessen.. bin noch dranne lächeln Melde mich, wenn "mein" Werk fertig ist, das IHR dann auseinandernehmen dürft happy
_________________
"...nichts ist so schlimm wie mein programmcode!"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6, 7  Weiter
Seite 2 von 7

 
Gehe zu:  
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.

 Impressum :: Datenschutz