ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ 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 4private 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 4public 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 {