2016-08-04 23 views
4

Ich arbeite an einer Codierungsherausforderung, die mich auffordert, ein Schachbrett mit jQuery zu erstellen, zusammen mit einem Eingabeformular, das fragt, wie groß das Spielbrett sein wird (zB 6x6 Board, 7x7 Board, etc.). Ich habe Schwierigkeiten mit der ungeraden/geraden Klassenzuweisung für immer dann, wenn die Eingabe eine ungerade Zahl ist (d. H. 7x7-Karte, 9x9-Karte, 11x11-Karte). Wenn Sie die JS-Geige ausführen, wenn Sie Input # auf eine ungerade Zahl erhöhen, "springt" die ungerade/gerade Zuweisung.Erstellen Sie ein dynamisches Schachbrett, das auf Benutzereingaben reagiert jQuery

$(document).ready(function() { 
 
    
 
    //create input form for number/size of board 
 
    $('h1').append('<div class=div1>Size of Board: <input type="text" id = "size1" name="size2" min = "2" max = "100" step = "2" value = "6"><input type="submit" id="submit1" value="Create"></div>') 
 
    
 
    //create button to print Game Pieces 
 
    $('h1').append('<div><input type="submit" id="submitForm" value="Lets Play!"></div>'); 
 
    
 
    
 
    var z = ''; 
 
    //on clicking the button, create array of empty boxes/<td> 
 
    $('#submit1').click(function() { 
 
    var array = []; 
 
    //remove previous appended array 
 
    $('tbody').empty(); 
 

 
    //grab current value or size of gameboard 
 
    z = $('#size1').val(); 
 
    
 
     //with a for loop, create "empty" table (z by z) of boxes 
 
     for (var i=0; i<z; i++) { 
 
     //addClass so we can grab later for color assignment 
 
     var trEven = $('<tr>').addClass('trEven'); 
 
     var trOdd = $('<tr>').addClass('trOdd'); 
 
     //Differentiate between row to row: assign class trEven and trOdd to every other row  
 
     if (i%2 == 0) { 
 
      array.push(trEven); 
 
     } 
 
     else { 
 
      array.push(trOdd); 
 
     } 
 
     //for each row add z number of td's 
 
      for (var j=0; j<z; j++) { 
 
      array[i].append('<td></td>'); 
 
      } 
 
     } 
 

 
    //append updated array to <tbody> 
 
    $('tbody').append(array); 
 
    //select all evens/odds of trOdd/trEven to assign colors using special selectors 
 
    $('.trOdd td:odd').css('background-color', 'black'); 
 
    $('.trOdd td:even').css('background-color', 'white'); 
 
    $('.trEven td:odd').css('background-color', 'white'); 
 
    $('.trEven td:even').css('background-color', 'black'); 
 

 
    });//onclick function 
 
    
 
    
 
    //Play Button: add game pieces 
 
    $('#submitForm').click(function(){ 
 
    if (z <= 6) { 
 
     //first two rows 
 
     $('#gameBoard tr:eq(0) td:odd').append('<div class="gamePiece">') 
 
     $('#gameBoard tr:eq(1) td:even').append('<div class="gamePiece">') 
 
     //last two rows 
 
     $('#gameBoard tr:last td:even').append('<div class="gamePiece">') 
 
     $('#gameBoard tr:nth-last-child(2) td:odd').append('<div class="gamePiece">') 
 
    } 
 
    else if (z > 6) { 
 
\t //first three rows 
 
     $('#gameBoard tr:eq(0) td:odd').append('<div class="gamePiece">') 
 
     $('#gameBoard tr:eq(1) td:even').append('<div class="gamePiece">') 
 
     $('#gameBoard tr:eq(2) td:odd').append('<div class="gamePiece">') 
 
     //last three rows 
 
     $('#gameBoard tr:last td:even').append('<div class="gamePiece">') 
 
     $('#gameBoard tr:nth-last-child(2) td:odd').append('<div class="gamePiece">') 
 
     $('#gameBoard tr:nth-last-child(3) td:even').append('<div class="gamePiece">') 
 
    } 
 

 
    })//onclick function 
 
    
 
    
 
})//document
table { 
 
    border: solid 1px black; 
 
    border-spacing: 0px; 
 
} 
 
td { 
 
    width: 50px; 
 
    height: 50px; 
 
} 
 
.div1 { 
 
    font-size: medium; 
 
} 
 
.gamePiece { 
 
    border-radius: 100%; 
 
    height: 100%; 
 
    width: 100%; 
 
    background-color: red; 
 
}
<!DOCTYPE html> 
 

 
<body> 
 
    <h1>Game Board</h1> 
 
    <table id="gameBoard"> 
 
    <tbody></tbody> 
 
    </table> 
 
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 
 
</body>

Wenn Sie den Inspektoren Werkzeug nach oben ziehen und klicken Sie auf ‚übersprungen‘ Reihe (ex. Dritte Reihe) und es in der ersten Reihe vergleichen, beide Reihen werden erkannt als und „selbst "Reihe, aber das erste td-Element unterscheidet sich. Die erste td/"Spalte" der Zeile 1 wird als td: even gezogen. Jedoch wird die erste td/"Spalte" der dritten Reihe als td: ungerade gezogen. Aus meiner Kenntnis scheint es, dass nach jedem Zeilenpaar (1 ungerade Zeile & 1 gerade Zeile) die Indexierung überspringt, die erste Spalte ist "1", wenn es "0" sein sollte. Dies tritt nur auf, wenn die Boardgröße ungerade ist.

Weiß jemand, warum der Index übersprungen wird?

Antwort

1

Was ist mit einem boolean-Flag, um zu bestimmen, wo Sie sind eine Klasse zuweisen?

zunächst eine boolean Variable deklariert innerhalb Ihrer Schaltfläche „Erstellen“ klicken Handler:

var toggleFlag = true; 

Dann in Ihrer for Schleife, wo Sie die Menge an td in jeder Reihe „zählen“, können Sie eine zuweisen sofort Klasse:

//for each row add z number of td's 
for (var j = 0; j < z; j++) { 
    if(toggleFlag){ 
     array[i].append('<td class="odd"></td>'); 
    }else{ 
     array[i].append('<td class="even"></td>'); 
    } 
    // Toggle the flag for next iteration 
    toggleFlag=!toggleFlag; 
} 

Sobald diese Schleife beendet ist, überprüfen Sie, ob Sie eine ungerade oder gerade Anzahl von td in jeder Zeile haben sollen ... Denn wenn es seltsam ist, Sie wieder zu wechseln haben :

// If rows contain an even amout of td, toggle again before looping to next row 
if(z % 2 == 0){ 
    toggleFlag=!toggleFlag; 
} 

Und schließlich, wenn Sie die „Lassen Sie uns spielen“ Knopf drücken um die Stücke hinzufügen, können Sie td mit der ungeraden Klasse anstelle des :odd oder :even Wähler wählen.

$('#gameBoard tr:nth-last-child(3) td.odd').append('<div class="gamePiece">') 

See this working CodePen
;)


EDIT die anfänglichen Fehler zu erklären

Der Fehler, den Sie in Ihrem Code haben, ist in diesen Zeilen finden:

$('.trOdd td:odd').css('background-color', 'black'); 
$('.trOdd td:even').css('background-color', 'white'); 
$('.trEven td:odd').css('background-color', 'white'); 
$('.trEven td:even').css('background-color', 'black'); 

Diese Logik ist gut für eine gerade Anzahl von Quadraten.
Aber mit einer ungeraden Menge, erhalten Sie tödlich einen Offset von eins.

Dies ist, was diese "zwei mal zwei" Zeilen Gruppierung Wirkung macht.
Sie müssten also eine "alternierende Logik" dieses Codeblocks ... in jeder Zeile haben.
Das ist nicht ganz einfach.
Deshalb nahm ich das Problem von früher in den Code, indem Sie die Klassen in der Schleife, die die td s nacheinander durchlaufen.

Nur um es zu illustrieren, habe ich another CodePen gemacht.
Es zeigt deutlich, dass diese Wähler $('.trOdd td:odd')ALLtd auswählt, die in einer ungeraden tr ... Aber nicht nur auf eine Zeile, um die ungerade Klasse! Ich bin mir sicher, dass du denkst ... Es bringt die Reihen nicht eins nach dem anderen, wie es ein Mensch tun würde. Es ergreift den ganzen Tisch, um passende Elemente zu sammeln.

Sehen Sie? Für jQuery gibt es nur zwei Reihen (trOdd und trEven) ...
;)

+0

Vielen Dank für diese Lösung, wie ich Ich verstehe, wie man mit einer Fahne angibt, wie die nächste Zeile beginnen soll, schwarz oder weiß.Jedoch ist meine vorherige Frage zu dem Thema (was wie ein Indizierungsproblem scheint?) nicht beantwortet und meines Wissens nach meine Code sollte für eine ungerade Größe Board arbeiten. – jaysonder

+0

Ich habe viel von Ihrem Code gelernt, und der Ansatz war "out of the box" für mich. Prost! – jaysonder

+0

Ich respektiere das;) Sie wollen Ihren Fehler verstehen ... Ich habe versucht, so klar wie möglich in meinem letzten Schnitt zu antworten. –

1

Alles dreht sich um CSS. Probieren Sie es aus der JS-Klasse aus, die ungeraden und geraden Elementen zugewiesen wird, aber verwenden Sie CSS, um die richtigen Elemente auszuwählen.

$(document).ready(function() { 
 

 
    //create input form for number/size of board 
 
    $('h1').append('<div class=div1>Size of Board: <input type="text" id = "size1" name="size2" min = "2" max = "100" step = "2" value = "6"><input type="submit" id="submit1" value="Create"></div>') 
 

 
    //create button to print Game Pieces 
 
    $('h1').append('<div><input type="submit" id="submitForm" value="Lets Play!"></div>'); 
 

 

 
    var z = ''; 
 
    //on clicking the button, create array of empty boxes/<td> 
 
    $('#submit1').click(function() { 
 
     var array = []; 
 
     //remove previous appended array 
 
     $('tbody').empty(); 
 

 
     //grab current value or size of gameboard 
 
     z = $('#size1').val(); 
 

 
     //with a for loop, create "empty" table (z by z) of boxes 
 
     for (var i = 0; i < z; i++) { 
 
     //addClass so we can grab later for color assignment 
 
     var trEven = $('<tr>').addClass('trEven'); 
 
     var trOdd = $('<tr>').addClass('trOdd'); 
 
     //Differentiate between row to row: assign class trEven and trOdd to every other row  
 
     if (i % 2 == 0) { 
 
      array.push(trEven); 
 
     } else { 
 
      array.push(trOdd); 
 
     } 
 
     //for each row add z number of td's 
 
     for (var j = 0; j < z; j++) { 
 
      array[i].append('<td></td>'); 
 
     } 
 
     } 
 

 
     //append updated array to <tbody> 
 
     $('tbody').append(array); 
 
     //select all evens/odds of trOdd/trEven to assign colors using special selectors 
 
     $('.trOdd td:odd').addClass('even'); 
 
     $('.trOdd td:even').addClass('odd'); 
 
     $('.trEven td:odd').addClass('odd'); 
 
     $('.trEven td:even').addClass('even'); 
 

 
    }); //onclick function 
 

 

 
    //Play Button: add game pieces 
 
    $('#submitForm').click(function() { 
 
     if (z <= 6) { 
 
      //first two rows 
 
      $('#gameBoard tr:eq(0) td:odd').append('<div class="gamePiece">') 
 
      $('#gameBoard tr:eq(1) td:even').append('<div class="gamePiece">') 
 
      //last two rows 
 
      $('#gameBoard tr:last td:even').append('<div class="gamePiece">') 
 
      $('#gameBoard tr:nth-last-child(2) td:odd').append('<div class="gamePiece">') 
 
     } else if (z > 6) { 
 
      //first three rows 
 
      $('#gameBoard tr:eq(0) td:odd').append('<div class="gamePiece">') 
 
      $('#gameBoard tr:eq(1) td:even').append('<div class="gamePiece">') 
 
      $('#gameBoard tr:eq(2) td:odd').append('<div class="gamePiece">') 
 
      //last three rows 
 
      $('#gameBoard tr:last td:even').append('<div class="gamePiece">') 
 
      $('#gameBoard tr:nth-last-child(2) td:odd').append('<div class="gamePiece">') 
 
      $('#gameBoard tr:nth-last-child(3) td:even').append('<div class="gamePiece">') 
 
     } 
 

 
     }) //onclick function 
 

 

 
    }) //document
table { 
 
    border: 1px solid #000; 
 
} 
 

 
td { 
 
    background-color: #fff; 
 
    height: 50px; 
 
    width: 50px; 
 
} 
 

 
td:nth-child(2n) { 
 
    background-color: #000; 
 
} 
 

 
tr:nth-child(2n) td { 
 
    background-color: #000; 
 
} 
 

 
tr:nth-child(2n) td:nth-child(2n) { 
 
    background-color: #fff; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h1>Game Board</h1> 
 
    <table id="gameBoard"> 
 
    <tbody></tbody> 
 
    </table>

+0

Hey, Sie mit der Maus über die Eingabemaske und eine AUF und AB-Taste muss schweben soll angezeigt werden, das den dann schaffen Tafel. – jaysonder

+0

Danke, ich habe mir dein Snippet angeschaut und festgestellt, dass dein CSS nur auf div.odd und div.even zeigt, so dass das CSS es schwer macht zu bestimmen, in welcher Zeile sich die divs befinden. Du kannst dein CSS in ' .trOdd .odd', 'trOdd .even' und' .trEven. odd', '.trEven .even' – noob

+0

Ich habe mein CSS geändert, habe aber immer noch das gleiche Problem. Wenn Sie das Inspektor-Tool aufrufen und auf die Zeile "Übersprungen" (z. B. dritte Zeile) klicken und diese mit der ersten Zeile vergleichen, haben beide Zeilen die gerade Klasse, aber das erste TD-Element unterscheidet sich. Die erste der ersten Zeile ist "gerade" zugewiesen, während die dritte Zeile "ungerade" zugewiesen ist. – jaysonder