import java.awt.*; import java.applet.Applet; import java.net.*; public class Slide5 extends Applet{ // Two-player version of Slide5 private CheckboxGroup allmoves; private Checkbox move[]; private TokenCanvas pic[]; private TokenCanvas corner; Board position; // Current game position int turn; // Whose turn it is, 1 = player1, -1 = // player2. int winner; int player1, player2; // Keep tally int state; public void init(){ int i,j; turn = 1; setBackground(Color.lightGray); state = 0; setLayout(new GridLayout(6,6)); allmoves = new CheckboxGroup(); position = new Board(); pic = new TokenCanvas[25]; for(i = 0; i< 25; i++){ pic[i] = new TokenCanvas(); pic[i].resize(50,50); pic[i].token = 0; pic[i].setBackground(Color.gray); } corner = new TokenCanvas(); corner.resize(50,50); corner.token = 1; player1 = 0; player2 = 0; add(corner); corner.repaint(); move = new Checkbox[10]; for(i = 0; i < 10; i++){ move[i] = new Checkbox(); } move[0].setLabel("1"); move[1].setLabel("2"); move[2].setLabel("3"); move[3].setLabel("4"); move[4].setLabel("5"); move[5].setLabel("6"); move[6].setLabel("7"); move[7].setLabel("8"); move[8].setLabel("9"); move[9].setLabel("10"); for(i = 0; i < 10; i++){ move[i].setCheckboxGroup(allmoves); } for( i = 0; i < 5; i++){ add(move[i]); } for( i = 5; i < 10; i++){ add(move[i]); for(j = 0; j < 5; j++){ add(pic[(i-5)*5 + j]); } } corner.setBackground(Color.cyan); } void startNewGame(){ int i; corner.token = turn == 1? 1 : -1; corner.setBackground(turn == 1 ? Color.cyan : Color.white); corner.repaint(); position.reset(); repaint(); } public void paint(Graphics g){ int i; for(i = 0; i< 25; i++){ pic[i].token = position.token[i]; pic[i].repaint(); } } public boolean action(Event e, Object o){ String statline = " "; // In state 0, we want a move indicated from any checkbox if(state == 0 && e.target instanceof Checkbox){ String s = ((Checkbox)(e.target)).getLabel(); statline = "Player " + (turn == 1 ? "1" : "2") + "'s move was " + s; int move = Integer.parseInt(s); position.push(move, turn); winner = position.wins(); // If player 1 moved and won, announce the win and keep score. if((turn == 1) && ((winner == 1) || (winner == 3))){ corner.token = 10; player1++; statline = statline + ". Player 1: " + player1 + ", Player 2: " + player2 + ". Click for new game."; corner.repaint(); state = 1; } // If player 2 wins any way, announce it and keep score. else if((turn == -1 && winner > 1) || (turn == 1 && winner == 2)){ corner.token = 11; turn = -1; player2++; statline = statline + ". Player 1: " + player1 + ", Player 2: " + player2 + ". Click for new game."; corner.repaint(); state = 1; } // Or maybe player 2 gave player 1 a win. else if( turn == -1 && winner == 1){ corner.token = 10; turn = 1; player1++; statline = statline + ". Player 1: " + player1 + ", Player 2: " + player2 + ". Click for new game."; corner.repaint(); state = 1; } // Change whose turn it is. turn = -turn; if(winner == 0)corner.token = turn; corner.setBackground(turn == 1 ? Color.cyan : Color.white); if(winner > 0)corner.setBackground(Color.pink); corner.repaint(); } // In state 1 we await a click anywhere to start a new game. else if(state == 1){ state = 0; startNewGame(); statline = "Player " + (turn == 1 ? "1" : "2") + ",s move."; } showStatus(statline); repaint(); return true; } public boolean mouseUp(Event e, int x, int y){ String statline; // In state 1 we start a new game if we get a mouse click. if(state == 1){ state = 0; startNewGame(); statline = "Player " + (turn == 1 ? "1" : "2") + ",s move."; showStatus(statline); repaint(); } return true; } } class TokenCanvas extends Canvas{ public int token; public void paint(Graphics g){ g.setColor(Color.black); if( token < 2){ g.drawLine(0,0,0,49); g.drawLine(49,0,0,0); } g.drawLine(0,49,49,49); g.drawLine(49,49,49,0); switch(token){ case 0: break; case 1: g.setColor(Color.cyan); g.fillOval(1,1,47,47); g.setColor(Color.black); g.drawString("Player 1",6,28); break; case -1: g.setColor(Color.white); g.fillOval(1,1,47,47); g.setColor(Color.black); g.drawString("Player 2",6,28); break; case 10: g.setColor(Color.black); g.drawString("Player 1 ", 1,20); g.drawString("wins!", 10, 40); break; case 11: g.setColor(Color.black); g.drawString("Player 2", 1,20); g.drawString("wins!", 10, 40); break; case 9: break; } } } class Board{ public int token[]; Board(){ token = new int[25]; int i; for(i = 0; i<24; i++){ token[i] = 0; } } Board(int a[]){ token = new int[25]; int i; for(i = 0; i<24; i++){ token[i] = a[i]; } } void reset(){ int i; for(i = 0; i<25; i++){ token[i] = 0; } } int diff(){ // Player 1's token count minus Player 2's token count. int htoc = 0; int i; for(i=0; i<24; i++){ htoc += token[i]; } return htoc; } void pushcol(int i, int newtok){ int j = i - 1; int k = j; // push into a column while(token[k] != 0 && k < 20) k +=5; for(; k > j; k -=5) token[k] = token[k-5]; token[j] = newtok; } void pushrow(int i, int newtok){ // Push a token into a row. int j = (i - 6)*5; int k = j; while(token[k] != 0 && k < j+4) k++; for(; k > j; k--) token[k] = token[k-1]; token[j] = newtok; } void push(int i, int newtok){ if(i < 6) pushcol(i,newtok); else pushrow(i,newtok); } int wins(){ // Return is 1 if the position is a win for the player 1, 2 if it is a win // for the player2, 3 if it is a win for both. boolean player1Wins = false, player2Wins = false; int insummary = 0; int row, sum, col, rowbase; // Check the rows. for(row = 0; row < 5; row++){ sum = 0; rowbase = row * 5; for(col = 0; col < 5; col++) sum += token[rowbase + col]; if(sum == 5)player1Wins = true; if(sum == -5)player2Wins = true; } // Check the columns for(col = 0; col < 5; col++){ sum = 0; for(row = 0; row < 5; row++) sum += token[5*row + col]; if(sum == 5)player1Wins = true; if(sum == -5)player2Wins = true; } // Major diagonal sum = 0; for(row = 0; row < 5; row++) sum += token[6*row]; if(sum == 5)player1Wins = true; if(sum == -5)player2Wins = true; // Minor diagonal sum = 0; for(row = 0; row < 5; row++) sum += token[4*row + 4]; if(sum == 5)player1Wins = true; if(sum == -5)player2Wins = true; if(player1Wins) insummary = 1; if(player2Wins) insummary += 2; return insummary; } }