QBasic Probleme mit der Übergabe von Variablen

Dieses Thema im Forum "Webmaster Hilfe / Programmierer Forum" wurde erstellt von b3ast, 23.04.2008.

  1. b3ast

    b3ast Erfahrener Benutzer

    Dabei seit:
    25.06.2007
    Beiträge:
    698
    Zustimmungen:
    0
    Hallo,

    ich habe ein kleines Programm, genauer gesagt einen Editor für das Spiel "Schiffe versenken" geschrieben bzw. bin gerade dabei. Allerdings gibt es ein paar Probleme mit dem Übergeben einer Variable. Der Code ist in QBasic geschrieben und ich will die Variable mit der Information der Position (geht von 1 bis 225 da ich 15x15 Felder habe) an eine weitere Variable übergeben, wenn ich die Leertaste gedrückt habe und ihr einen Wert geben (1 = gesetzt, 0=leeres Feld). Ich habe mir das in etwa so gedacht, vr(gesetzt) = 1 wobei gesetzt die übergebene Position ist und der Wert 1 aussagen soll, dass sich auf dieser Position ein Teil eines Schiffes befindet. Allerdings kommt bei mir immer ein Fehler, sobald ich das 2. Feld setzen möchte. Ich hoffe hier sind ein paar begeisterte QBasic Programmierer, die mir helfen können.
    Ich bitte die Leute, die C bzw. C++ anbeten und total gegen QBasic sind, sich ihren Post zu sparen, es sei denn er bringt mich weiter. Informationen ala lern doch C bringen mich nicht weiter.

    hier der Quellcode:
    http://www.skt-ev.de/schiffe.zip
     
  2. AdMan

    schau mal hier: Windows-Wartungs-Tool. Viele Probleme lassen sich damit einfach beheben. Oftmals ist der PC dann auch schneller!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren.
  3. #2 xandros, 23.04.2008
    xandros

    xandros IT Consultant, Cisco Registered Partner
    Moderator

    Dabei seit:
    05.07.2007
    Beiträge:
    25.881
    Zustimmungen:
    91
    Ort:
    Umkreis Duisburg, neben Mannheim, hinter Hamburg
    C/C++ muss ja auch nicht unbedingt sein.... Aber das veraltete QBasic würde ich trotzdem ausrangieren und einen moderneren Basic-Dialekt verwenden, der sich auch noch eine Weile hält. (Z.B. Visual Basic. Die Express-Version gibt es bei MS sogar kostenlos und ist sprachlich keine so gravierende Umstellung...)

    Hab zwar kein QBasic mehr, aber werd trotzdem mal einen Blick in den Code werfen. Dauert aber ein Weilchen....


    Edit: Dass ein GOSUB-Aufruf ein Return benötigt, ist dir bekannt?
    Wenn also ein GOSUB eine Subroutine "Weiter" aufruft, dann muss diese Routine am Ende mit einem Return die Kontrolle wieder an die aufrufende Funktion zurückgeben.

    Und ein Loop durch einen Selbstaufruf mit GOSUB ist auch nicht besonders geschickt..... (IF fr$ = "n" THEN GOTO 0 ELSE GOSUB abfr) ruft die Subroutine abfr aus sich selbst heraus auf und endet nirgends mit einem Return....
     
  4. b3ast

    b3ast Erfahrener Benutzer

    Dabei seit:
    25.06.2007
    Beiträge:
    698
    Zustimmungen:
    0
    Dass der Code nicht perfekt ist, ist mir durchaus bewusst. Ich bezeichne mich auch nicht als guten Programmierer. Allerdings möchte ich dieses kleine Projekt durchziehen, ich weiss dass ich das schaffen kann und ich werde es auch schaffen. Den Fehler habe ich jetzt übrigens gefunden, hätte ich selbst natürlich auch sehen können. Da ich meine Variable auf 1 gedimmt habe, war es klar, dass ab dem 2. Feld bei der Übergabe ein Fehler kommt. Die Zeile müsste heissen "posi = 225:DIM vr(posi)". Ich hatte ja vorher den Wert posi auf 1 gesetzt und damit war die Variable auf einen Wert beschränkt bzw. auf den Wert 1 und wenns drüber war kam der Fehler.

    Ich werde bestimmt noch auf weitere Probleme stoßen, ich hoffe nur, dass die sich hinziehen und ich etwas vorwärts komme. :)
    Wenns wieder ein Problem gibt meld ich mich wieder, deinen Ratschlag nehm ich mir zu Herzen. Wenn das Spiel fertig ist werd ich mich ebenfalls wieder melden.
     
  5. #4 xandros, 23.04.2008
    xandros

    xandros IT Consultant, Cisco Registered Partner
    Moderator

    Dabei seit:
    05.07.2007
    Beiträge:
    25.881
    Zustimmungen:
    91
    Ort:
    Umkreis Duisburg, neben Mannheim, hinter Hamburg
    richtige Einstellung! Mit Durchbeissen kommt man meistens ans Ziel und die Übung kann ohnehin nicht schaden.

    Der von dir genannte Fehler ist mir nicht aufgefallen, weil ich mir erst einmal die Logik des restlichen Codes angeschaut habe. Dabei bin ich an den fehlenden Returns hängengeblieben, was dann die Variable posi komplett verdrängt hat.
    Bei genauer Betrachtung hast du natürlich recht. Wenn das Array vr() nur eine Zelle hat, kann es logischerweise nur einen Wert aufnehmen.....

    Das nächste Projekt solltest du dann aber doch mit einer neueren Version machen, da du dann auch gleich objektorientiert arbeiten kannst. Der "Spaghetti-Code" ist zwar prinzipiell nicht verkehrt, aber auf Dauer nicht sehr praktisch.
     
  6. b3ast

    b3ast Erfahrener Benutzer

    Dabei seit:
    25.06.2007
    Beiträge:
    698
    Zustimmungen:
    0
    Dass ich meinen Code noch optimieren muss, ist mir bewusst, doch er funktioniert bereits und das ohne Fehler (habe jedenfalls keinen entdeckt). Doch jetzt kommt das nächste Problem. Ich will den Code natürlich compilieren, denn nicht jeder hat QBasic drauf und das ist äußerst umständlich, vorallem für Leute die damit nix am Hut haben. Bein Compilieren kommt allerdings folgender Fehler:

    http://www.skt-ev.de/qbxfehler.JPG

    Ich werde daraus nicht schlau aber ich weiss, dass ich andere Programme comilieren kann.


    Hier der Code
    0
    CLEAR , , 0


    '-----------------------------------------------------
    posi = 225
    DIM vr(posi) 'Variable f￾r alle Spielfelder (225 St.)
    'Vorlage/Editor

    vr(posi) = 0
    '-----------------------------------------------------








    'Variablen f￾r Spielfeld
    spx = 33
    spy = 95
    spcol = 15
    abstx = 0
    absty = 0
    nr = 1

    'Variablen zum Schiffe setzen
    'vx = spx + 2
    vx = 259
    'vy = spy + 2
    vy = 321
    vcol = 4

    'Variable, die ￾berpr￾ft, wieviele Schiffe schon gesetzt wurden
    schiffe = 0


    CLS
    SCREEN 12

    'Zeichnen des Spielfeldes
    FOR c = 1 TO 15
    COLOR 4
    LOCATE nr + 6, 1: PRINT nr
    nr = nr + 1
    NEXT c
    LOCATE 6, 6: PRINT "A B C D E F G H I J K L M N O"
    COLOR 15
    FOR a = 1 TO 15
    FOR B = 1 TO 15
    LINE (spx + abstx, spy + absty)-(spx + abstx + 16, spy + absty + 16), spcol, B
    absty = absty + 16
    NEXT B
    absty = 0
    abstx = abstx + 16
    NEXT a



    LINE (vx, vy)-(vx + 12, vy + 12), vcol, B 'Rechteck zum Zeichnen der Schiffe



    DO
    LOCATE 1, 1: PRINT posi, schiffe, vr(posi)
    IF schiffe = 12 THEN GOSUB abfr 'wenn alle 3 Schiffe gesetzt wurden wird eine Abfrage gemacht
    a$ = INKEY$
    IF a$ <> "" THEN GOSUB con
    LOOP

    con:
    SELECT CASE a$
    CASE CHR$(27)
    END
    CASE CHR$(0) + "P" 'RUNTER
    IF vy < 321 THEN
    LINE (vx, vy)-(vx + 12, vy + 12), 0, B
    vy = vy + 16
    posi = posi + 15
    LINE (vx, vy)-(vx + 12, vy + 12), vcol, B
    END IF
    CASE CHR$(0) + "H" 'HOCH
    IF vy > spy + 2 THEN
    LINE (vx, vy)-(vx + 12, vy + 12), 0, B
    vy = vy - 16
    posi = posi - 15
    LINE (vx, vy)-(vx + 12, vy + 12), vcol, B
    END IF
    CASE CHR$(0) + "M" 'RECHTS
    IF vx < 259 THEN
    LINE (vx, vy)-(vx + 12, vy + 12), 0, B
    vx = vx + 16
    posi = posi + 1
    LINE (vx, vy)-(vx + 12, vy + 12), vcol, B
    END IF
    CASE CHR$(0) + "K" 'LINKS
    IF vx > spx + 2 THEN
    LINE (vx, vy)-(vx + 12, vy + 12), 0, B
    vx = vx - 16
    posi = posi - 1
    LINE (vx, vy)-(vx + 12, vy + 12), vcol, B
    END IF
    CASE SPACE$(1)
    '---------- funzt schonmal optimal dieser Code !!! ------------
    IF schiffe = 0 OR schiffe = 3 OR schiffe = 7 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    IF schiffe > 0 AND schiffe < 3 OR schiffe > 3 AND schiffe < 7 OR schiffe > 7 THEN
    IF posi > 16 AND posi < 30 OR posi > 31 AND posi < 45 OR posi > 46 AND posi < 60 OR posi > 61 AND posi < 75 OR posi > 76 AND posi < 90 OR posi > 91 AND posi < 105 THEN
    IF vr(posi - 1) = 1 OR vr(posi + 1) = 1 OR vr(posi - 15) = 1 OR vr(posi + 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    IF posi > 106 AND posi < 120 OR posi > 121 AND posi < 135 OR posi > 136 AND posi < 150 OR posi > 151 AND posi < 165 OR posi > 166 AND posi < 180 OR posi > 181 AND posi < 195 OR posi > 196 AND posi < 210 THEN
    IF vr(posi - 1) = 1 OR vr(posi + 1) = 1 OR vr(posi - 15) = 1 OR vr(posi + 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    IF posi > 1 AND posi < 15 THEN
    IF vr(posi - 1) = 1 OR vr(posi + 1) = 1 OR vr(posi + 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    IF posi > 211 AND posi < 225 THEN
    IF vr(posi - 1) = 1 OR vr(posi + 1) = 1 OR vr(posi - 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    IF posi = 16 OR posi = 31 OR posi = 46 OR posi = 61 OR posi = 76 OR posi = 91 OR posi = 106 OR posi = 121 OR posi = 136 OR posi = 151 OR posi = 166 OR posi = 181 OR posi = 196 THEN
    IF vr(posi + 1) = 1 OR vr(posi - 15) = 1 OR vr(posi + 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    IF posi = 30 OR posi = 45 OR posi = 60 OR posi = 75 OR posi = 90 OR posi = 105 OR posi = 120 OR posi = 135 OR posi = 150 OR posi = 165 OR posi = 180 OR posi = 195 OR posi = 210 THEN
    IF vr(posi - 1) = 1 OR vr(posi - 15) = 1 OR vr(posi + 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    IF posi = 1 THEN
    IF vr(posi + 15) = 1 OR vr(posi + 1) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    IF posi = 15 THEN
    IF vr(posi - 1) = 1 OR vr(posi + 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    IF posi = 211 THEN
    IF vr(posi + 1) = 1 OR vr(posi - 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    IF posi = 225 THEN
    IF vr(posi - 1) = 1 OR vr(posi - 15) = 1 THEN
    IF vr(posi) = 0 THEN
    schiffe = schiffe + 1
    END IF
    LINE (vx, vy)-(vx + 12, vy + 12), 2, BF
    vr(posi) = 1
    END IF
    END IF
    END IF


    '--------------------------------------------------------------

    END SELECT
    RETURN

    abfr:
    LOCATE 3, 1: INPUT "Alle Schiffe wurden gesetzt, ist ihre Eingabe richtig? [J/N] "; fr$
    IF fr$ = "j" OR fr$ = "J" THEN GOSUB weiter
    IF fr$ = "n" THEN GOTO 0 ELSE GOSUB abfr

    weiter:
    CLS
    LOCATE 1, 2: PRINT vr(1); vr(2); vr(3); vr(4); vr(5); vr(6); vr(7); vr(8); vr(9); vr(10); vr(11); vr(12); vr(13); vr(14); vr(15)
    LOCATE 2, 2: PRINT vr(16); vr(17); vr(18); vr(19); vr(20); vr(21); vr(22); vr(23); vr(24); vr(25); vr(26); vr(27); vr(28); vr(29); vr(30)
    LOCATE 3, 2: PRINT vr(31); vr(32); vr(33); vr(34); vr(35); vr(36); vr(37); vr(38); vr(39); vr(40); vr(41); vr(42); vr(43); vr(44); vr(45)
    LOCATE 4, 2: PRINT vr(46); vr(47); vr(48); vr(49); vr(50); vr(51); vr(52); vr(53); vr(54); vr(55); vr(56); vr(57); vr(58); vr(59); vr(60)
    LOCATE 5, 2: PRINT vr(61); vr(62); vr(63); vr(64); vr(65); vr(66); vr(67); vr(68); vr(69); vr(70); vr(71); vr(72); vr(73); vr(74); vr(75)
    LOCATE 6, 2: PRINT vr(76); vr(77); vr(78); vr(79); vr(80); vr(81); vr(82); vr(83); vr(84); vr(85); vr(86); vr(87); vr(88); vr(89); vr(90)
    LOCATE 7, 2: PRINT vr(91); vr(92); vr(93); vr(94); vr(95); vr(96); vr(97); vr(98); vr(99); vr(100); vr(101); vr(102); vr(103); vr(104); vr(105)
    LOCATE 8, 2: PRINT vr(106); vr(107); vr(108); vr(109); vr(110); vr(111); vr(112); vr(113); vr(114); vr(115); vr(116); vr(117); vr(118); vr(119); vr(120)
    LOCATE 9, 2: PRINT vr(121); vr(122); vr(123); vr(124); vr(125); vr(126); vr(127); vr(128); vr(129); vr(130); vr(131); vr(132); vr(133); vr(134); vr(135)
    LOCATE 10, 2: PRINT vr(136); vr(137); vr(138); vr(139); vr(140); vr(141); vr(142); vr(143); vr(144); vr(145); vr(146); vr(147); vr(148); vr(149); vr(150)
    LOCATE 11, 2: PRINT vr(151); vr(152); vr(153); vr(154); vr(155); vr(156); vr(157); vr(158); vr(159); vr(160); vr(161); vr(162); vr(163); vr(164); vr(165)
    LOCATE 12, 2: PRINT vr(166); vr(167); vr(168); vr(169); vr(170); vr(171); vr(172); vr(173); vr(174); vr(175); vr(176); vr(177); vr(178); vr(179); vr(180)
    LOCATE 13, 2: PRINT vr(181); vr(182); vr(183); vr(184); vr(185); vr(186); vr(187); vr(188); vr(189); vr(190); vr(191); vr(192); vr(193); vr(194); vr(195)
    LOCATE 14, 2: PRINT vr(196); vr(197); vr(198); vr(199); vr(200); vr(201); vr(202); vr(203); vr(204); vr(205); vr(206); vr(207); vr(208); vr(209); vr(210)
    LOCATE 15, 2: PRINT vr(211); vr(212); vr(213); vr(214); vr(215); vr(216); vr(217); vr(218); vr(219); vr(220); vr(221); vr(222); vr(223); vr(224); vr(225)
    SLEEP









    'Ausgabe in Datei

    LOCATE 20, 1
    7
    INPUT "Ausgabe in Datei? (j/n)", in$

    IF in$ = "n" THEN END
    IF in$ <> "j" THEN GOTO 7

    FILES "*.txt"

    namedatei:
    LOCATE 20, 1
    PRINT " "
    LOCATE 20, 1
    INPUT "Name der Datei?", in$

    CLOSE
    OPEN in$ + ".txt" FOR OUTPUT AS #1


    FOR i = 1 TO 225


    PRINT #1, vr(i)


    NEXT i

    CLOSE
    GOTO 999
    RETURN


    fehler:

    SELECT CASE ERR
    CASE 52 'Bad file name or number.

    CASE 53 'File not found.
    RESUME NEXT
    CASE 57 'Device I/O error.
    LOCATE 21, 1: PRINT "You should probably format the diskette."
    END
    CASE 64 'Bad File Name.
    LOCATE 21, 1: PRINT "The drive name you specified was not correct."
    RESUME namedatei
    CASE 68 'Device unavailable.
    LOCATE 21, 1: PRINT "The drive you named is unavailable."
    END
    CASE 71 'Drive not ready.
    LOCATE 21, 1: PRINT "The drive was not ready. Check the drive!"
    END
    CASE ELSE
    LOCATE 21, 1: PRINT "An unexpected FATAL error has occurred."
    STOP

    END SELECT
    RETURN


    999
    INPUT "Wollen Sie weitere Schiffe setzen? [J/N]"; ab$
    IF ab$ = "j" OR ab$ = "J" THEN GOTO 0
    IF ab$ = "n" THEN END ELSE GOTO 999
     
  7. b3ast

    b3ast Erfahrener Benutzer

    Dabei seit:
    25.06.2007
    Beiträge:
    698
    Zustimmungen:
    0
    Ich habe mich nochmal rangemacht und meine erste Betaversion des Spiels fertiggestellt. Das Spiel hört auf den Namen SHIP - SHOT (sehr originell, ich weiss aber mir ist nix anderes eingefallen).
    Ihr könnt es euch hier downloaden. Bei Interesse lad ich auch gerne den Quellcode hoch.

    www.skt-ev.de/shipshot.zip
     
  8. AdMan

    Es ist generell erstmal empfehlenswert alle ggf. veralteten oder fehlerhaften Treiber zu scannen und auf neue zu aktualisieren. Hier kannst du einen Treiber-Scanner downloaden. Das erspart oftmals viel Ärger und hilft gegen diverse Probleme.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren.
Thema:

QBasic Probleme mit der Übergabe von Variablen

Die Seite wird geladen...

QBasic Probleme mit der Übergabe von Variablen - Ähnliche Themen

  1. Aldi Talk Probleme

    Aldi Talk Probleme: Hey, ich habe für meine Tochter ALDI TALK Musik Paket M abgeschlossen. Kann mir hier mal jemand erklären was das Produkt beinhaltet, bzw. mit...
  2. Upload und ping Probleme

    Upload und ping Probleme: Hallo lieber User, seit kurzem haben ich ein heftiges Problem. Mein Upload ist unterirdisch langsam und mein Ping schwankt heftig. Wir haben...
  3. Graka GTX 1060 Macht Probleme :O

    Graka GTX 1060 Macht Probleme :O: Hallo liebes Board, ich hab mir vor ein paar Tagen ne neue Grafikkarte gekauft und leider macht die ein paar Probleme, in Form von ziemlich harten...
  4. Probleme mit IncrediMail

    Probleme mit IncrediMail: Hallo, ich habe das E-Mailprogramm von "Incredimail" und bin zufrieden damit. Nun kam eine E-Mail die mir nicht gefiel. Also habe ich diese nicht...
  5. Suche Service-Hotline für PC-Probleme!

    Suche Service-Hotline für PC-Probleme!: Guten Tag! Ich habe ein paar (größere) Software-Probleme und suche nach einer kompetenten Beratung via Telefon- das sollte fürs erste reichen!...