Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ³Ρ€ для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 65

Автор Майкл ΠœΠΎΡ€Ρ€ΠΈΡΠΎΠ½

try {

winPlayer.start();

}

catch (MediaException me) {

}

status = "You won!";

}

else { //Π˜Π³Ρ€ΠΎΠΊ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»

// воспроизвСсти Π·Π²ΡƒΠΊ пораТСния

try {

losePlayer.start();

}

catch (MediaException me) {

}

status = "You lost!";

}

gameOver = true;

}

else if (gameState.isTie()) { //ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ Π»ΠΈ ΠΈΠ³Ρ€Π° Π½ΠΈΡ‡ΡŒΠ΅ΠΉ

// воспроизвСсти Π·Π²ΡƒΠΊ Π½ΠΈΡ‡ΡŒΠ΅ΠΉ

try {

losePlayer.start();

}

catch (MediaException me) {

}

status = "The game ended in a tie!";

gameOver = true;

}

else {

// ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ сообщСниС ΠΎ статусС

status = myMove ? "Waiting for other player..." : "Your turn.";

}

return true;

}

Π― знаю, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ makeMove() достаточно Π·Π°ΠΏΡƒΡ‚Π°Π½, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ слоТный, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, β€“ это ΠΈΠ³Ρ€ΠΎΠΊ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ столбца, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ…ΠΎΠ΄. ΠœΠ΅Ρ‚ΠΎΠ΄ начинаСтся с Π²Ρ‹Π·ΠΎΠ²Π° dropPiece(), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся пСрСмСнная gameState. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ пытаСтся ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΠΈΡˆΠΊΡƒ Π² Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ столбСц. Π― Π³ΠΎΠ²ΠΎΡ€ΡŽ «пытаСтся», ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ столбСц ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΠΎΠ½. Π’ этом случаС ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΠ΄ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСльзя.

Если Ρ…ΠΎΠ΄ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½, Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ makeMove() воспроизводит Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ провСряСт, Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π»ΠΈ этот Ρ…ΠΎΠ΄ ΠΈΠ³Ρ€Ρƒ. Π’ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ isWinner() пСрСдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ состояниС ΠΈΠ³Ρ€Ρ‹, ΠΎΠ½ провСряСт, ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ, сдСлавший Ρ…ΠΎΠ΄. Если Π΄Π°, Ρ‚ΠΎ слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, ΠΊΡ‚ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» – ΠΈΠ³Ρ€ΠΎΠΊ ΠΈΠ»ΠΈ Π΅Π³ΠΎ сопСрник. Π—Π°Ρ‚Π΅ΠΌ обновляСтся статусноС сообщСниС, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ gameOver присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true.

Π˜Π³Ρ€Π° Connect 4 ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»Π΅ Π½Π΅ остаСтся свободной ячСйки, Π° Π½ΠΈΠΊΡ‚ΠΎ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π΅ смог Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ 4 Ρ„ΠΈΡˆΠΊΠΈ Π² ряд. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΠΈΡ‡ΡŒΡŽ, достаточно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ isTie() класса C4Canvas. ΠœΠ΅Ρ‚ΠΎΠ΄ makeMove() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ isTie() ΠΈ провСряСт, ΠΎΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ Π»ΠΈ ΠΈΠ³Ρ€Π° Π½ΠΈΡ‡ΡŒΠ΅ΠΉ.

БостояниС ΠΈΠ³Ρ€Ρ‹ Connect 4

ПослСдний Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠΈ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Connect 4 – это класс, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΈΠ³Ρ€Ρ‹ Connect 4, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΈΡˆΠ΅ΠΊ Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доскС. Класс C4State ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΈΠ³Ρ€Ρ‹ Connect 4, ΠΎΠ½ содСрТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

private static boolean[][][] map;

private int[][] score = new int[2][winPlaces];

public static final int winPlaces = 69, maxPieces = 42, Empty = 2;

private int numPieces;

public int[][] board = new int[7][6];

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Π±ΠΎΡ€ класса C4State, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ с рассмотрСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… winPlaces, maxPieces ΠΈ Empty Ρ‚ΠΈΠΏΠ° static final. Π’Π°ΠΊΠΎΠ΅ объявлСниС Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эти Ρ‡Π»Π΅Π½Ρ‹ класса ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для подсчСта значСния константы winPlaces, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π½Π° доскС:

winPlaces = 4*w*h – 3*w*n – 3*h*n + 3*h – 4*n + 2*n*n;

Π­Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ любой ΠΈΠ³Ρ€Π΅ Ρ‚ΠΈΠΏΠ° Connect X. Π’ этом ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΈ: w ΠΈ h – ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высота доски Π² ячСйках соотвСтствСнно, Π° n – число Ρ„ΠΈΡˆΠ΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ для ΠΏΠΎΠ±Π΅Π΄Ρ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΈΠ³Ρ€Π΅ Connect 4 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ доска Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 7 6, ΠΏΡ€ΠΈ этом для ΠΏΠΎΠ±Π΅Π΄Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ 4 Ρ„ΠΈΡˆΠΊΠΈ, Ρ‚ΠΎ Π²Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ winPlaces ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ число 69. Как Ρ€Π°Π· ΠΈΠΌΠ΅Π½Π½ΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ присваиваСтся Π² классС C4State. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ maxPieces опрСдСляСт максимальноС число Ρ„ΠΈΡˆΠ΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° доску. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

maxPieces = w*h;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния Π½ΠΈΡ‡ΡŒΠ΅ΠΉ. ΠΠΈΡ‡ΡŒΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли всС ячСйки Π½Π° доскС заняты, Π° Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π΅ ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π» ΠΏΠΎΠ±Π΅Π΄Ρƒ.

Другая константа класса – это Empty, ΠΎΠ½Π° соотвСтствуСт свободному пространству Π½Π° доскС. КаТдая ячСйка Π½Π° доскС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ число 0, 1 ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы Empty – 2.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅ списку констант, пСрСмСнная map – это Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив булСвского Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ устроСн массив map, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΌ массивом Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, Ρ€Π°Π²Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доски. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊ Π½Π΅ΠΌΡƒ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅, присоСдинив ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйкС массив Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

КаТдая ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Π°Ρ комбинация Π² ΠΈΠ³Ρ€Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ своС ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² массивС (Π΄Π»ΠΈΠ½Π½Π° массива Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π°Π²Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ winPlaces). КаТдая ячСйка массива содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true ΠΈΠ»ΠΈ false Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ ячСйка Π½Π° пСрСсСчСнии Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим нСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ массив map. ВзглянитС Π½Π° Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ Π»Π΅Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доски (рис. 15.1). Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Π·ΠΎΠ²Π΅ΠΌ это ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (0,0). Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ это ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π‘Π΄Π°Π΅Ρ‚Π΅ΡΡŒ? ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° рис. 15.4.

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ (0,0) Π½Π° доскС ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, массив для полоТСния (0,0) ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ эти ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, установив значСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ячССк true, ΠΏΡ€ΠΈ этом значСния Π²ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ячСйках Π±ΡƒΠ΄ΡƒΡ‚ false. Если Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ полоТСния, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½Π° рис. 15.4, Π±ΡƒΠ΄ΡƒΡ‚ Π² полоТСниях 11–13, массив map инициализировался Π±Ρ‹ Ρ‚Π°ΠΊ:

…

map[0][0][9] = false;

map[0][0][10] = false;

map[0][0][11] = true;

map[0][0][12] = true;

map[0][0][13] = true;

map[0][0][14] = false;

map[0][0][15] = false;

…

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ массив map создан, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΡ‚ΠΎ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΏΠΎΠ±Π΅Π΄ΠΈΠ».

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ board – это цСлочислСнный массив Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 7 6, ΠΎΠ½ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ состояниС ΠΈΠ³Ρ€Ρ‹. КаТдая ячСйка ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: 0, 1 (Π² зависимости ΠΎΡ‚ ΠΈΠ³Ρ€ΠΎΠΊΠ°) ΠΈΠ»ΠΈ Empty.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ score – это Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ цСлочислСнный массив, хранящий счСт ΠΈΠ³Ρ€Ρ‹. Основной массив Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ score содСрТит массив для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π΄Π»ΠΈΠ½ΠΎΠΉ winPlaces. Π­Ρ‚ΠΈ массивы содСрТат ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ, насколько Π±Π»ΠΈΠ·ΠΎΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² ΠΊ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ количСство Ρ„ΠΈΡˆΠ΅ΠΊ, входящих Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ массив ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊ: Ссли Π² Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΈΡˆΠΊΠΈ, Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ячСйки массива Ρ€Π°Π²Π½ΠΎ 0. Если Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΈΡˆΠΊΠΈ, Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ячСйки массива становится Ρ€Π°Π²Π½Ρ‹ΠΌ 2 Π² стСпСни m, Π³Π΄Π΅ m – число Ρ„ΠΈΡˆΠ΅ΠΊ. Если Π² ячСйкС массива появляСтся число 16, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π» ΠΏΠΎΠ±Π΅Π΄Ρƒ....

Π‘ΠΎΠ²Π΅Ρ‚ Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ

НС Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ класс C4State подсчитываСт ΠΎΡ‡ΠΊΠΈ ΠΈ опрСдСляСт побСдитСля. Основная Ρ†Π΅Π»ΡŒ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° – ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ сСтСвой мобильной ΠΈΠ³Ρ€Ρ‹. Π₯ΠΈΡ‚Ρ€Ρ‹ΠΉ ΠΊΠΎΠ΄ подсчСта ΠΎΡ‡ΠΊΠΎΠ² – это Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰Π°Ρ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ побСдитСля Π² ΠΈΠ³Ρ€Π΅ Connect 4, Π½ΠΎ ΠΎΠ½Π° Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Π²Π°ΠΆΠ½Π° для сСтСвых аспСктов ΠΌΠΈΠ΄Π»Π΅Ρ‚Π°.

Π’ΠΎΡ‚ ΠΈ всС, Ρ‡Ρ‚ΠΎ касаСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… класса C4State. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹, вСроятно, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ класса ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² этого класса.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса C4State ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ массив map, ΠΈΠ³Ρ€ΠΎΠ²ΡƒΡŽ доску ΠΈ массивы счСта (листинг 15.11).

Листинг 15.11. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ C4State() ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ массив map ΠΈΠ³Ρ€Ρ‹ Connect 4 ΠΈ ΠΈΠ³Ρ€ΠΎΠ²ΡƒΡŽ доску

public C4State() {

// инициализация map

int i, j, k, count = 0;

if (map == null) {

map = new boolean[7][6][winPlaces];

for (i = 0; i < 7; i++)

for (j = 0; j < 6; j++)

for (k = 0; k < winPlaces; k++)

map[i][j][k] = false;

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ

for (i = 0; i < 6; i++)

for (j = 0; j < 4; j++) {

for (k = 0; k < 4; k++)

map[j + k][i][count] = true;

count++;

}

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ

for (i = 0; i < 7; i++)

for (j = 0; j < 3; j++) {

for (k = 0; k < 4; k++)

map[i][j + k][count] = true;

count++;

}

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ прямыС Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ

for (i = 0; i < 3; i++)

for (j = 0; j < 4; j++) {

for (k = 0; k < 4; k++)

map[j + k][i + k][count] = true;

count++;

}

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ

for (i = 0; i < 3; i++)

for (j = 6; j >= 3; j–) {

for (k = 0; k < 4; k++)

map[j – k][i + k][count] = true;

count++;

}

}

// ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доску

for (i = 0; i < 7; i++) //Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ³Ρ€Ρ‹ Π½Π° доскС Π½Π΅Ρ‚ Ρ„ΠΈΡˆΠ΅ΠΊ

for (j = 0; j < 6; j++)

board[i][j] = Empty;

// ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ счСт

for (i = 0; i < 2; i++)

for (j = 0; j < winPlaces; j++)

score[i][j] = 1;

numPieces = 0;

}

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ конструктор содСрТит большой Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, Π² Π½Π΅ΠΌ выполняСтся лишь инициализация массива Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠ±Π΅Π΄Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ.

ΠœΠ΅Ρ‚ΠΎΠ΄ isWinner() класса C4State (листинг 15.12) провСряСт, ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ.

Листинг 15.12. ΠœΠ΅Ρ‚ΠΎΠ΄ isWinner() класса C4State провСряСт, ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ ΠΏΠΎΠ±Π΅Π΄Ρƒ

public boolean isWinner(int player) {

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ

for (int i = 0; i < winPlaces; i++)

if (score[player][i] == 16) //Число 16 Π² массивС счСта Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ ΠΏΠΎΠ±Π΅Π΄Π΅

return true;

return false;

}

ΠœΠ΅Ρ‚ΠΎΠ΄ isWinner() опрСдСляСт ΠΏΠΎΠ±Π΅Π΄Ρƒ, провСряя элСмСнты массива score Π½Π° равСнство 16.

ΠœΠ΅Ρ‚ΠΎΠ΄ isTie() провСряСт Π½ΠΈΡ‡ΡŒΡŽ Π² ΠΈΠ³Ρ€Π΅, для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ просто сравниваСт значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… numPieces ΠΈ maxPieces. Если ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ доска Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°. Код ΠΌΠ΅Ρ‚ΠΎΠ΄Π° isTie() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 15.13.

Листинг 15.13. ΠœΠ΅Ρ‚ΠΎΠ΄ isTie() класса C4State провСряСт, Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ Π»ΠΈ ΠΈΠ³Ρ€Π° Π½ΠΈΡ‡ΡŒΠ΅ΠΉ

public boolean isTie() {

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½ΠΈΡ‡ΡŒΡŽ

return (numPieces == maxPieces);

}

ΠœΠ΅Ρ‚ΠΎΠ΄ dropPiece() ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ„ΠΈΡˆΠΊΡƒ Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ Π½Π° доскС (листинг 15.14). Листинг 15.14. ΠœΠ΅Ρ‚ΠΎΠ΄ dropPiece() класса C4Stste Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ мСстС ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ поля

public int dropPiece(int player, int xPos) {

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ мСсто

int yPos = 0;

while ((board[xPos][yPos] != Empty) && (++yPos < 6))

;

// ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°

if (yPos == 6) //Колонка Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°, поэтому Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ошибкС (-1)

return -1;

// Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ Π΅ΡΡ‚ΡŒ мСсто

board[xPos][yPos] = player;

numPieces++;

updateScore(player, xPos, yPos);

return yPos;

}

ΠœΠ΅Ρ‚ΠΎΠ΄ dropPiece() Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ X ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½ провСряСт, Ρ‡Ρ‚ΠΎ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ Π΅ΡΡ‚ΡŒ свободноС мСсто. Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ игровая доска хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ board Π²Π²Π΅Ρ€Ρ… Ρ‚ΠΎΡ€ΠΌΠ°ΡˆΠΊΠ°ΠΌΠΈ. Вакая инвСрсия ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ процСсс добавлСния Ρ„ΠΈΡˆΠΊΠΈ Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ. Если Ρ…ΠΎΠ΄ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½, Ρ‚ΠΎ элСмСнту массива board присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΈΠ³Ρ€ΠΎΠΊΡƒ, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ numPieces увСличиваСтся Π½Π° 1. Π—Π°Ρ‚Π΅ΠΌ обновляСтся массив score, для Ρ‡Π΅Π³ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ updateScore().

ΠœΠ΅Ρ‚ΠΎΠ΄ updateScore() класса C4State обновляСт элСмСнты массива score (листинг 15.15).