Erstes Spiel (TicTacToe)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Shyiox

Betreff: Erstes Spiel (TicTacToe)

BeitragFr, Okt 08, 2010 0:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, ich hab mit BB heute angefangen und hab mir die Tutorials erstmal durchgelesen, und hab mir gedacht ich fang mit was einfachem an, und da bin ich auf TicTacToe gekommen.
Das "Minigame" ist jetzt fertig und funktioniert komplett, jetzt hätte ich von euch gerne noch Kritik was ich an dem Code besser schreiben könnte:

(den Code kann sich natürlich jeder kopieren ;D)

BlitzBasic: [AUSKLAPPEN]
Graphics 220, 275, 16, 0
SetBuffer BackBuffer()

AppTitle "Tic Tac Toe"

img_background = LoadImage("images/background.bmp")
img_mark = LoadAnimImage("images/mark.bmp",58,58,0,3)
MaskImage img_mark, 0, 0, 0
Dim ent_field(2,2)
Global info_player=1
Global game=1

Repeat
Cls

DrawImage img_background,0,0

For x=0 To 2
For y=0 To 2
DrawImage img_mark,11+(12*x+58*x),11+(12*y+58*y),ent_field(x,y)
If ent_field(x,y)=0 Then
If RectsOverlap(MouseX(),MouseY(),1,1,11+(12*x+58*x),11+(12*y+58*y),58,58) Then
If MouseDown(1) And game=1
If MouseHit(1)
ent_field(x,y)=info_player
If info_player=1 Then
info_player=2
ElseIf info_player=2 Then
info_player=1
EndIf
EndIf
EndIf
EndIf
EndIf
Next
Next

If win>0 Then
Color 0,255,0
Text 60,103,"Player "+win+" wins!"
game=0
EndIf

mathbufferX1=ent_field(0,0)*ent_field(1,0)*ent_field(2,0)
mathbufferX2=ent_field(0,1)*ent_field(1,1)*ent_field(2,1)
mathbufferX3=ent_field(0,2)*ent_field(1,2)*ent_field(2,2)
mathbufferY1=ent_field(0,0)*ent_field(0,1)*ent_field(0,2)
mathbufferY2=ent_field(1,0)*ent_field(1,1)*ent_field(1,2)
mathbufferY3=ent_field(2,0)*ent_field(2,1)*ent_field(2,2)
mathbufferZ1=ent_field(0,0)*ent_field(1,1)*ent_field(2,2)
mathbufferZ2=ent_field(0,2)*ent_field(1,1)*ent_field(2,0)

If mathbufferX1=1 Or mathbufferX2=1 Or mathbufferX3=1 Or mathbufferY1=1 Or mathbufferY2=1 Or mathbufferY3=1 Or mathbufferZ1=1 Or mathbufferZ2=1 Then
win=1
ElseIf mathbufferX1=8 Or mathbufferX2=8 Or mathbufferX3=8 Or mathbufferY1=8 Or mathbufferY2=8 Or mathbufferY3=8 Or mathbufferZ1=8 Or mathbufferZ2=8 Then
win=2
EndIf

summe=ent_field(0,0)+ent_field(0,1)+ent_field(0,2)+ent_field(1,0)+ent_field(1,1)+ent_field(1,2)+ent_field(2,0)+ent_field(2,1)+ent_field(2,2)
If summe=13 Or summe=14
game=0
Color 0,255,0
Text 70,103,"Undecided!"
EndIf

If RectsOverlap(MouseX(),MouseY(),1,1,1,225,220,50) And MouseDown(1) And MouseHit(1) Then
For a=0 To 2
For b=0 To 2
ent_field(a,b)=0
Next
Next
game=1
win=0
EndIf

Flip
Until KeyHit(1)

End

ToeB

BeitragFr, Okt 08, 2010 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal !

Wäre aber schön wenn du uns noch die Bilddateien mitschicken würdest...

Code sieht auf den ersten Blick schonmal gut aus, guck ihn mir aber erst an
wenn ich die Bilder habe Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Eingeproggt

BeitragFr, Okt 08, 2010 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Für das erste Spiel schonmal sehr gut, aber ich hab dennoch n paar Dinge gefunden, die man verbessern kann:

1.) Die Auflösung von 220*275 im Vollbildmodus wird auf der einen oder anderen Graphikkarte Schwierigkeiten bereiten. Nimm "Standardauflösungen" wie zB 800*600, 1024*768 usw. Oder was ich fast noch mehr empfehlen würde: Verwende den Fenstermodus (letzter Parameter bei Graphics auf 2)

2.) Der Klassiker, deine Verwendung von Flip. An sich richtig das mitn backBuffer und Flip, aber wenn dann gleich richtig, hier steht wie es richtig gehört

3.) Ebenso ein Klassiker, deine Abfrage von MouseHit: Die wird so nicht oft funktionieren fürchte ich, halte dich da besser an die FAQ.

Ansonsten wären da nur noch Kleinigkeiten, wie zB:
-) Mann kann sich die Zeile "MaskImage img_mark, 0, 0, 0" sparen, schwarz wird standardmäßig maskiert
-) DrawBlock wäre schneller als DrawImage, ob die Anwendung bei dir möglich ist kann ich leider so nicht sagen. Wenn dann nur für deinen Background.

Aber wirklich ned schlecht fürs Erste! Du hast vermutlich schon Programmiererfahrung, oder?
mfG, Christoph.

EDIT @ Xeres:
Da sind wir uns einig Wink
Die Farbtiefe von 16Bit wird im Fenstermodus zwar ignoriert, aber das ändert ja ned wirklich viel. Weder am Aussehen (das wird höchstens besser) noch an der Performance (da die meisten GraKas eh besser mit 32Bit zurecht kommen).
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am Fr, Okt 08, 2010 0:45, insgesamt 2-mal bearbeitet

Xeres

Moderator

BeitragFr, Okt 08, 2010 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Graphics 220, 275, 16, 0

Das ist irgendwie etwas unsinnig, denn:
Modus 0 ist (wie in der OH nach zu lesen) "Fenstermodus bei Debug, sonst Vollbild"
- Welche Grafikkarte stellt 220x275 im Vollbild da?
Ich würde da auf den Fenstermodus 2 setzen. Ob die Farbtiefe im Fenster überhaupt beachtet wird, kann ich grad' nicht mal sagen...

Ein bisschen Lesestoff, den du umsetzen solltest:
Hurra, 100 % Auslastung
Wie kann ich Mausklicks richtig abfragen ?

Sieht ansonsten ja nicht schlecht aus, also: weitermachen Wink
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Shyiox

BeitragFr, Okt 08, 2010 0:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, so viele Antworten Very Happy

@ToeB: Bilder sind unterwegs...

@Eingeproggt:
1) 0 = Vollbild? o.O Bei mir zeigt der da Fenstermodus ._.
2) Wird morgen gelesen Wink
3) Joar... kann ich nich viel zu sagen, ich probiers mal anders...
PS: Ein wenig schon ja ^^
Wenn du evtl. Garry's Mod spielst das gibt es ne Ingame Programmiersprache gennant Expression2 (fast genauso wie Lua aufgebaut) die kann ich schon fast auswendig >.>
Aber BB ist doch fürn Anfänger zwar einfach, aber an der Umsetzung in ein Spiel/Programm happerts ein bisschen Rolling Eyes

@Xeres: Selbes wie bei Eingeproggt... Wusste garnich das das Vollbild is ^^

----- Spiel-Dateien -----

Mfg Shyiox

PS: Eine Frage hätte ich jetzt noch, könnte mir das mal jemand zu ner .exe machen?
Hab leider nur die Demo im Moment Sad

Raiden93

BeitragFr, Okt 08, 2010 5:47
Antworten mit Zitat
Benutzer-Profile anzeigen
WoW das hast du nicht wirklich alles in 1 Tag gelernt?
 

BBPro2

BeitragFr, Okt 08, 2010 6:00
Antworten mit Zitat
Benutzer-Profile anzeigen
also wenn er, wie er ja offen zugibt, schon vorher programmiererfahrung gesammelt hat, ist das durchaus in einem tag lern- und machbar denke ich

zum programm selbst kann ich mich meinen vorrednern nur anschließen - bis auf die paar genannten dinge recht ordentlicher code, auch wenn man

Code: [AUSKLAPPEN]

    mathbufferX1=ent_field(0,0)*ent_field(1,0)*ent_field(2,0)
    mathbufferX2=ent_field(0,1)*ent_field(1,1)*ent_field(2,1)
    mathbufferX3=ent_field(0,2)*ent_field(1,2)*ent_field(2,2)
    mathbufferY1=ent_field(0,0)*ent_field(0,1)*ent_field(0,2)
    mathbufferY2=ent_field(1,0)*ent_field(1,1)*ent_field(1,2)
    mathbufferY3=ent_field(2,0)*ent_field(2,1)*ent_field(2,2)
    mathbufferZ1=ent_field(0,0)*ent_field(1,1)*ent_field(2,2)
    mathbufferZ2=ent_field(0,2)*ent_field(1,1)*ent_field(2,0)


sicher geschickter hätte lösen können mit schleifen etc
 

Shyiox

BeitragFr, Okt 08, 2010 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja bei dem mathbuffer is mir leider nix anderes eingefallen >.>
Aber auf jedenfall geht das Spiel Smile

@Raiden93: Ja ich bin vorhher schonmal auf BB aufmerksam geworden, hab kurz mir die ersten 2 Tutorials oder so durchgelesen, hatte dann aber nicht weitergemacht, und jetzt bin ich mal alles durchgegegangen...

So und jetzt nochmal zu meiner Frage, gibt es irgendwie ne Möglichkeite das ich aus dem ganzen Zeug ne .exe machen kann?
Oder geht das in der Demo nicht?

Wenn nicht geht, könnte mir dann jemand daraus ne .exe machen? (aber vorher oben Graphics auf Fenster machen >.<)

Mfg Shyiox

PS: Die Bildchen sind in der Arbeitszeit übrigens inbegriffen... alles selfmade Smile

Sephka

BeitragFr, Okt 08, 2010 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier die .exe...

EDIT:Ok Danke für den Hinweis...
Mein Freund und Helfer:
Win7 Home Premium SP1
AMD Athlon II X4 645 3.1GHZ
8GB Ram
64bit
  • Zuletzt bearbeitet von Sephka am Fr, Okt 08, 2010 14:12, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, Okt 08, 2010 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Die Demo kann keine Exe kompilieren, das ist richtig.
2. Wer kompilieren möchte, sollte sich Blitzbasic kaufen. Fremdkompilieren ist hier nicht gern gesehen. Siehe Forensatzung.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Shyiox

BeitragFr, Okt 08, 2010 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm ok schade Sad

Hab jetzt nochmal paar Verbesserungen gemacht, z.B. hab ich erstmal den Bug rausgenommen, das wenn man mit dem letzten zug gewinnt das über dem player wins, nochmal Undecided steht...
Und ich hab reingemacht welcher spieler dranne ist, und wie der punktestand ist Smile

Und natürlich hab ich außerdem eure Tipps umgesetzt (auslastung nun nichtmehr auf 100% - framrate=30)

Hier der Code:

Code: [AUSKLAPPEN]
Graphics 220, 275, 16, 2
SetBuffer BackBuffer()

AppTitle "Tic Tac Toe"

time_flip=CreateTimer(30)
img_background = LoadImage("images/background.bmp")
img_mark = LoadAnimImage("images/mark.bmp",58,58,0,3)
MaskImage img_mark, 0, 0, 0
Dim ent_field(2,2)
Global info_player=1
Global game=1

While Not KeyHit (1)
    Cls
   
    act_mousehit=MouseHit(1)
    DrawBlock img_background,0,0
   
    Color 0,0,255
    Text 180,243,wins1
    Color 0,0,0
    Text 190,243,":"
    Color 255,0,0
    Text 200,243,wins2
   
   
    If info_player=1 Then
        Color 0,0,255
        Text 18,243,info_player
    ElseIf info_player=2 Then
        Color 255,0,0
        Text 18,243,info_player
    EndIf
   
    For x=0 To 2
        For y=0 To 2
            DrawImage img_mark,11+(12*x+58*x),11+(12*y+58*y),ent_field(x,y)   
            If ent_field(x,y)=0 Then
                If RectsOverlap(MouseX(),MouseY(),1,1,11+(12*x+58*x),11+(12*y+58*y),58,58) Then
                    If MouseDown(1) And game=1
                        If act_mousehit
                            ent_field(x,y)=info_player
                            If info_player=1 Then
                                info_player=2
                            ElseIf info_player=2 Then
                                info_player=1
                            EndIf
                        EndIf
                    EndIf
                EndIf
              EndIf
        Next
    Next
   
    If     win>0 Then
        Color 0,255,0
        Text 60,103,"Player "+win+" wins!"
        game=0
    EndIf
   
    mathbufferX1=ent_field(0,0)*ent_field(1,0)*ent_field(2,0)
    mathbufferX2=ent_field(0,1)*ent_field(1,1)*ent_field(2,1)
    mathbufferX3=ent_field(0,2)*ent_field(1,2)*ent_field(2,2)
    mathbufferY1=ent_field(0,0)*ent_field(0,1)*ent_field(0,2)
    mathbufferY2=ent_field(1,0)*ent_field(1,1)*ent_field(1,2)
    mathbufferY3=ent_field(2,0)*ent_field(2,1)*ent_field(2,2)
    mathbufferZ1=ent_field(0,0)*ent_field(1,1)*ent_field(2,2)
    mathbufferZ2=ent_field(0,2)*ent_field(1,1)*ent_field(2,0)
   
    If mathbufferX1=1 And win<>1 Or mathbufferX2=1 And win<>1 Or mathbufferX3=1 And win<>1 Or mathbufferY1=1 And win<>1 Or mathbufferY2=1 And win<>1 Or mathbufferY3=1 And win<>1 Or mathbufferZ1=1 And win<>1 Or mathbufferZ2=1 And win<>1 Then
        win=1
        wins1=wins1+1
    ElseIf mathbufferX1=8 And win<>2 Or mathbufferX2=8 And win<>2 Or mathbufferX3=8 And win<>2 Or mathbufferY1=8 And win<>2 Or mathbufferY2=8 And win<>2 Or mathbufferY3=8 And win<>2 Or mathbufferZ1=8 And win<>2 Or mathbufferZ2=8 And win<>2 Then
        win=2
        wins2=wins2+1
    EndIf
   
    summe=ent_field(0,0)+ent_field(0,1)+ent_field(0,2)+ent_field(1,0)+ent_field(1,1)+ent_field(1,2)+ent_field(2,0)+ent_field(2,1)+ent_field(2,2)
    If summe=13 And win=0 Or summe=14 And win=0
        game=0
        Color 0,255,0
        Text 70,103,"Undecided!"
    EndIf
   
    If RectsOverlap(MouseX(),MouseY(),1,1,1,225,220,50) And MouseDown(1) And MouseHit(1) Then
        For a=0 To 2
            For b=0 To 2
                ent_field(a,b)=0
            Next
        Next
        game=1
        win=0
    EndIf

    WaitTimer time_flip
    Flip
Wend

End

Eingeproggt

BeitragFr, Okt 08, 2010 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Na bitte, geht doch flott voran, aber es gibt immer was zu lernen Wink
Zu den 100% CPU: Sicher nicht mehr? Weil du hast ein einziges Zeichen vergessen, nämlich müsste man Flip 0 in Verbindung mit dem Timer schreiben. Kleiner Unterschied, große Wirkung ^^

Wie BBPro2 schon schrieb lässt sich sicher einiges noch vereinfachen, ich weise dich mal auf dein neues Konstrukt hin, welches man kürzer schreiben könnte, es geht um diesen Teil hier:
BlitzBasic: [AUSKLAPPEN]
If mathbufferX1=1 And win<>1 Or mathbufferX2=1 And win<>1 Or mathbufferX3=1 And win<>1 Or mathbufferY1=1 And win<>1 Or mathbufferY2=1 And win<>1 Or mathbufferY3=1 And win<>1 Or mathbufferZ1=1 And win<>1 Or mathbufferZ2=1 And win<>1 Then 
win=1
wins1=wins1+1
ElseIf mathbufferX1=8 And win<>2 Or mathbufferX2=8 And win<>2 Or mathbufferX3=8 And win<>2 Or mathbufferY1=8 And win<>2 Or mathbufferY2=8 And win<>2 Or mathbufferY3=8 And win<>2 Or mathbufferZ1=8 And win<>2 Or mathbufferZ2=8 And win<>2 Then
win=2
wins2=wins2+1
EndIf

Da kann man die Abfrage von win "heraus nehmen" und kommt zu dieser, verschachtelten Abfrage:
BlitzBasic: [AUSKLAPPEN]
If win<>1 Then
If mathbufferX1=1 Or mathbufferX2=1 Or mathbufferX3=1 Or mathbufferY1=1 Or mathbufferY2=1 Or mathbufferY3=1 Or mathbufferZ1=1 Or mathbufferZ2=1 Then
win=1
wins1=wins1+1
EndIf
ElseIf win<>2 Then
If mathbufferX1=8 Or mathbufferX2=8 Or mathbufferX3=8 Or mathbufferY1=8 Or mathbufferY2=8 Or mathbufferY3=8 Or mathbufferZ1=8 Or mathbufferZ2=8 Then
win=2
wins2=wins2+1
EndIf
EndIf

Sollte an sich gehn, pobiert hab ichs aber leider nicht.

Weiterhin viel Spass!
Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

das wurgel

BeitragFr, Okt 08, 2010 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn dein Spiel seine Perfektion erreicht hat, könntest du dich ja Mal mit Funktionen vertraut machen und eine KI programmieren. Bei TicTacToe ist das relativ leicht, da man man einfach bruteforce alle Möglichkeiten durchgehen kann. Am einfachsten ist es, eine Funktion zu schreiben, die sich für jeden möglichsen Zug selbst aufruft, wobei eine Kopie des Spielfeldes verändert und bei Ablauf der Funktion wieder zurückgesetzt wird. Hab sowas gemacht, als ich in Java angefangen hab. Es wahr sehr knifflich und hat Spaß gemacht.
1 ist ungefähr 3
 

primero

BeitragFr, Okt 08, 2010 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
nettes Spiel, und schon sehr gut für en ersten Tag. Alle Achtung.

hier mal meine Verbesserungsvorschläge:


(1) definiere alle deine Variablen am Programmanfang, evtl. mit kleinem beschreibungstext für was sie verwendet werden. besonders in größeren und komplexeren Programme ist es hilfreich wenn man sich das angewöhnt hat und keine Variable im hauptprog. definiert.

z.B.
Code: [AUSKLAPPEN]
...
Dim ent_field(2,2)
Global info_player=1
Global game=1
[b]Global act_mousehit  ;fragt ab ob li. Maustaste gedrückt wird[/b]
 ...


(2) Deine Überprüfung der Mausposition zu einer Schaltfläche mutet mir etwas kompliziert an. sparsammer wäre es, wenn du in einer Variablen die Mausposition zu beginn der schleife speicherst und dann nur prüfst ob diese inerhalb eines gewissen gebietes sind. berechnungen würde ich zudem nicht inerhalb des if-satzes ausführen. später entwickelt man länger und komplexere Formeln und ist dann froh wenn diese übersichtlich aufgeführt werden. daher definiere ich die gesuchten x und y positionen immer vorher, notfals sogar in mehreren schritten.

Alt
Code: [AUSKLAPPEN]
If RectsOverlap(MouseX(),MouseY(),1,1,11+(12*x+58*x),11+(12*y+58*y),58,58) Then


neu:
Code: [AUSKLAPPEN]
while .....
mausx=mousex()
mausy=mousey()
.......
x=11+(12*x+58*x)
y=11+(12*y+58*y)
if mausx>=x and mausx<=x-58 and mausy>=y and mausy<=y-58
....
wend


(3) prüfe ob du etwas doppelt abfragst. von der Geschw. her ist es nicht zwingend erforderlich, sorgt aber für eine bessere übersicht:

alt
Code: [AUSKLAPPEN]
If MouseDown(1) And game=1
If act_mousehit


neu
Code: [AUSKLAPPEN]
if act_mousehit=1 then



(4) manches lässt sich deutlich kürzer schreiben, womit mehr Übersicht gewonnen wird

alt
Code: [AUSKLAPPEN]
If info_player=1 Then
info_player=2
ElseIf info_player=2 Then
info_player=1
EndIf


neu
Code: [AUSKLAPPEN]
info_player=3-info_player


alt
Code: [AUSKLAPPEN]
    mathbufferX1=ent_field(0,0)*ent_field(1,0)*ent_field(2,0)
    mathbufferX2=ent_field(0,1)*ent_field(1,1)*ent_field(2,1)
    mathbufferX3=ent_field(0,2)*ent_field(1,2)*ent_field(2,2)
    mathbufferY1=ent_field(0,0)*ent_field(0,1)*ent_field(0,2)
    mathbufferY2=ent_field(1,0)*ent_field(1,1)*ent_field(1,2)
    mathbufferY3=ent_field(2,0)*ent_field(2,1)*ent_field(2,2)
    mathbufferZ1=ent_field(0,0)*ent_field(1,1)*ent_field(2,2)
    mathbufferZ2=ent_field(0,2)*ent_field(1,1)*ent_field(2,0)
   
    If mathbufferX1=1 And win<>1 Or mathbufferX2=1 And win<>1 Or mathbufferX3=1 And win<>1 Or mathbufferY1=1 And win<>1 Or mathbufferY2=1 And win<>1 Or mathbufferY3=1 And win<>1 Or mathbufferZ1=1 And win<>1 Or mathbufferZ2=1 And win<>1 Then
        win=1
        wins1=wins1+1
    ElseIf mathbufferX1=8 And win<>2 Or mathbufferX2=8 And win<>2 Or mathbufferX3=8 And win<>2 Or mathbufferY1=8 And win<>2 Or mathbufferY2=8 And win<>2 Or mathbufferY3=8 And win<>2 Or mathbufferZ1=8 And win<>2 Or mathbufferZ2=8 And win<>2 Then
        win=2
        wins2=wins2+1
    EndIf


neu
Code: [AUSKLAPPEN]
dim mathbuffer(10)
....
if win=0 then
  mathbuffer(1)=ent_field(0,0)*ent_field(1,0)*ent_field(2,0)
  mathbuffer(2)= ....
  ....
  for n=1 to 8
    if mathbuffer(n)=1 then
      win=1
      wins1=wins1+1
    endif
    if mathbuffer(n)=8 then
      win=2
      wins2=wins2+1
    endif
  next
endif


letzter Code erreicht etwa die länge von deinem, hat aber den Vorteil dass er nicht als ellenlange Schlange über den Bildschirm wandert. das erleichtert dann auch die Fehlersuche.


(5) zuletzt noch, schreib einfach noch kommentare rein, auch für die die dir helfen ist es einfacher sich zurecht zu finden.

Code: [AUSKLAPPEN]

    If RectsOverlap(MouseX(),MouseY(),1,1,1,225,220,50) And [b]MouseDown(1) And MouseHit(1)[/b] Then
        For a=0 To 2
            For b=0 To 2
                ent_field(a,b)=0
            Next
        Next
        game=1
        win=0
    EndIf

Das Fettgedruckte ist wieder doppelt gemoppelt. wenn li. Taste gedrückt wird wurde sie gleichzeitig betätigt!

hoffe das hilft etwas.
 

Shyiox

BeitragFr, Okt 08, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
und das nennt man dann: Optimierung Very Happy

das man alles so schreibt wie du, kommt mit der zeit...
ich kenn das nur zugut...

nurmal son beispiel von expression2 was ich geschrieben habe Cool
Code: [AUSKLAPPEN]
@name [Shy-Tec]_ECS_v1
@outputs AimEnt:entity AimCol:vector A B OKU SelectMode [Cmd Commands Command PropStack Undo Prop Select]:array

if (first())
{
    Commands[1,string]="stack"
    Commands[2,string]="setrot"
    Commands[3,string]="translate"
    Commands[4,string]="rotate"
    Commands[5,string]="undo"
    Commands[6,string]="select_on"
    Commands[7,string]="select_off"
    Commands[8,string]="kill"
}

runOnTick(1)
runOnChat(1)

Syntax = "-e_"
SynNum = Syntax:length()
OLS = owner():lastSaid()
OKU = owner():keyUse()
LS = lastSaid()
AimEnt = owner():aimEntity()
AimCol = owner():aimEntity():getColor()


if ( chatClk(owner()) & OLS:left(SynNum) == Syntax)
{
    #hideChat(1)
    CmdSub = OLS:sub(OLS:find(Syntax)+SynNum)
    Cmd = CmdSub:explode(" ")
   
    # --- STACKEN ---   
    if (Cmd[1,string]==Commands[1,string] & inrange(Cmd[2,string]:toNumber(),0,50) & AimEnt:toString()!="(null)")
    {
        Undo:unshiftNumber(Undo[1,number]+Cmd[2,string]:toNumber())
        for (I=1,clamp(Cmd[2,string]:toNumber(),1,50))
        {
            PropStack:pushVector(vec(Cmd[3,string]:toNumber(),Cmd[4,string]:toNumber(),Cmd[5,string]:toNumber())*I)
            PropStack:pushAngle(ang(Cmd[6,string]:toNumber(),Cmd[7,string]:toNumber(),Cmd[8,string]:toNumber()))
            PropStack:pushEntity(owner():aimEntity())
        }
    }
    elseif (Cmd[1,string]!=Commands[1,string]) { }
    elseif (Cmd[2,string]:toNumber()>50) {print("You cannot stack more than 50 props!")}
    elseif (Cmd[2,string]:toNumber()<=0) {print("You cannot stack 0 or negativ amount of props!")}
   
    # --- SETROT ---   
    if (Cmd[1,string]==Commands[2,string])
    {
        if (SelectMode)
        {
            for (I=0,Select:count())
            {
                Select[I,entity]:setAng(ang(Cmd[2,string]:toNumber(),Cmd[3,string]:toNumber(),Cmd[4,string]:toNumber()))
            }
            print("Selected props have been setroted to angles "+Cmd[2,string]+" "+Cmd[3,string]+" "+Cmd[4,string])
        }
        elseif (AimEnt:toString()!="(null)")
        {
            AimEnt:setAng(ang(Cmd[2,string]:toNumber(),Cmd[3,string]:toNumber(),Cmd[4,string]:toNumber()))
            print("Prop has been setroted to angles "+Cmd[2,string]+" "+Cmd[3,string]+" "+Cmd[4,string])
        }
    }
   
    # --- TRANSLATEN ---   
    if (Cmd[1,string]==Commands[3,string])
    {
        if (SelectMode)
        {
            for (I=0,Select:count())
            {
                Select[I,entity]:setPos(Select[I,entity]:pos()+vec(Cmd[2,string]:toNumber(),Cmd[3,string]:toNumber(),Cmd[4,string]:toNumber()))
            }
            print("Selected props have been translated to "+Cmd[2,string]+" "+Cmd[3,string]+" "+Cmd[4,string])
        }
        elseif (AimEnt:toString()!="(null)")
        {
            #holoCreate(1,owner():pos(),vec(0.1,0.1,0.1)
            #holoEntity(1):setTrails(5,5,5,"trails/laser",vec(255,0,0),255)
            #holoPos(1,AimEnt:pos())
            AimEnt:setPos(AimEnt:pos()+vec(Cmd[2,string]:toNumber(),Cmd[3,string]:toNumber(),Cmd[4,string]:toNumber()))
            print("Prop has been translated to "+Cmd[2,string]+" "+Cmd[3,string]+" "+Cmd[4,string])
            #holoDelete(1)
        }
    }
   
    # --- ROTATE ---   
    if (Cmd[1,string]==Commands[4,string])
    {
        if (SelectMode)
        {
            for (I=0,Select:count())
            {
                Select[I,entity]:setAng(Select[I,entity]:angles()+ang(Cmd[2,string]:toNumber(),Cmd[3,string]:toNumber(),Cmd[4,string]:toNumber()))
            }
            print("Selected props have been rotated "+Cmd[2,string]+" "+Cmd[3,string]+" "+Cmd[4,string])
        }
        elseif (AimEnt:toString()!="(null)")
        {
            AimEnt:setAng(AimEnt:angles()+ang(Cmd[2,string]:toNumber(),Cmd[3,string]:toNumber(),Cmd[4,string]:toNumber()))
            print("Prop has been rotated "+Cmd[2,string]+" "+Cmd[3,string]+" "+Cmd[4,string])
        }
    }
   
    # --- UNDO ---
    if (Cmd[1,string]==Commands[5,string])
    {
        for (I=Undo[1,number],Undo[2,number]+1,-1)
        {
            Prop[I,entity]:propDelete()
            Prop:remove(I)
            A--
        }
        Undo:shift()
        Cmd[1,string]=""
        print("Last Stack has been undone")
    }
   
    # --- SELECTMODE ---
    if (Cmd[1,string]==Commands[6,string])
    {
        SelectMode=1
    }
   
    if (Cmd[1,string]==Commands[7,string])
    {
        SelectMode=0
    }
   
    # --- KILL ---   
    if (Cmd[1,string]==Commands[8,string])
    {
        if (SelectMode)
        {
            for (I=0,Select:count())
            {
                Select[I,entity]:propDelete()
            }
            print("Selected props have been killed")
        }
        elseif (AimEnt:toString()!="(null)")
        {
            AimEnt:propDelete()
            print("Prop has been killed")
        }
    }
   
    if (Cmd[1,string]=="stack" & inrange(Cmd[2,string]:toNumber(),0,50) & AimEnt:toString()!="(null)")
    {
        print("Prop has stacked "+Cmd[2,string]+" times to "+Cmd[3,string]+" "+Cmd[4,string]+" "+Cmd[5,string])
        timer("StackDelay",10)
        Cmd[1,string]=""
    }
}

if (SelectMode)
{
        if (OKU&$OKU)
        {
            for (I=0,Select:count())
            {
                if (AimEnt==Select[I,entity])
                {
                    hint("Prop deselected",2)
                    AimEnt:setColor(vec(255,255,255),255)
                    Select:remove(I)
                    B=Select:count()
                }
                elseif (I==Select:count())
                {
                    hint("Prop selected",2)
                    if (AimEnt:toString()!="(null)")
                    {
                        B++
                        Select[B,entity]=AimEnt
                        AimEnt:setColor(vec(255,0,0),128)
                    }
                }
            }
        }
       
        for(I=1,Select:count())
        {
            if (Select[I,entity]:toString()=="(null)")
            {
                Select:remove(I)
                B=Select:count()
            }
        }
}

if (PropStack:count() & clk("StackDelay"))
{
    StackVec=PropStack:shiftVector()
    StackAng=PropStack:shiftAngle()
    StackEnt=PropStack:shiftEntity()
   
    A++               
    Prop[A,entity]=propSpawn(StackEnt,StackEnt:pos()+StackVec,StackAng,1)
               
    timer("StackDelay",260)
}

for (I=1,Prop:count())
{
    if (Prop[I,entity]:toString()=="(null)")
    {
        Prop:remove(I)
        A--
    }
}
 

primero

BeitragFr, Okt 08, 2010 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
mhmh

stimmt schon. nur die Übersichtlichkeit ist eine trainigsangelegenheit. also sollte man damit mögl. früh beginnen.

dann treten fehler wie

If RectsOverlap(MouseX(),MouseY(),1,1,1,225,220,50) And MouseDown(1) And MouseHit(1) Then

nicht mehr ganz so häufig auf.

B3d, soweit ich weis BB allgemein, hat den großen Vorteil dass du Kommentare setzen kannst. diese vergrößern dein Projekt als .exe später nicht, helfen aber ungemein beim Proggen.

einfach " Code ;kommentar"

hilft auch denen die deinen Code interpretieren müssen. mein Rat, fang mögl. früh damit an. (das ist noch nicht mal eine optimierung, sondern eine reine Hilfestellung)

eine Funktion schaut bei mir in etwa so aus (benutze ich regelmäßig, schaue sie mir aber nur sehr selten an):
BlitzBasic: [AUSKLAPPEN]

;**************************************** Mausdruckabfrage

;x,y = Suchpunkt des Druckgebietes
;mitte = ob suchpunkt der Mittelpunkt ist(1) oder nicht(0)
;entfx = wie groß der Knopf in x Richtung ist
;entfy = Wie groß der knopf in y Richtung ist

Function mausdruck(x,y,mitte,entfx,entfy)

If entfy=0 Then entfy=entfx ;wird nur xWert angegeben ist das Feld Quadratisch
If mitte=1 Then ;Wenn Suchpunkt aus der Mitte gelesen wird
If mausx>=x-entfx And mausx<=x+entfx Then
If mausy>=y-entfy And mausy<=y+entfy Then
Return GetMouse()
EndIf
EndIf
EndIf
If mitte=0 Then ;wennSuchpunkt o.r. des Feldes ist
If mausx>=x And mausx<=x+entfx Then
If mausy>=y And mausy<=y+entfy Then
Return GetMouse()
EndIf
EndIf
EndIf
End Function

;---------------------------------------- Mausdruckabfrage


Ich denke mal jeden ist die Funktionsweise dieses Codes recht schnell klar. Nun ja.

Ich behaubte ja nicht dass du nicht Proggen kannst oder keine Ahnung hast. Ich habe vor BB mit Turbo Pascal geproggt. einige Angewohnheiten von da nahm ich mit, manchmal zum guten, manchmal zum schlechten.

Aber du hast recht, meine Vorschläge laufen alle in richtung kosmetik.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group