hilfe bei minesweeper

I

Idared

Aktives Mitglied
Thread Starter
Dabei seit
23.05.2005
Beiträge
155
Reaktionspunkte
0
hallo zusammen,

ich hab nicht viel ahnung von js und soll den code von minesweeper erklären.
grundsätzlich verstehe ich, was im groben passiert, aber von den details so gut wie gar nichts. ich würde mich also sehr freuen, wenn mir vielleicht jemand ein paar funktionen erklären könnte, vor allem untenstehende, die ich rauskopiert habe (gesamter code ist verlinkt):
wie hängen die functions mit dem var zusammen? was passiert da?
wär echt cool, wenn mir jemand helfen könnte!
danke,
b




function SetBomb(x,y,c) {
bombs[x + y * max_rows] = c;
}

function GetBomb(x,y) {
return bombs[x + y * max_rows];
}







var count = max_bombs;
while (count > 0) {
var x = Math.floor(Math.random() * max_rows);
var y = Math.floor(Math.random() * max_rows);
if (GetBomb(x,y) == 0) {
SetBomb(x,y,1);
count--;


http://games.clauss-net.de/minesweeper/
 
hallo zusammen,

ich hab nicht viel ahnung von js und soll den code von minesweeper erklären.
grundsätzlich verstehe ich, was im groben passiert, aber von den details so gut wie gar nichts. ich würde mich also sehr freuen, wenn mir vielleicht jemand ein paar funktionen erklären könnte, vor allem untenstehende, die ich rauskopiert habe (gesamter code ist verlinkt):
wie hängen die functions mit dem var zusammen? was passiert da?
wär echt cool, wenn mir jemand helfen könnte!
danke,
b




function SetBomb(x,y,c) {
bombs[x + y * max_rows] = c;
}

function GetBomb(x,y) {
return bombs[x + y * max_rows];
}







var count = max_bombs;
while (count > 0) {
var x = Math.floor(Math.random() * max_rows);
var y = Math.floor(Math.random() * max_rows);
if (GetBomb(x,y) == 0) {
SetBomb(x,y,1);
count--;


http://games.clauss-net.de/minesweeper/

Warum willst du denn den Code erklären, wenn du keine Ahnung davon hast?
Verstehe ich nicht.

Oder sind das deine Hausaufgaben? ;)
 
ja, genau.
haben wir nie so im detail gelernt, aber müssen wir erklären. :(
 
http://de.selfhtml.org/javascript/sprache/regeln.htm

Jeweils unten befindet sich der "Weiter-Button" ;)

Dazu empfehle ich Dir hier und Da, wo Du nicht weiter weißt, ein alert hinzusetzen, und genau zu beobachten, was da passiert, wenn die Meldung kommt.

Wenn möglich, kannst Du den Kram auch mit dem FireFox debuggen.
 
tja...hilft mir auch nicht wirklich weiter..
 
tja...hilft mir auch nicht wirklich weiter..

das kann man auch nur schwer! Denn es handelt sich um grundlegende Javascript-Befehle! Die stehen nunmal in jedem Javascript-Buch erläutert und können in einem thread schlechterdings wiederholt werden.

Semantisch geschieht dort nichts wirklich komplexes! Es handelt sich um das auslesen und beschreiben eines ordinären Arrays!
 
man kanns ja mal versuchen...
 
function SetBomb(x,y,c) {
bombs[x + y * max_rows] = c;
}

function GetBomb(x,y) {
return bombs[x + y * max_rows];
}

var count = max_bombs;
while (count > 0) {
var x = Math.floor(Math.random() * max_rows);
var y = Math.floor(Math.random() * max_rows);
if (GetBomb(x,y) == 0) {
SetBomb(x,y,1);
count--;

Ich kann mich den Vorrednern nur anschließen. Wenn Du keinen Plan vom Programmieren hast, wird Dein Vorhaben schwierig.

var ist eine Variablendeklaration. Du legst eine Variable namens max_bombs an.
bombs ist ein Vektor, ein eindimensionales Array. Durch die eigenartige Formel x+y*max_rows wird das zweidimensionale Spielfeld auf den eindimensionalen Vektor abgebildet. Man beachte, daß x und y von 0 anfangen, sonst funktioniert es nicht.

Die Funktion GetBomb hat zwei Argumente, die x und die y-Koordinate. Sie liefert den Wert des Feldes (x,y) zurück.

Die Funktion SetBomb hat drei Argumente, x,y und den zu setzenden Wert. Sie setzt das (x+y*max_rows)te Elemente des Vektors bombs auf den Wert c

var count = max_bombs;
Deklaration von count, setzen auf den Wert max_bombs
while (count > 0) {
Schleifenanfang, Schleife wird durchlaufen, solange count > 0
var x = Math.floor(Math.random() * max_rows);
x-Koordinate würfeln
var y = Math.floor(Math.random() * max_rows);
y-Koordinate würfeln
if (GetBomb(x,y) == 0) {
SetBomb(x,y,1);
Falls auf diesem Feld noch keine Bombe liegt, hier eine setzen
count--;
count eins runter zählen

Am Ende fehlen ein paar Klammern. Man beachte, daß das Spielfeld quadratisch ist (max_rows bei x und y)
Hilft das weiter?
g
 
danke danke danke!
 
Danke macht man mit dem Knöpfchen unten rechts im Beitrag...

Wenn Du mehr wissen willst, frag ruhig nach.
g
 
noch was: ich hab nicht ganz verstanden, was die fuction GetBomb genau macht. hier hab ich noch eine ähnliche function, die ja im prinzip das gleiche macht, oder?


function GetMap(x,y) {
return map[x + y * max_rows];

und SetBomb liefert ja den Wert c, aber die anderen functions arbeiten mit der selben Formel. wo ist der Unterschied?
 
bombs ist ein Array von n*n Elementen ( passend zum Spielfeld). Hier wird aber kein zweidimensionales Array verwendet, sondern ein Eindimensionales:

Die Position errechnet sich aus

Spalte+Zeile*Elemente-Je-Zeile, will sagen für ein 10*10 Feld, bei dem auf Feld Spalte 2,Zeile 3 eine Bombe gesetzt wird, wird dann das Feld

bombe=[spalte+zeile*Elemente-je-Zeile]

==

bombe[2+3*10]==bombe[2+30]==bombe[32]=c

auf den Wert c gesetzt ( vermutlich um eine Bombe zu markieren).

Zeichne Dir ein Feld mal auf ein Blatt Papier und skizzier es nach!

bombe=[zeile+spalte*Elemente-je-Zeile]
 
  • Gefällt mir
Reaktionen: Idared
GetMap liefert den Wert des x,y-ten Feldes aus dem Array map.
GetBombs liefert den Wert des x,y-ten Feldes aus dem Array bombs.

map und bombs sind zwei verschiedene Vektoren. Die Zählung fängt bei 0 an, nicht bei 1, das ist aber nicht wirklich entscheidend.
map[4] ist das fünfte Element von map
bombs[0] ist das erste Element von bombs
Wenn x=0 und y=0, wird bombs[0] gelesen/geschrieben

SetBomb liefert gar keinen Wert, sondern setzt dasx,y-te Feld von Bombs auf den Wert c.

Der Wert einer Funktion, der zurückgegeben wird wird durch das return-Statement gesetzt. SetBomb hat kein return, schau mal genau hin.


Nehmen wir an, daß max_rows=3, dann haben wir ein Spielfeld aus 3x3 Feldern. Am Anfang sieht dann bombs so aus:
(0,0,0,0,0,0,0,0,0)
Spielfeld:
0 0 0
0 0 0
0 0 0

nach dem Aufruf von SetBomb(0,0,1) sieht bombs so aus:
(1,0,0,0,0,0,0,0,0)
Spielfeld:
1 0 0
0 0 0
0 0 0

nach dem nächsten Aufruf von SetBomb(2,2,1) sieht bombs so aus:
(1,0,0,0,0,0,0,0,1) (2+2*3=8, also das neunte Element von bombs)
Spielfeld:
1 0 0
0 0 0
0 0 1

nach dem nächsten Aufruf von SetBomb(0,1,1) sieht bombs so aus:
(1,0,0,1,0,0,0,0,1) (0+1*3=3, also das vierte Element von bombs)
Spielfeld:
1 0 0
1 0 0
0 0 1



GetBomb(1,1) liefert 0, weil das (1+1*3)=4, also das fünfte Element 0 ist
GetBomb(2,2) liefert 1, weil das (2+2*3)=8, also das neunte Element 1 ist

So, jetzt muß ich weg. Viel Spaß!
g

Edith: fishing for compliments entfernt...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Grobi112 und Idared
was bedeutet eigentlich "return" genau? ist das die wiedergabe an des user?
 
Danke fürs "Danke". Mein erstes, jippi!

return ist der JS-Befehl, der einer Funktion ihren Rückgabewert zuweist. Ist ganz wörtlich zu verstehen "Gib zurück wert"

g

P.S. ich habe einen Riesenspaß daran, Leuten die Grundzüge des Programmierens zu erklären. Vor einigen Jahren habe ich in Villingen gearbeitet. Ich habe dann ein Angebot bekommen, an der Fachhochschule Furtwangen, Außenstelle Schwenningen einen Lehrauftrag für Informatik zu übernehmen. Das hört sich schwülstig an, bestand aber im wesentlichen daraus, den Studenten die Grundzüge des Programmierens und elementare Methoden der Informatik zu vermitteln. Es hat selten eine Beschäftigung gegeben, die mir mehr Spaß gemacht hat, auch wenn es ein Riesenhaufen Arbeit war. Und nebenbei hatte man noch die Gelegenheit, dort so etwas Absurdes wie Japanisch zu lernen, wenigstens im Prinzip. Ach, süße Jugend!
 
Zuletzt bearbeitet:
hallo gernot!

wenn es dir riesenspass macht, das zeug zu erklären, bist du genau der richtige für mich! vielleicht solltest du mal an unsere fh kommen, da haben die nämlich spass daran, dass wir uns das selbst lernen...:)
ich hoffe, ich kann dich noch ein paar sachen fragen, wo ich mir nicht sicher bin:

1.kannst du mir sagen, ob ich richtig liege in der annahme, dass diese function die bomben im umfeld zählt?
function CountBombs(x,y) {
var count = 0;
for (var i=x-1; i<=x+1; i++) {
for (var j=y-1; j <=y+1; j++) {
if (i>=0 && j>=0 && i<max_rows && j<max_rows) {
if (GetBomb(i,j) == 1) {
count++;
}
2. die function setbomb errechnet den ort der bombe, die function getbomb ist nur dazu da, den wert (bombs, also c) zurückzuliefern (an den browser?). stimmt das?

function SetBomb(x,y,c) {
bombs[x + y * max_rows] = c;
}

function GetBomb(x,y) {
return bombs[x + y * max_rows];
}

3. kannst du mir sagen, was folgende functions ungefähr machen? vor allem die zweite versteh ich überhaupt nicht!

function ShowAll() {
for (var i=0; i<max_rows; i++) {
for (var j=0; j<max_rows; j++) {
if (GetBomb(i,j) == 1) {
SetMap(i,j,bomb);
} else {
SetMap(i,j,CountBombs(i,j));
}
}
}
}

function ShowEmpty(x,y) {
var f = new Array();
var idx = -1;
while (idx < f.length) {
if (idx < f.length) {
if (idx < 0) idx = 0;
if (f.length > 0) {
x = f[idx];
idx++;
y = f[idx];
idx++;

4. was schreibt das dokument hier? es gibt ja drei document.write. das zweite ist ein einziges kästchen, glaub ich, das dritte der button, aber was macht das erste? die tabelle? die tabelle (also das game) hat 12 zeilen und 12 spalten. warum steht da 16 (16 *may_rows)? was ist das für eine einheit?
<script type="text/javascript">
document.write("<table class='game' cellpadding='0' align='left' border='0' width='" + 16 * max_rows + "'>");
for (var i=0; i<max_rows; i++) {
document.write("<tr>");
for (var j=0; j<max_rows; j++) {
document.write("<td><img id='img" + j + "_" + i + "' src='" + unknown + "' width='16' height='16' onClick='Click(" + j + "," + i + ",this.event)'><\/td>");
}
document.write("<\/tr>");
}
document.write("<tr><td colspan='"+max_rows+"' align='center'><input type='button' value='Restart' onClick='Start()'><\/td><\/tr>");
document.write("<\/table>");


so, das war's . ich hoff, das war nicht zu viel! du kriegst auch ein danke dafür!:)
 
ich hoffe du studierst an der FH nicht Informatik ;)
 
haha, ne! mediengestaltung. da ist leider auch etwas informatik dabei...
 
Na gut. Ich versuchs mal.

...dass wir uns das selbst lernen...
Klugscheißermodus: es heißt lehren. Lernen ist der Schüler-, lehren der Lehrer-Part. Wer sich selbst etwas beibringt, lehrt also. Schuldigung, war ein Reflex.


ich hoffe, ich kann dich noch ein paar sachen fragen, wo ich mir nicht sicher bin:
klar

1.kannst du mir sagen, ob ich richtig liege in der annahme, dass diese function die bomben im umfeld zählt?
function CountBombs(x,y) {
var count = 0;
for (var i=x-1; i<=x+1; i++) {
for (var j=y-1; j <=y+1; j++) {
if (i>=0 && j>=0 && i<max_rows && j<max_rows) {
if (GetBomb(i,j) == 1) {
count++;
}
Exakt.

2. die function setbomb errechnet den ort der bombe, die function getbomb ist nur dazu da, den wert (bombs, also c) zurückzuliefern (an den browser?). stimmt das?

function SetBomb(x,y,c) {
bombs[x + y * max_rows] = c;
}
SetBomb errechnet nichts, sondern setzt einfach die Zelle x,y auf den Wert c , also entweder auf 0=Bombe räumen oder 1=Bombe legen. Wenn etwas errechnet würde, müßte es als Funktionswert zurückgegeben werden, dann bräuchte man das return-statement

function GetBomb(x,y) {
return bombs[x + y * max_rows];
}
Hier haben wir den Fall mit dem return. GetBomb liest die Zelle x,y aus und liefert 0=keine Bombe oder 1=Bombe zurück.

3. kannst du mir sagen, was folgende functions ungefähr machen? vor allem die zweite versteh ich überhaupt nicht!

function ShowAll() { ShowAll durchsucht alle Zellen
for (var i=0; i<max_rows; i++) { i ist die x-Richtung
for (var j=0; j<max_rows; j++) { j die y-Richtung
if (GetBomb(i,j) == 1) { Wenn Bombe gefunden
SetMap(i,j,bomb); Vermutlich: Zeichne Bombe, man müßte sich SetMap ansehen
} else {
SetMap(i,j,CountBombs(i,j)); Vermutlich: Zeichne Zahl der Bomben rund um dieses Feld (ermittelt mit der von oben bekannten Funktion) in das Feld
}
}
}
}


function ShowEmpty(x,y) {
var f = new Array(); lege ein neues array an, das f heißt
var idx = -1; neue Zählvariable, setze auf -1
while (idx < f.length) { Schleife: solange idx< Länge des Array f ist
if (idx < f.length) { Verstehe ich nicht. An diese Stelle kommt das Programm nur, wenn genau diese Bedingung erfüllt ist. Es schadet aber auch nichts
if (idx < 0) idx = 0; Häßlich. Da hätte man auch die Schleifenbedingung besser formulieren können. Murks.
if (f.length > 0) { Dieser ganze Teil ist mir völlig unverständlich ohne den Zusammenhang
x = f[idx];
idx++;
y = f[idx];
idx++;

4. was schreibt das dokument hier? es gibt ja drei document.write. das zweite ist ein einziges kästchen, glaub ich, das dritte der button, aber was macht das erste? die tabelle? die tabelle (also das game) hat 12 zeilen und 12 spalten. warum steht da 16 (16 *may_rows)? was ist das für eine einheit?
Ich bin kein Javascript-Experte, aber ich glaube, Pixel sind ein ganz heißer Tip. Wieso habt ihr eine englische Tastatur?

Bei den folgenden Zeilen steige ich erst einmal aus, wie gesagt, die Feinheiten von JS übersteigen meine Kenntnis doch bei weitem. Ich persönlich finde aber die reference unter http://www.javascriptkit.com/jsref/index.shtml ganz brauchbar. Viel Erfolg! Weitere Fragen kein Problem.

g
 
  • Gefällt mir
Reaktionen: Idared
so. referat ist gut gelaufen! danke nochmal!
 
Zurück
Oben Unten