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

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

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

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ status содСрТит тСкст, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π² строкС состояния, Π° пСрСмСнная gameOver Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π° ΠΈΠ³Ρ€Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ myMove опрСдСляСт, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄, ΠΈΠ»ΠΈ слСдуСт ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄Π° сопСрника. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, пСрСмСнная curSlot Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ столбца Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доскС.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ класса C4Canvas Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ start(), ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 15.5.

Листинг 15.5. ΠœΠ΅Ρ‚ΠΎΠ΄ start() класса C4Canvas начинаСтся с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ³Ρ€Ρ‹ ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ сСрвиса ΠΊΠ»ΠΈΠ΅Π½Ρ‚/сСрвСр

public void start() {

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° экран

display.setCurrent(this);

// инициализация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ„ΠΈΡˆΠ΅ΠΊ

try {

piece[0] = Image.createImage("/RedPiece.png");

piece[1] = Image.createImage("/BluePiece.png");

}

catch (IOException e) {

System.err.println("Failed loading images!");

}

// инициализация спрайта стрСлки

try {

// Create the arrow sprite

arrowSprite = new Sprite(Image.createImage("/Arrow.png"), 18, 16);

arrowSprite.setFrame(isServer ? 0 : 1); //Π‘ΠΏΡ€Π°ΠΉΡ‚ стрСлки ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° Ρ„Ρ€Π΅ΠΉΠΌΠ° (синий ΠΈ красный), ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹

}

catch (IOException e) {

System.err.println("Failed loading images!");

}

// инициализация ΠΏΡ€ΠΎΠΈΠ³Ρ€ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

try {

InputStream is = getClass().getResourceAsStream("Legal.wav");

legalPlayer = Manager.createPlayer(is, "audio/X-wav");

legalPlayer.prefetch();

is = getClass().getResourceAsStream("Illegal.wav");

illegalPlayer = Manager.createPlayer(is, "audio/X-wav");

illegalPlayer.prefetch();

is = getClass().getResourceAsStream("Win.wav");

winPlayer = Manager.createPlayer(is, "audio/X-wav");

winPlayer.prefetch();

is = getClass().getResourceAsStream("Lose.wav");

losePlayer = Manager.createPlayer(is, "audio/X-wav");

losePlayer.prefetch();

}

catch (IOException ioe) {

}

catch (MediaException me) {

}

// инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ³Ρ€Ρ‹

gameOver = true;

myMove = !isServer; // ΠΊΠ»ΠΈΠ΅Π½Ρ‚ всСгда Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ

curSlot = 0;

gameState = new C4State();

// запуск сСтСвого сСрвиса

if (isServer) { //Начиная с этой Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠΈΠ΄Π»Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ сСрвСра ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

server = new C4Server(this);

server.start();

}

else {

client = new C4Client(this);

client.start();

}

// запуск ΠΏΠΎΡ‚ΠΎΠΊΠ° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

sleeping = false;

Thread t = new Thread(this);

t.start();

}

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ start() выполняСтся ряд Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ„ΠΈΡˆΠ΅ΠΊ ΠΈ стрСлки. Π‘ΠΏΡ€Π°ΠΉΡ‚ стрСлки состоит ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² – синСй ΠΈ красной стрСлок, Ρ†Π²Π΅Ρ‚ стрСлки выбираСтся Π² соотвСтствиС с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ³Ρ€Ρ‹ (ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ сСрвСр). Π—Π°Ρ‚Π΅ΠΌ выполняСтся инициализация ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»Π΅ΠΉ, послС Ρ‡Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ основныС ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (gameOver, myMove, curSlot ΠΈ gameState). Π’ зависимости ΠΎΡ‚ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ isServer запускаСтся Π½ΡƒΠΆΠ½Ρ‹ΠΉ сСтСвой сСрвис (ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ сСрвСр). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ устанавливаСтся ΠΏΡ€ΠΈ запускС конструктора C4Canvas().

Π₯отя ΠΌΠ΅Ρ‚ΠΎΠ΄ start() ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ΅Π½ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния, ΠΌΠ΅Ρ‚ΠΎΠ΄ update(), ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 15.6, β€“ это ΠΌΠ΅Ρ‚ΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ обрабатываСтся Π²Π²ΠΎΠ΄ ΠΈ прСобразуСтся Π² ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ события, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎ сСти.

Листинг 15.6. ΠœΠ΅Ρ‚ΠΎΠ΄ update() класса C4Canvas ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° наТатия клавиш ΠΈ отправляСт ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ сообщСния

private void update() {

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π»ΠΈ ΠΈΠ³Ρ€Π°

if (gameOver) {

int keyState = getKeyStates();

if ((keyState & FIRE_PRESSED) != 0) {

// Π½Π°Ρ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ

newGame();

// ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС ΠΎ Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Π΅ ΠΎΠΏΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ

if (isServer)

server.sendMessage("NewGame"); //ΠžΠΏΠΎΠ²Π΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΎ Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ³Ρ€Ρ‹

else

client.sendMessage("NewGame");

}

// ΠΈΠ³Ρ€Π° ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½Π°, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ трСбуСтся

return;

}

// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° наТатия клавиш

if (!gameOver && myMove) {

// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°

int keyState = getKeyStates();

if ((keyState & LEFT_PRESSED) != 0) {

if (–curSlot < 0) //ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π²Π»Π΅Π²ΠΎ

curSlot = 0;

}

else if ((keyState & RIGHT_PRESSED) != 0) {

if (++curSlot > 6) //ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π²ΠΏΡ€Π°Π²ΠΎ

curSlot = 6;

}

else if ((keyState & FIRE_PRESSED) != 0) {

if (makeMove(isServer ? 0 : 1, curSlot)) {

myMove = false; //Π₯ΠΎΠ΄ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½

// ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ

if (isServer) //ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ…ΠΎΠ΄Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ устройству

server.sendMessage(Integer.toString(curSlot));

else

client.sendMessage(Integer.toString(curSlot));

}

}

// ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ стрСлки

arrowSprite.setPosition( //Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π° ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π² соотвСтствии с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΎΠΉ

getWidth() * (curSlot + 1) / 8 – arrowSprite.getWidth() / 2, 21);

}

}

ΠœΠ΅Ρ‚ΠΎΠ΄ update() начинаСтся с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ³Ρ€Ρ‹ ΠΈ, Ссли это Ρ‚Π°ΠΊ, Ρ‚ΠΎ начинаСтся новая ΠΈΠ³Ρ€Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ пСрСзапуск ΠΈΠ³Ρ€Ρ‹ выполняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ newGame(), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сообщСния NewGame Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π·Ρƒ ΠΈΠ³Ρ€Ρ‹. Если новая ΠΈΠ³Ρ€Π° Π½Π΅ Π½Π°Ρ‡Π°Ρ‚Π°, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ наТатия клавиш Π’Π»Π΅Π²ΠΎ, Π’ΠΏΡ€Π°Π²ΠΎ ΠΈ Огонь. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ наТатия клавиш ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΏΠΎΠΊΠ° ΠΈΠ³Ρ€Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°.

Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈ Π’Π»Π΅Π²ΠΎ ΠΈ Π’ΠΏΡ€Π°Π²ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curSlot Π² соотвСтствии с Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΎΠΉ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доски. Код для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ наТатия клавиши Огонь Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ интСрСснСС, Π΅Π΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ…ΠΎΠ΄Π°, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ makeMove(). Об этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. НСзависимо ΠΎΡ‚ наТатия клавиши Огонь Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° update() выполняСтся ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ спрайта стрСлки Π² соотвСтствии с измСнСниями ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curSlot.

Π’ листингС 15.7 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° draw(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° Connect 4.

Листинг 15.7. ΠœΠ΅Ρ‚ΠΎΠ΄ draw() класса C4Canvas ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° Connect 4

private void draw(Graphics g) {

// Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΠ½

g.setColor(128, 128, 128); // сСрый

g.fillRect(0, 0, getWidth(), getHeight());

// вывСсти статусноС сообщСниС

g.setColor(0, 0, 0); // Ρ‡Π΅Ρ€Π½Ρ‹Π΅

g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM));

g.drawString(status, getWidth() / 2, 2, Graphics.TOP | Graphics.HCENTER); //Π‘Ρ‚Ρ€ΠΎΠΊΠ° статусных сообщСний располагаСтся Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ экрана

if (!gameOver && myMove) { //ВывСсти стрСлку, Ссли ΠΈΠ³Ρ€Π° продолТаСтся ΠΈ Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΈΠ³Ρ€ΠΎΠΊΡƒ

// вывСсти стрСлку

arrowSprite.paint(g);

}

// вывСсти Ρ„ΠΈΡˆΠΊΡƒ

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

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

switch(gameState.board[i][j]) {

case 0:

g.drawImage(piece[0],

(getWidth() * (i + 1)) / 8 – (piece[0].getWidth() / 2), //ВывСсти Ρ„ΠΈΡˆΠΊΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ° сСрвСра

((getHeight() – 33) * (6 – j)) / 7 – (piece[0].getHeight() / 2) + 33,

Graphics.TOP | Graphics.LEFT);

break;

case 1:

g.drawImage(piece[1],

(getWidth() * (i + 1)) / 8 – (piece[0].getWidth() / 2), //ВывСсти Ρ„ΠΈΡˆΠΊΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

((getHeight() – 33) * (6 – j)) / 7 – (piece[1].getHeight() / 2) + 33,

Graphics.TOP | Graphics.LEFT);

break;

default:

g.setColor(255, 255, 255); // Π±Π΅Π»Ρ‹ΠΉ //ВывСсти свободныС ячСйки

g.fillArc((getWidth() * (i + 1)) / 8 – (piece[0].getWidth() / 2),

((getHeight() – 33) * (6 – j)) / 7 – (piece[0].getHeight() / 2) + 33,

piece[0].getWidth(), piece[0].getHeight(), 0, 360);

break;

}

// вывСсти Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ Π½Π° экран

flushGraphics();

}

ΠœΠ΅Ρ‚ΠΎΠ΄ draw() начинаСтся с Π·Π°Π»ΠΈΠ²ΠΊΠΈ Ρ„ΠΎΠ½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ экрана. Π—Π°Ρ‚Π΅ΠΌ Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части экрана появляСтся ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ статусноС сообщСниС. Если ΠΈΠ³Ρ€Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΈ Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΈΠ³Ρ€ΠΎΠΊΡƒ, Ρ‚ΠΎ спрайт стрСлки выводится ΠΏΠΎΠ΄ строкой статуса. ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° draw() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ„ΠΈΡˆΠΊΠΈ ΠΈ пустыС ячСйки Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доскС. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доскС соотвСтствуСт Ρ„ΠΈΡˆΠΊΠ΅ красного Ρ†Π²Π΅Ρ‚Π° – ΠΈΠ³Ρ€ΠΎΠΊΠ° сСрвСрного прилоТСния, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 – Ρ„ΠΈΡˆΠΊΠ΅ синСго Ρ†Π²Π΅Ρ‚Π°, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ ΠΈΠ³Ρ€ΠΎΠΊΡƒ клиСнтского прилоТСния.

ΠœΠ΅Ρ‚ΠΎΠ΄ newGame() вызываСтся для запуска Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹, Π΅Π³ΠΎ Π·Π°Π΄Π°Ρ‡Π° – ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ строку состояния. Π’ листингС 15.8 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Листинг 15.8. ΠœΠ΅Ρ‚ΠΎΠ΄ newGame() класса C4Canvas запускаСт Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ Connect 4

public void newGame() {

// Initialize the game variables

gameOver = false;

curSlot = 0;

gameState = new C4State();

// Update the status message

status = myMove ? "Your turn." : "Waiting for player\'s move...";

}

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ gameOver присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curSlot – 0, игровая доска обновляСтся ΠΏΡ€ΠΈ создании ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ gameState(). Π—Π°Ρ‚Π΅ΠΌ обновляСтся сообщСниС Π² строкС статуса Π² соотвСтствии с ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΡΡ‚ΡŒΡŽ Ρ…ΠΎΠ΄Π°.

Π’Ρ‹ ΡƒΠΆΠ΅ нСсколько Ρ€Π°Π· Π²ΠΈΠ΄Π΅Π»ΠΈ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° receiveMessage() (листинг 15.9), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний.

Листинг 15.9. ΠœΠ΅Ρ‚ΠΎΠ΄ receiveMessage() класса C4Canvas ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСния, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ сСти

public void receiveMessage(String message) {

if (gameOver) {

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сообщСния ΠΎ запускС Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹

if (message.equals("NewGame")) //Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ сообщСниС NewGame, Ρ‚ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ

newGame();

}

else {

if (!myMove) {

// ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сообщСниС с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ…ΠΎΠ΄Π΅

try {

// ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄ сопСрника

int slot = Integer.parseInt(message);

if (slot >= 0 && slot <= 6) { //ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сообщСниС содСрТит допустимоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ (ΠΎΡ‚ 0 Π΄ΠΎ 6), Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄

if (makeMove(isServer ? 1 : 0, slot))

myMove = true;

}

}

catch (NumberFormatException nfe) {

}

}

}

}

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ сСрвСром. Он ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСния, ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ сопСрником.

Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ сообщСниС всСгда содСрТит ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ – сообщСниС ΠΎ Π½Π°Ρ‡Π°Π»Π΅ Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹, ΠΈΠ»ΠΈ сообщСниС ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π΅ столбца, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сопСрник поставил Ρ„ΠΈΡˆΠΊΡƒ. Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ сообщСниС NewGame, Ρ‚ΠΎ запускаСтся новая ΠΈΠ³Ρ€Π°. Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€ столбца, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» сдСлан Ρ…ΠΎΠ΄, Ρ‚ΠΎ ΠΎΠ½ пСрСдаСтся Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ makeMove().

ΠœΠ΅Ρ‚ΠΎΠ΄ makeMove() β€“ это послСдний интСрСсный ΠΌΠ΅Ρ‚ΠΎΠ΄ класса C4 Canvas. Π’ листингС 15.10 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π΅Π³ΠΎ ΠΊΠΎΠ΄. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° Connect 4.

Листинг 15.10. ΠœΠ΅Ρ‚ΠΎΠ΄ makeMove() класса C4Canvas ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ…ΠΎΠ΄Ρ‹, сдСланныС Π² ΠΈΠ³Ρ€Π΅

private boolean makeMove(int player, int slot) {

// Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Ρ„ΠΈΡˆΠΊΡƒ

if (gameState.dropPiece(player, slot) == -1) { //ΠŸΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Ρ„ΠΈΡˆΠΊΡƒ Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ, Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false

// воспроизвСсти Π·Π²ΡƒΠΊ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π°

try {

illegalPlayer.start();

}

catch (MediaException me) {

}

return false;

}

// воспроизвСсти Π·Π²ΡƒΠΊ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π°

try {

legalPlayer.start();

}

catch (MediaException me) {

}

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π° Π»ΠΈ ΠΈΠ³Ρ€Π°

if (gameState.isWinner(player)) {

if ((isServer && (player == 0)) || (!isServer && (player == 1))) { //ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π²Ρ‹ΠΈΠ³Ρ€Π°Π» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ

// воспроизвСсти Π·Π²ΡƒΠΊ ΠΏΠΎΠ±Π΅Π΄Ρ‹

try {