Funktionen "funktionieren" nicht untereinander!
Übersicht

Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo.
Du erzeugst ja auch immer wieder einen neuen Zufallswert. Vlt hilft dir dieser Code weiter. Code: [AUSKLAPPEN] Graphics 800,600,32,2 PrgTimer=CreateTimer(60) Local Msg$ SetBuffer BackBuffer() Repeat If KeyHit(57) Then Msg=f_Msg(f_Rand()) ;Leertaste drücken f_Draw(Msg) Flip(0) WaitTimer(PrgTimer) Until KeyHit(1)=1:End ;Escape Function f_Draw(Msg$) Cls Color 255,255,255 Text 10,10,Msg End Function Function f_Rand() Return Rand(0,10) End Function Function f_Msg$(RandNumber) Select RandNumber Case 1 Return "Hallo" Case 2 Return "Tschüß" Case 3 Return "Hund" Default Return "Nö" End Select End Function |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also rein vom Code sieht es so aus, als würde die Zufallszahl sich pro Programmstart einmal ändern.
Sollte sich die "Zufallszahl" pro schleifendruchlauf ändern - Was zum.. ? Das sie sich ständig ändert hängt vom 'Seed' ab (aus diesem werden die zufallszahlen errechnet. Gleicher seed, gleiche zufallszahl quasie.) Ob 'Global SeedRnd MilliSecs()' in der form funktioniert weiß ich grade nicht so recht. Evtl solltest du das Global da weglassen *grübel* aber da du immer neue zufallszahlen hast, sollte es also klappen. Setz den wert mal fix auf 0, dann solltest du immer die selbe zufallszahl kriegen. Warum? Die zufallszahl ändert sich solange RndZahl_counter <= 1 ist (ist RndZahl_counter 0, wird sie erhöht auf 1. Danach wird eine zufällige Zahl geholt, welche vom Seed abgeleitet wird - also fixer seed, fixe zufallszahl. Danach wird nurnoch die Zufallszahl zurückgegeben) ACHTUNG! Function f_Hello() -> dort rufst du f_RndZahl() auf. Ist RndZahl_counter > 1 (also nach dem 2ten aufruf) dann ruft die funktion wiederrum f_Hello() auf. Spiel das ganze mal durch ![]() Stürtz es nicht ab - cool, BlitzBasic spielt da (ganz übel) rein. So oder so, das solltest du auf jedenfall vermeiden. (Stichwort: Rekursion; Endlos) Weiterer Hinweis: Global timer= CreateTimer(1000) Timer sind normalerweise auf Hertz basis. Stellst du hier 60 ein, kannst du das Programm mit 60 Frames bzw Updates pro sekunde laufen lassen. Vorraussetzung hierfür ist allerdings auch, das du WaitTimer nutzen musst. Du hast zwar Delay (3) drin, aber da solltest du direkt die finger von lassen, ausser du hast einen guten grund, Delay zu verwenden. Delay wartet X millisekunden und fährt dann mit dem Programm fort. WaitTimer hingegen wartet auf den nächsten timer-tick (also zb 60 stück davon pro sekunde) und gibt derweil die kontrolle an das Betriebssystem zurück -> CPU schonend. |
||
170leo170 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die ganzen Antworten! Der Code ist wirklich gut, es ist nur so dass ich den gerne so gut wie es alleine schreiben möchte. Trotzdem danke, ich werde mal schauen ob ich mache übernehmen kann ![]() Und zu PhillipK, was meintest du mit "Setz den wert mal fix auf 0, dann solltest du immer die selbe zufallszahl kriegen"? Und könnte ich evt. die Funktion so umschreiben, dass sie, nachdem ein Zufallswert erstellt wurde, selbst schließt? Bspw in der Weise: Function f_RndZahl() Repeat RndZahl_counter = RndZahl_counter + 1 If RndZahl_counter = 1 Then Rnd_Zahl% = Rand(1,3) Return Rnd_Zahl% Until RndZahl_counter = 1 If RndZahl_counter > 1 Then End Function |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oh entschuldige, ich hätte das ganze etwas weiter ausführen sollen.
BlitzBasic: [AUSKLAPPEN] Global SeedRnd MilliSecs() hier erstellst du die Globale "SeedRnd" (sollte zumindest so sein). Das ist schonmal eventuell ein fehler. Der Hilfe zufolge ist dies eine funktion. Also, SeedRnd( wert ). Damit initialisierst du einen Seed für die Random funktionen. Statt wert kannst du alles einsetzen was du magst, gängig ist allerdings Millisecs() Millisecs liefert die Millisekunden seit dem OS start und ist somit ein recht brauchbarer ausgangswert für zufallszahlen. trag hier zum testen andere werte, wie zb 0, ein. Zu deinem weiteren problem, du könntest eine Globale "RndZahl" erstellen und anfangs auf 0 setzen. Danach: BlitzBasic: [AUSKLAPPEN] Function f_RndZahl() oder ähnliche ansätze. Repeat ist eine schleife, welche hier weniger sinnvoll ist. zumal deine unten aufgeführte Repeat schleife auch nur einmalig laufen würde. End Function ist ein schlagwort, welches nicht durch eine abfrage ausgelöst werden kann - End Function muss ZWINGEND das ende der Funktion darstellen, da der Compiler den Block sonst nicht fehlerfrei zuordnen kann. Genauer gesagt würde er hier meckern, weil If ohne Endif aufgerufen wurde *grübel* |
||
170leo170 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen Dank für die Funktion und die Erklärung ![]() |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] If RndZahl_counter > 1 Then End Function
Das ist noch ein grober Fehler, den der Compiler eigentlich nicht durchlassen sollte. End Function ist das Ende eines Funktionsblocks (so wie EndIf das Ende eines If-Blocks ist), nicht ein echter Befehl. Wenn du willst, dass die Funktion an dieser Stelle beendet wird, dann verwende Return. Richtig wäre also folgendes: BlitzBasic: [AUSKLAPPEN] Function foo() |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
170leo170 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oke danke für die Erklärung ![]() |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Denke, das kam schon ein paar Mal:
BlitzBasic: [AUSKLAPPEN] SeedRnd(MilliSecs()) Ein Mal am Anfang des Programms. Nicht jeden Schleifenaufruf oder so. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
170leo170 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke, das Problem jz ist aber, dass sich die Rnd_Zahlen wiederholen. Wenn ich es an den Anfang stell kann ich es nicht "global" machen und die Rnd_Number ist wieder nur die 2. :/ | ||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, nix global. Global ist nur für Variablen. SeedRnd() ist ein Funktionsaufruf (erkennbar an den Klammern), der kann nicht global sein.
Bitte lies dir doch ein gutes Tutorial durch (vollständig!), wie z.B. Robs Tutorial 2. Lies dir auch bitte den gesamten Thread für Neueinsteiger durch: [url=https://www.blitzforum.de/forum/viewtopic.php?t=6114] |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nicht nur lesen - durcharbeiten und verstehen. Ich habe den Eindruck dass es hier übelst an Grundlagen fehlt, daher sollten wir wohl viel kleiner anfangen...
Erst mal solltest Du Dir einig werden was der Unterschied zwischen Variablen und Funktionen ist und wie man eben diese verwendet. Kleine Hausaufgabe für dich: Schreibe ein Programm dass vom Benutzer zwei Zahlen erfragt und als Ergebnis die Summe und das Ergebnis der Multiplikation anzeigt. Ganz ohne Funktionen, einfach straight durch. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du noch mehr Hausaufgaben machen möchtest ![]() ![]() |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
170leo170 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hab zwar grad Urlaub, aber die Hausaufgaben mach ich gern, danke für den Tipp ![]() |
||
170leo170 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo nochmal, das erste Programm war relativ einfach:
Code: [AUSKLAPPEN] Input1 = Input("Deine erste Zahl: ")
Input2 = Input("Deiner zweite Zahl: ") Ergebniss% = Input1% + Input2% Print "Das Ergebniss " + Ergebniss% WaitKey End Ich versuche gerade anhand von einem Videoguides ein Programm zu schreiben. Mein Problem ist, dass immer "Invalid Image Handle" dasteht, wieso? Code: [AUSKLAPPEN] ;Graphics---------------------
Graphics 640,480,0,2 SetBuffer BackBuffer() ;Array------------------- Dim array(13,10) Data 0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,2,2,0,0,0,0,0,0,0,0,0,0 Data 0,2,2,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,0,0,0,0,0,0,0,0,0,0,0 Data 0,0,1,1,1,1,1,1,1,1,1,1,1 Data 0,0,1,0,0,0,0,0,0,1,0,0,0 Data 0,0,1,0,0,0,0,0,0,1,0,0,0 Data 0,0,1,0,0,0,0,0,0,1,0,0,0 Data 0,0,1,0,0,0,0,0,0,1,0,0,0 Data 0,0,1,0,0,0,0,0,0,1,0,0,0 ;Globals--------------------- Global tile1 = LoadImage("C:\Users\Leon\Desktop\BlitzBasic\Gras.bmp") Global tile2 = LoadImage("C:\Users\Leon\Desktop\BlitzBasic\Weg.bmp") Global tile3 = LoadImage("C:\Users\Leon\Desktop\BlitzBasic\Wasser.bmp") Global readinfo = 1 ;Draw Images-------------- While Not KeyHit (1) Cls F_drawtiles() Flip Wend End ;Functions-------------- Function F_drawtiles() For y = 1 To 10 For x = 1 To 13 If readinfo = 1 Then Read array(x,y) If array (x,y) = 0 Then DrawImage(tile1, x, y) ElseIf array(x,y) = 1 Then DrawImage(tile2, x, y) ElseIf array(x,y) = 2 Then DrawImage(tile3, x, y) EndIf Next Next End Function |
||
170leo170 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sry, hab nur im falschen Format gespeichert. | ||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verwende doch bitte für sowas den Edit-Button statt einen Doppelpost zu machen. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Chester |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wobei du dir besser gleich einprägen kannst, relative Pfadangaben zu benutzen. Sonst kopierst du dein Programm irgendwann in einen anderen Ordner und wunderst dich, dass nichts mehr geht, weil die Angaben nicht mehr alle stimmen.
Und falls du mal ne neue Struktur kennen lernen willst, für den Zweck in deiner Funktion wären Select-Abfragen wie gerufen ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group