 |
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 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 27.04.2008, 01:39 Titel: Problem mi Compiler |
|
|
Ich habe ein kleines Schiffe versenken Spiel geschrieben, was schon komplett funktionsfähig ist aber noch ein paar Optimierungsarbeiten benötigt, sowohl technisch als auch optisch. Jetzt wollte ich das Spiel für einen Kumpel kompilieren, der es auf Herz und Nieren testen soll aber es kommt immer ein Fehler. Woran könnte das liegen?
http://www.skt-ev.de/qbxfehler.JPG
Wenn ihr den Code benötigt kann ich ihn gerne hier posten. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 27.04.2008, 08:28 Titel: |
|
|
OS? |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 27.04.2008, 10:39 Titel: |
|
|
Als OS Nutze ich Windows XP Professional SP2. Da ich andere Programme compilieren kann liegt es aber sicher nicht am Betriebssystem.
Hier der Code:
Code: | 0
CLEAR , , 0
'-----------------------------------------------------
posi = 225
DIM vr(posi) 'Variable fr alle Spielfelder (225 St.)
'Vorlage/Editor
vr(posi) = 0
'-----------------------------------------------------
'Variablen fr 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 berprft, 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[u][/u] |
Editiert durch Moderator: Code-Tags zur korrekten Darstellung des Quelltextes hinzugefügt. (Sebastian) |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.04.2008, 11:53 Titel: |
|
|
Zitat: | was schon komplett funktionsfähig ist aber noch ein paar Optimierungsarbeiten benötigt, sowohl technisch als auch optisch. |
optimiere am besten den sourcecode. der QB-Compiler hat so ein paar Eigenarten, wodurch sich so manchen Programm einfach nicht kompilieren lässt... so wie in diesem fall. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 27.04.2008, 14:29 Titel: |
|
|
Zitat: | optimiere am besten den sourcecode. der QB-Compiler hat so ein paar Eigenarten, wodurch sich so manchen Programm einfach nicht kompilieren lässt... so wie in diesem fall. |
wenn ich wüsste, was er genau nicht mag, wärs halt n bisschen einfacher. muss wohl rumprobieren..  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.04.2008, 14:39 Titel: |
|
|
Naja, der Code gehört nicht gerade der königsklasse an...
Code: | 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) |
an sowas könnte das z.B. liegen.
warum machst du das nicht einfach so? Ist auch besser für die augen
Code: |
LOCATE 7,1
FOR i = 91 to 105
Print vr(i);
Next
|
_________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 27.04.2008, 15:00 Titel: |
|
|
das finde ich lustig, habe ich nämlich schon so probiert und da hats mir immer die vorherige nummer überschrieben, jetzt gehts aber seltsamerweise. werde das natürlich umändern, schon weils viel code spart und übersichtlicher ist.
edit:
war doch n bissl anders bei mir aber wieso geht das nicht, wenn ich das so schreibe?
for i = 1 to 15
locate 1,i:print vr(i)
next i
mit dieser variante überschreibt er mir immer das vorherige zeichen. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 27.04.2008, 15:28 Titel: |
|
|
Ohne ein Blatt vor dem Mund zu nehmen: Typischer Fall für
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/Anfaengerfehler.html
@b3ast: Ich erlaube mir einmal wie ein Lehrer etwas Rotstift anzuwenden:
- GOTO sollte vollständig eliminiert werden!
- Da praktisch alles Ganzzahl ist, würde ich ein
an den Anfang nehmen
- Zu vr(): Würde ich zweidimensional anlegen, d.h.
Code: | DIM vr%(1 TO 15, 1 TO 15)
vr%(vx%, vy%) |
wobei intern mit 0 - 14 arbeiten häufig einfacher ist.
- Beim Spielfeld zeichnen: Benütz doch c (bzw. c%) selber, d.h.
Code: | COLOR 4
FOR c% = 1 TO 15
LOCATE c% + 6, 1
PRINT USING "##";c%
NEXT c% |
ist doch viel einfacher!
- zu vx und vy: Hier bietet es sich doch an, Wertbereich 1-15 entsprechend unserem DIM-Statement zu verwenden und stattdessen lieber kleine SUB-Routinen der Art
Code: | SUB ZeichneCursor(x%, y%)
LINE (33 + 16 * x%, 95 + 16 * y%) - STEP(9, 9), 15, BF
END SUB |
hineinnehmen.
- Und natürlich sollte z.B. bei
Code: | 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 |
das Prinzipt der logischen Mustererkennung angewendet werden. In diesem Fall:
Code: | IF posi MOD 15 = 1 THEN |
bedeutet dasselbe, ist aber viel kürzer und übersichtlicher! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.04.2008, 15:33 Titel: |
|
|
b3ast hat Folgendes geschrieben: | mit dieser variante überschreibt er mir immer das vorherige zeichen. |
Das liegt daran, dass QBasic immer noch ein Leerzeichen vor positive Zahlen setzt (als platzhalter für das nicht vorhandene negative vorzeichen). das kann man mit PRINT LTRIM$(RTRIM$(Zahl)) unterbinden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 27.04.2008, 17:08 Titel: |
|
|
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 |
|
Nach oben |
|
 |
b3ast
Anmeldungsdatum: 27.04.2008 Beiträge: 34
|
Verfasst am: 28.04.2008, 20:41 Titel: |
|
|
@dreael
danke für deine tips, werde mir das alles mal durchschauen und codeoptimierung betreiben, auch wenn mir ein paar sachen unklar sind aber da muss ich mich halt reinlesen.
edit:
sry, hätte ja auch edit im vorherigen post machen können. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 28.04.2008, 21:01 Titel: |
|
|
Wenn das Post dann schon etwas älter ist, oder die Gefahr besteht, dass jmd. eine wichtige Information noch nicht gelesen hat, ganz einfach weil derjenige den Post vor der Editierung gelesen haben könnte, kann man auch mal 'nen neuen verfassen.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
|
|
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.
|
|