/* Pente.java This code was written by Chris Scott and Max Jacobs May 6, 1996. */ import java.applet.*; import java.awt.*; import java.net.*; import java.util.*; public class Pente extends Applet implements Runnable { // MATRIX STATES final int BLUE = 1; final int RED_TAN = -1; final int EMPTY = 0; final int ERASED = 2; protected Image[] images; protected MediaTracker tracker; boolean gameOver; boolean thirdMove; // Width of the board
final int WIDTH = 570; // Directions private final int UPPER = 0; private final int LOWER = 1; private final int RIGHT = 2; private final int LEFT = 3; private final int UPPERLEFT = 4; private final int UPPERRIGHT = 5; private final int LOWERRIGHT = 6; private final int LOWERLEFT = 7; boolean direction[] = {false, false, false, false, false, false, false, false}; // Player Turn. public int turn; // count of captures public int paircount_blue; public int paircount_red_tan; public int f = 0, g = 0; //The board. 19 x 19 matrix protected int stone[][]; // Computer player PentePlayer computer; Frame p; //pop up window Panel P; // panel in window boolean gameOne = true; int randomNum, x; Button button; // reset button TextArea outputarea; // text area final int fieldsize = 35; // text area width in chars //---------------------------------------------------- // do this once when Pente is started public void layoutStuff(){ int x, y=1; outputarea = new TextArea(12, fieldsize); outputarea.setEditable(false); // this.setLayout(new BorderLayout()); p = new Frame("P E N T E W I N D O W"); p.setLayout(new BorderLayout(2,1)); P = new Panel(); P.setLayout(new FlowLayout()); button = new Button("Restart"); this.add(p); P.add(button); p.add("North",outputarea); p.add("South",P); p.pack(); p.show(); outputarea.appendText(" Welcome to Pente v1.0 \n ------------------------------ \n\n "); outputarea.appendText(" RULE: You must move outside the\n 2-block radius of the initial blue \n stone for your first move!\n\n"); // IMAGE STUFF tracker = new MediaTracker(this); images = new Image[5]; for (x=0; x < 5; x++){ images[x] = this.getImage(this.getDocumentBase(), y + ".gif"); tracker.addImage(images[x], y); y++; } } //---------------------------------------------------- public void init() { AudioClip intro; gameOver = false; thirdMove = false; paircount_blue = 0; paircount_red_tan = 0; if (gameOne) { layoutStuff(); gameOne = false; } stone = new int[19][19]; int q,r; for (q = 0; q < 19; q++) { for (r = 0; r < 19; r++) { stone[q][r] = ERASED; } } repaint(); stone[9][9] = BLUE; /* SET BLUE PIECE IN THE MIDDLE OF THE * BOARD; 4/29 */ randomNum = (int)(Math.random() * 8); red_tanFirstMove(randomNum); thirdMove = true; turn = BLUE; /* MAX CHANGED THIS FROM BLUE: 5/3 */ computer = new PentePlayer(this); intro = getAudioClip(getCodeBase(), "./play_a_g.au"); intro.play(); } //---------------------------------------------------- public void red_tanFirstMove(int randNum) { outputarea.appendText("\n Computer: 1st move \n\n"); if (randNum == 0) { stone[8][8] = RED_TAN; f=8; g=8; } else if (randNum == 1) { stone[9][8] = RED_TAN; f=9; g=8; } else if (randNum == 2) { stone[10][8] = RED_TAN; f=10; g=8; } else if (randNum == 3) { stone[8][9] = RED_TAN; f=8; g=9; } else if (randNum == 4) { stone[10][9] = RED_TAN; f=10; g=9; } else if (randNum == 5) { stone[8][10] = RED_TAN; f=8; g=10; } else if (randNum == 6) { stone[9][10] = RED_TAN; f=9; g=10; } else if (randNum == 7){ stone[10][10] = RED_TAN; f=10; g=10; } } //---------------------------------------------------- public void paint(Graphics g) { drawBoard(g); for(int i = 0; i < 19; i++){ for(int j = 0; j < 19; j++){ if (stone[i][j] != 0){ drawStone(i, j, g); if (stone[i][j] == 2){ stone[i][j] = 0; } } } } drawCountStone(g); } //---------------------------------------------------- // Draw the Pente board
public void drawBoard (Graphics g) { g.setColor(new Color(179, 179, 126)); //color = khaki setBackground(g.getColor()); g.setColor(Color.black); g.drawLine(0,0, 0,WIDTH); g.drawLine(WIDTH,0, WIDTH,WIDTH); g.drawLine(0,0, WIDTH,0); g.drawLine(0,WIDTH, WIDTH,WIDTH); g.setColor(Color.white); g.drawLine(0,1, 0,WIDTH+1); g.drawLine(WIDTH,1, WIDTH,WIDTH+1); g.drawLine(0,1, WIDTH,1); g.drawLine(0,WIDTH+1, WIDTH,WIDTH+1); for(int i = 1; i < 19; i++){ g.drawLine(WIDTH*i/19 + 1,0, WIDTH*i/19 + 1,WIDTH); g.drawLine(0,WIDTH*i/19 + 1, WIDTH,WIDTH*i/19 + 1); } g.setColor(Color.black); for(int i = 1; i < 19; i++){ g.drawLine(WIDTH*i/19,0, WIDTH*i/19,WIDTH); g.drawLine(0,WIDTH*i/19, WIDTH,WIDTH*i/19); } } //---------------------------------------------------- // Paint stones on the board.
public void drawStone(int column, int row, Graphics g) { if (stone[column][row] != 2){ if (!gameOver){ if (stone[column][row] == RED_TAN){ g.drawImage(images[1], column * WIDTH / 19 + 1, row * WIDTH/19 + 1, this); } else { g.drawImage(images[0], column * WIDTH / 19 + 1, row * WIDTH/19 + 1, this); } } else { // the game is over --> darken all of the pieces. if (stone[column][row] == RED_TAN){ g.drawImage(images[4], column * WIDTH / 19 + 1, row * WIDTH/19 + 1, this); } else { g.drawImage(images[3], column * WIDTH / 19 + 1, row * WIDTH/19 + 1, this); } } }else { g.setColor(new Color(179, 179, 126)); //color = khaki g.drawRect( column * WIDTH / 19 +2, row * WIDTH / 19 +2, 27, 27 ); g.fillRect( column * WIDTH / 19 +2, row * WIDTH / 19 +2, 27, 27 ); } } //---------------------------------------------------- //Display for the number of stones.
void drawCountStone(Graphics g){ g.setColor(Color.white); g.fill3DRect(WIDTH+15, 160, 60,20, false); g.fill3DRect(WIDTH+15, 410, 60,20, false); //30 g.drawImage(images[0], WIDTH + 5, 130, this); g.drawImage(images[1], WIDTH + 5, 380, this); g.setColor(Color.black); g.drawString("captures", WIDTH+35, 397); g.drawString("captures", WIDTH+35, 147); //--------------------------------------------------- if (paircount_blue == 1) { g.drawLine(WIDTH+27,165,WIDTH+25,175);} if (paircount_blue == 2) { g.drawLine(WIDTH+27,165,WIDTH+25,175); g.drawLine(WIDTH+37,165,WIDTH+35,175);} if (paircount_blue == 3) { g.drawLine(WIDTH+27,165,WIDTH+25,175); g.drawLine(WIDTH+37,165,WIDTH+35,175); g.drawLine(WIDTH+47,165,WIDTH+45,175);} if (paircount_blue == 4) { g.drawLine(WIDTH+27,165,WIDTH+25,175); g.drawLine(WIDTH+37,165,WIDTH+35,175); g.drawLine(WIDTH+47,165,WIDTH+45,175); g.drawLine(WIDTH+57,165,WIDTH+55,175);} if (paircount_blue > 4) { g.drawLine(WIDTH+27,165,WIDTH+25,175); g.drawLine(WIDTH+37,165,WIDTH+35,175); g.drawLine(WIDTH+47,165,WIDTH+45,175); g.drawLine(WIDTH+57,165,WIDTH+55,175); g.drawLine(WIDTH+21,166,WIDTH+64,174);} // Draw Computer Score if (paircount_red_tan == 1) { g.drawLine(WIDTH+27,415,WIDTH+25,425);} if (paircount_red_tan == 2) { g.drawLine(WIDTH+27,415,WIDTH+25,425); g.drawLine(WIDTH+37,415,WIDTH+35,425);} if (paircount_red_tan == 3) { g.drawLine(WIDTH+27,415,WIDTH+25,425); g.drawLine(WIDTH+37,415,WIDTH+35,425); g.drawLine(WIDTH+47,415,WIDTH+45,425);} if (paircount_red_tan == 4) { g.drawLine(WIDTH+27,415,WIDTH+25,425); g.drawLine(WIDTH+37,415,WIDTH+35,425); g.drawLine(WIDTH+47,415,WIDTH+45,425); g.drawLine(WIDTH+57,415,WIDTH+55,425);} if (paircount_red_tan > 4) { g.drawLine(WIDTH+27,415,WIDTH+25,425); g.drawLine(WIDTH+37,415,WIDTH+35,425); g.drawLine(WIDTH+47,415,WIDTH+45,425); g.drawLine(WIDTH+57,415,WIDTH+55,425); g.drawLine(WIDTH+21,416,WIDTH+64,424);} //--------------------------------------------------- } //---------------------------------------------------- //---------------------------------------------------- public boolean action(Event e, Object arg){ switch(e.id){ case Event.ACTION_EVENT: if (e.target instanceof Button) { String label = (String)arg; if (label.equals ("Restart")){ init(); } return true; } } return false; } //---------------------------------------------------- //---------------------------------------------------- public boolean mouseUp(Event e, int x, int y) { AudioClip winner; AudioClip loser; AudioClip capt; AudioClip mecapt; winner = getAudioClip(getCodeBase(), "./burns.au"); loser = getAudioClip(getCodeBase(), "./nelson.au"); capt = getAudioClip(getCodeBase(), "./doh.au"); mecapt = getAudioClip(getCodeBase(), "./woohoo.au"); int column = (int)(x / (WIDTH / 19)); int row = (int)(y / (WIDTH / 19)); int temp = paircount_red_tan; int temp2 = paircount_blue; if (turn == BLUE) { if (!gameOver && checkSlot(column, row, turn)==true) { outputarea.appendText("Your move: "+row+", "+column+"\n\n"); if(check_for_five(column, row, turn)){ gameOver=true; winner.play(); outputarea.appendText("Y O U W I N! \n You had 5-in-a-row!\n\n"); repaint(1); return true; } checkCapture(column, row, turn); if (temp2 < paircount_blue && paircount_blue < 5){ mecapt.play(); } if (paircount_blue > 4 || paircount_red_tan > 4) { gameOver=true; if (paircount_blue > 4) winner.play(); outputarea.appendText("Y O U W I N! \nYou captured 5 computer pairs!\n\n"); repaint(1); return true; } turn = - turn; repaint(1); } } if (turn == RED_TAN) { computer.makeMove(f,g); repaint(1); if (temp < paircount_red_tan && paircount_red_tan < 5){ capt.play(); } if (gameOver==true) loser.play(); } return true; } //---------------------------------------------------- //---------------------------------------------------- public boolean checkSlot(int column, int row, int turn) { if (stone[column][row]==EMPTY && !thirdMove) { stone[column][row] = turn; return true; } //IF IT'S THE THIRD MOVE, CANNOT PUT PIECE IN 2 SLOT RADIUS else if (stone[column][row]==EMPTY && ((column < 7 || column > 11) || (row < 7 || row > 11))) { stone[column][row] = turn; thirdMove = false; return true; } outputarea.appendText("You have made an illegal move.\n"); outputarea.appendText("Please choose another move.\n\n"); return false; } //---------------------------------------------------- public void update(Graphics g) { paint(g); } //---------------------------------------------------- //---------------------------------------------------- public void checkCapture(int col, int row, int color) { if (row > 2 && stone[col][row-1] == -color && stone[col][row-2] == -color && stone[col][row-3] == color) { changeCaptureCount(color); stone[col][row-1] = ERASED; stone[col][row-2] = ERASED; } if (row < 16 && stone[col][row+1] == -color && stone[col][row+2] == -color && stone[col][row+3] == color) { changeCaptureCount(color); stone[col][row+1] = ERASED; stone[col][row+2] = ERASED; } if (col > 2 && stone[col-1][row] == -color && stone[col-2][row] == -color && stone[col-3][row] == color) { changeCaptureCount(color); stone[col-1][row] = ERASED; stone[col-2][row] = ERASED; } if (col < 16 && stone[col+1][row] == -color && stone[col+2][row] == -color && stone[col+3][row] == color) { changeCaptureCount(color); stone[col+1][row] = ERASED; stone[col+2][row] = ERASED; } if (row > 2 && col > 2 && stone[col-1][row-1] == -color && stone[col-2][row-2] == -color && stone[col-3][row-3] == color) { changeCaptureCount(color); stone[col-1][row-1] = ERASED; stone[col-2][row-2] = ERASED; } if (row > 2 && col < 16 && stone[col+1][row-1] == -color && stone[col+2][row-2] == -color && stone[col+3][row-3] == color) { changeCaptureCount(color); stone[col+1][row-1] = ERASED; stone[col+2][row-2] = ERASED; } if (row < 16 && col > 2 && stone[col-1][row+1] == -color && stone[col-2][row+2] == -color && stone[col-3][row+3] == color) { changeCaptureCount(color); stone[col-1][row+1] = ERASED; stone[col-2][row+2] = ERASED; } if (row < 16 && col < 16 && stone[col+1][row+1] == -color && stone[col+2][row+2] == -color && stone[col+3][row+3] == color) { changeCaptureCount(color); stone[col+1][row+1] = ERASED; stone[col+2][row+2] = ERASED; } } //---------------------------------------------------- public void changeCaptureCount(int color) { if (color == BLUE) { paircount_blue++; }else{ paircount_red_tan++; } } //---------------------------------------------------- public boolean check_for_five(int column, int row, int color) { int dir; int tcounter; int counter; counter = 0; tcounter = 0; for (dir=0; dir<9; dir++) { if (dir == 1 && row > 3) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; if (dir == 2 && row > 3 && column < 15) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; if (dir == 3 && column < 15) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; if (dir == 4 && row <15 && column <15) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; if (dir == 5 && row < 15) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; if (dir == 6 && column > 3 && row < 15) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; if (dir == 7 && column > 3) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; if (dir == 8 && row >3 && column >3) counter = Traverse(column,row,dir,tcounter, color); if (counter > 4) return true; } return false; } public int Traverse(int column,int row,int dir,int tcounter, int color) { int i,temp; i=0; temp=0; /* CHECK UP, THEN CHECK DOWN */ if (dir == 1) { tcounter=0; for(i=row; tcounter < 5 && stone[column][i] == color; i--) tcounter++; temp = i+1; if (tcounter > 4) return tcounter; else { tcounter = 0; if (temp < 15) for(i=temp;tcounter < 5 && stone[column][i] == color;i++) tcounter++; } return tcounter; } /* CHECK UP-RIGHT, THEN CHECK LEFT-DOWN */ if (dir == 2) { tcounter=0; for(i=row;tcounter < 5 && stone[column][i] == color; i--) { tcounter++; column++; } temp = i+1; column--; if (tcounter > 4) return tcounter; else { tcounter = 0; if (column > 3 && temp < 15) for(i=temp;tcounter < 5 && stone[column][i] == color;i++) { tcounter++; column--; } } return tcounter; } /* CHECK RIGHT, THEN CHECK LEFT */ if (dir == 3) { tcounter=0; for(i=column; tcounter < 5 && stone[i][row] == color; i++) tcounter++; temp = i-1; if (tcounter > 4) return tcounter; else { tcounter = 0; if (temp > 3) for(i=temp;tcounter < 5 && stone[i][row] == color;i--) tcounter++; } return tcounter; } /* CHECK DOWN-RIGHT, THEN CHECK UP-LEFT */ if (dir == 4) { tcounter=0; for(i=row; tcounter < 5 && stone[column][i] == color; i++) { tcounter++; column++; } temp = i-1; column--; if (tcounter > 4) return tcounter; else { tcounter = 0; if(temp >3 && column >3) for(i=temp;tcounter < 5 && stone[column][i] == color;i--) { tcounter++; column--; } } return tcounter; } /* CHECK DOWN, THEN CHECK UP */ if (dir == 5) { tcounter=0; for(i=row;tcounter < 5 && stone[column][i] == color;i++) tcounter++; temp = i-1; if (tcounter > 4) return tcounter; else { tcounter = 0; if(temp >3) for(i=temp; tcounter < 5 && stone[column][i] == color; i--) tcounter++; } return tcounter; } /* CHECK UP-RIGHT, THEN CHECK LEFT-DOWN */ if (dir == 6) { tcounter=0; for(i=row;tcounter < 5 && stone[column][i] == color;i++) { tcounter++; column--; } temp = i-1; column++; if (tcounter > 4) return tcounter; else { tcounter = 0; if(temp > 3 && column < 15) for(i=temp; tcounter < 5 && stone[column][i] == color; i--) { tcounter++; column++; } } return tcounter; } /* CHECK RIGHT, THEN CHECK LEFT */ if (dir == 7) { tcounter=0; for(i=column;tcounter < 5 && stone[i][row] == color;i--) tcounter++; temp = i+1; if (tcounter > 4) return tcounter; else { tcounter = 0; if(temp < 15) for(i=temp; tcounter < 5 && stone[i][row] == color; i++) tcounter++; } return tcounter; } /* CHECK DOWN-RIGHT, THEN CHECK UP-LEFT */ if (dir == 8) { tcounter=0; for(i=row;tcounter < 5 && stone[column][i] == color;i--) { tcounter++; column--; } temp = i+1; column++; if (tcounter > 4) return tcounter; else { tcounter = 0; if(temp < 15 && column < 15) for(i=temp; tcounter < 5 && stone[column][i] == color; i++) { tcounter++; column++; } } return tcounter; } return tcounter; } //---------------------------------------------------- public void run() { try { Thread.sleep(500); } catch (Exception e); } //---------------------------------------------------- //Check whether a stone can be put there. // Return boolean true if you can put a stone there. public boolean checkStone(int column, int row, int color){ int i, j; for (i = 0; i < 8; i++){ direction[i] = false; } if(stone[column][row] != 0) { return false; } else { if (column > 1 && stone[column-1][row] == -color) { for (i = column-2; i > 0 && stone[i][row] == -color; i--); if (stone[i][row] == color) { direction[LEFT] = true; } } if (column < 17 && stone[column+1][row] == -color) { for (i = column+2; i < 18 && stone[i][row] == -color; i++); if (stone[i][row] == color) { direction[RIGHT] = true; } } if (row > 1 && stone[column][row-1] == -color) { for (j = row-2; j > 0 && stone[column][j] == -color; j--); if (stone[column][j] == color) { direction[UPPER] = true; } } if (row < 17 && stone[column][row+1] == -color) { for (j = row+2; j < 18 && stone[column][j] == -color; j++); if (stone[column][j] == color) { direction[LOWER] = true; } } if (column > 1 && row > 1 && stone[column-1][row-1] == -color) { for (i = column-2, j = row-2; i > 0 && j > 0 && stone[i][j] == -color; i--, j--); if (stone[i][j] == color) { direction[UPPERLEFT] = true; } } if (column < 17 && row > 1 && stone[column+1][row-1] == -color) { for (i = column+2, j = row-2; i < 18 && j > 0 && stone[i][j] == -color; i++, j--); if (stone[i][j] == color) { direction[UPPERRIGHT] = true; } } if (column < 17 && row < 17 && stone[column+1][row+1] == -color) { for (i = column+2, j = row+2; i < 18 && j < 18 && stone[i][j] == -color; i++, j++); if (stone[i][j] == color) { direction[LOWERRIGHT] = true; } } if (column > 1 && row < 17 && stone[column-1][row+1] == -color) { for (i = column-2, j = row+2; i > 0 && j < 18 && stone[i][j] == -color; i--, j++); if (stone[i][j] == color) { direction[LOWERLEFT] = true; } } for (i = 0; i < 8; i++){ if (direction[i] == true){ return true; } } return false; } } } //end of class Pente //---------------------------------------------------- //---------------------------------------------------- //---------------------------------------------------- class PentePlayer { Pente parent; final int BLUE = 1; final int RED_TAN = -1; final int EMPTY = 0; final int ERASED = 2; public int xxx, yyy; int i,j; PentePlayer(Pente parent){ this.parent = parent; } //---------------------------------------------------- void defaultComputerMove (int f, int g) { int i=0 ,j=0; int radius=1; do{ i = (int)(Math.random() * 5); if (i==1 || i==3|| i==4) { // computer makes random move based on position of first move //DIR 1 if(parent.stone[f][g-radius] == EMPTY) { i=f; j=g-radius; } //DIR 2 else if(parent.stone[f+radius][g-radius] == EMPTY) { i=f+radius; j=g-radius; } //DIR 3 else if(parent.stone[f+radius][g] == EMPTY) { i=f+radius; j=g; } //DIR 4 else if(parent.stone[f+radius][g+radius] == EMPTY) { i=f+radius; j=g+radius; } //DIR 5 else if(parent.stone[f][g+radius] == EMPTY) { i=f; j=g+radius; } //DIR 6 else if(parent.stone[f-radius][g+radius] == EMPTY) { i=f-radius; j=g+radius; } //DIR 7 else if(parent.stone[f-radius][g] == EMPTY) { i=f-radius; j=g; } //DIR 8 else if(parent.stone[f-radius][g-radius] == EMPTY) { i=f-radius; j=g-radius; } } //end of if else if (i==0 || i==2) { i = (int)(Math.random() * 19); j = (int)(Math.random() * 19); } //end of else radius++; }while (!parent.checkSlot(i, j, RED_TAN)); yyy = i; xxx = j; } //---------------------------------------------------- public void makeMove(int f, int g){ if (!Offense4()) // computer checks for outright win w/ 5-in-row if (parent.paircount_red_tan==4) { if (!CapturePair(BLUE)) // computer checks for win on 5th capture if (!Defense4()) // computer defends against 5-in-row if (!Defense3()) // computer defends against three piece combo if (!CapturePair(RED_TAN)) // computer defends against captures if (!CapturePair(BLUE)) // computer tries for captures defaultComputerMove(f, g); } else {//+++++++++++++++++++++++++++++++++++++++++++++++++++ if (!Defense4()) // computer defends against 5-in-row if (!Defense3()) // computer defends against three piece combo if (!CapturePair(RED_TAN)) // computer defends against captures if (!CapturePair(BLUE)) // computer tries for captures defaultComputerMove(f, g); } parent.outputarea.appendText("Computer move: "+xxx+", "+yyy+"\n\n"); if(parent.check_for_five(yyy, xxx, RED_TAN)){ parent.gameOver=true; parent.outputarea.appendText("Y O U L O S E!\n The computer had 5-in-a-row!\n\n"); parent.repaint(1); } parent.checkCapture(yyy, xxx, RED_TAN); if (parent.paircount_blue > 4 || parent.paircount_red_tan > 4) { parent.gameOver=true; parent.outputarea.appendText("Y O U L O S E!\n The computer had 5 captured pairs!\n\n"); parent.repaint(1); } parent.turn = BLUE; } //---------------------------------------------------- boolean EdgeCheck() { int col, row; // top edge row = 3; for (col=0; col < 19; col++){ if (parent.stone[col][row]==BLUE && parent.stone[col][row-1]==BLUE && parent.stone[col][row-2]==BLUE && parent.stone[col][row-3]==BLUE && (parent.stone[col][row+1]==EMPTY || parent.stone[col][row+1]==ERASED)){ parent.stone[col][row+1]=RED_TAN; yyy = col; xxx = row+1; return true; } } for (col=1; col < 16; col++){ if (parent.stone[col][row]==BLUE && parent.stone[col+1][row-1]==BLUE && parent.stone[col+2][row-2]==BLUE && parent.stone[col+3][row-3]==BLUE && (parent.stone[col-1][row+1]==EMPTY || parent.stone[col-1][row+1]==ERASED)){ parent.stone[col-1][row+1]=RED_TAN; yyy = col-1; xxx = row+1; return true; } } for (col=3; col < 18; col++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row-1]==BLUE && parent.stone[col-2][row-2]==BLUE && parent.stone[col-3][row-3]==BLUE && (parent.stone[col+1][row+1]==EMPTY || parent.stone[col+1][row+1]==ERASED)){ parent.stone[col+1][row+1]=RED_TAN; yyy = col+1; xxx = row+1; return true; } } // bottom edge row = 18; for (col=0; col < 19; col++){ if (parent.stone[col][row]==BLUE && parent.stone[col][row-1]==BLUE && parent.stone[col][row-2]==BLUE && parent.stone[col][row-3]==BLUE&& (parent.stone[col][row-4]==EMPTY || parent.stone[col][row-4]==ERASED)){ parent.stone[col][row-4]=RED_TAN; yyy = col; xxx = row-4; return true; } } for (col=0; col < 15; col++){ if (parent.stone[col][row]==BLUE && parent.stone[col+1][row-1]==BLUE && parent.stone[col+2][row-2]==BLUE && parent.stone[col+3][row-3]==BLUE&& (parent.stone[col+4][row-4]==EMPTY || parent.stone[col+4][row-4]==ERASED)){ parent.stone[col+4][row-4]=RED_TAN; yyy = col+4; xxx = row-4; return true; } } for (col=4; col < 19; col++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row-1]==BLUE && parent.stone[col-2][row-2]==BLUE && parent.stone[col-3][row-3]==BLUE&& (parent.stone[col-4][row-4]==EMPTY || parent.stone[col-4][row-4]==ERASED)){ parent.stone[col-4][row-4]=RED_TAN; yyy = col-4; xxx = row-4; return true; } } // left edge col = 3; for (row=0; row < 19; row++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row]==BLUE && parent.stone[col-2][row]==BLUE && parent.stone[col-3][row]==BLUE&& (parent.stone[col+1][row]==EMPTY || parent.stone[col+1][row]==ERASED)){ parent.stone[col+1][row]=RED_TAN; yyy = col+1; xxx = row; return true; } } for (row=1; row < 16; row++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row+1]==BLUE && parent.stone[col-2][row+2]==BLUE && parent.stone[col-3][row+3]==BLUE&& (parent.stone[col+1][row-1]==EMPTY || parent.stone[col+1][row-1]==ERASED)){ parent.stone[col+1][row-1]=RED_TAN; yyy = col+1; xxx = row-1; return true; } } for (row=3; row < 18; row++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row-1]==BLUE && parent.stone[col-2][row-2]==BLUE && parent.stone[col-3][row-3]==BLUE&& (parent.stone[col+1][row+1]==EMPTY || parent.stone[col+1][row+1]==ERASED)){ parent.stone[col+1][row+1]=RED_TAN; yyy = col+1; xxx = row+1; return true; } } // right edge col = 18; for (row=0; row < 19; row++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row]==BLUE && parent.stone[col-2][row]==BLUE && parent.stone[col-3][row]==BLUE&& (parent.stone[col-4][row]==EMPTY || parent.stone[col-4][row]==ERASED)){ parent.stone[col-4][row]=RED_TAN; yyy = col-4; xxx = row; return true; } } for (row=0; row < 15; row++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row+1]==BLUE && parent.stone[col-2][row+2]==BLUE && parent.stone[col-3][row+3]==BLUE&& (parent.stone[col-4][row+4]==EMPTY || parent.stone[col-4][row+4]==ERASED)){ parent.stone[col-4][row+4]=RED_TAN; yyy = col-4; xxx = row+4; return true; } } for (row=4; row < 19; row++){ if (parent.stone[col][row]==BLUE && parent.stone[col-1][row-1]==BLUE && parent.stone[col-2][row-2]==BLUE && parent.stone[col-3][row-3]==BLUE&& (parent.stone[col-4][row-4]==EMPTY || parent.stone[col-4][row-4]==ERASED)){ parent.stone[col-4][row-4]=RED_TAN; yyy = col-4; xxx = row-4; return true; } } return false; } //---------------------------------------------------- public boolean Defense4() { int dir, column, row; int counter = 0; if (EdgeCheck()) return true; for (column=0; column < 19; column++) for (row=0; row < 19; row++) if (parent.stone[column][row]==RED_TAN) for (dir=1; dir<9; dir++) { if (dir == 1 && row > 4) if (find4(column,row-1,dir,BLUE)){ parent.stone[column][row-5] = RED_TAN; yyy = column; xxx = row-5; return true; } if (dir == 5 && row < 14) if (find4(column,row+1,dir,BLUE)){ parent.stone[column][row+5] = RED_TAN; yyy = column; xxx = row+5; return true; } if (dir == 3 && column < 14) if (find4(column+1,row,dir,BLUE)){ parent.stone[column+5][row] = RED_TAN; yyy = column+5; xxx = row; return true; } if (dir == 7 && column > 4) if (find4(column-1,row,dir,BLUE)){ parent.stone[column-5][row] = RED_TAN; yyy = column-5; xxx = row; return true; } if (dir == 2 && row > 4 && column < 14) if (find4(column+1,row-1,dir,BLUE)){ parent.stone[column+5][row-5] = RED_TAN; yyy = column+5; xxx = row-5; return true; } if (dir == 4 && row < 14 && column < 14) if (find4(column+1,row+1,dir,BLUE)){ parent.stone[column+5][row+5] = RED_TAN; yyy = column+5; xxx = row+5; return true; } if (dir == 6 && column > 4 && row < 14) if (find4(column-1,row+1,dir,BLUE)){ parent.stone[column-5][row+5] = RED_TAN; yyy = column-5; xxx = row+5; return true; } if (dir == 8 && row > 4 && column > 4) if (find4(column-1,row-1,dir,BLUE)){ parent.stone[column-5][row-5] = RED_TAN; yyy = column-5; xxx = row-5; return true; } } return false; } //-------------------------------------------------- public boolean find4(int column, int row, int dir, int color) { int i=0, temp=0, Count=0; int j=0; /* CHECK UP*/ if (dir == 1) { for(i=row; Count < 4 && parent.stone[column][i] == color; i--) Count++; if (Count == 4 && (parent.stone[column][i] == EMPTY || parent.stone[column][i] == ERASED)) return true; return false; } /* CHECK DOWN*/ if (dir == 5) { for(i=row; Count < 4 && parent.stone[column][i] == color; i++) Count++; if (Count == 4 && (parent.stone[column][i] == EMPTY || parent.stone[column][i] == ERASED)) return true; return false; } /* CHECK RIGHT */ if (dir == 3) { for(i=column; Count < 4 && parent.stone[i][row] == color; i++) Count++; if (Count == 4 && (parent.stone[i][row] == EMPTY || parent.stone[i][row] == ERASED)) return true; return false; } /* CHECK LEFT */ if (dir == 7) { for(i=column; Count < 4 && parent.stone[i][row] == color; i--) Count++; if (Count == 4 && (parent.stone[i][row] == EMPTY || parent.stone[i][row] == ERASED)) return true; return false; } /* CHECK DOWN-AND-LEFT */ if (dir == 4) { j = row; for(i=column; Count < 4 && parent.stone[i][j] == color; i++){ j++; Count++; } if (Count == 4 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)) return true; return false; } /* CHECK UP-AND-RIGHT */ if (dir == 2) { j = row; for(i=column; Count < 4 && parent.stone[i][j] == color; i++){ j--; Count++; } if (Count == 4 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)) return true; return false; } /* CHECK DOWN-AND-LEFT */ if (dir == 6) { j = row; for(i=column; Count < 4 && parent.stone[i][j] == color; i--){ j++; Count++; } if (Count == 4 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)) return true; return false; } /* CHECK UP-AND-LEFT */ if (dir == 8) { j = row; for(i=column; Count < 4 && parent.stone[i][j] == color; i--){ j--; Count++; } if (Count == 4 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)) return true; return false; } return false; } //---------------------------------------------------- public boolean Defense3() { int dir, column, row; int counter = 0; for (column=0; column < 19; column++) for (row=0; row < 19; row++) if (parent.stone[column][row]==EMPTY) for (dir=1; dir<9; dir++) { if (dir == 1 && row > 4 && parent.stone[column][row-1]==BLUE) if (find3(column,row-2,dir)){ return true; } if (dir == 5 && row < 14 && parent.stone[column][row+1]==BLUE) if (find3(column,row+2,dir)){ return true; } if (dir == 3 && column < 14 && parent.stone[column+1][row]==BLUE) if (find3(column+2,row,dir)){ return true; } if (dir == 7 && column > 4 && parent.stone[column-1][row]==BLUE) if (find3(column-2,row,dir)){ return true; } if (dir == 2 && row > 4 && column < 14 && parent.stone[column+1][row-1]==BLUE) if (find3(column+2,row-2,dir)){ return true; } if (dir == 4 && row < 14 && column < 14 && parent.stone[column+1][row+1]==BLUE) if (find3(column+2,row+2,dir)){ return true; } if (dir == 6 && column > 4 && row < 14 && parent.stone[column-1][row+1]==BLUE) if (find3(column-2,row+2,dir)){ return true; } if (dir == 8 && row > 4 && column > 4 && parent.stone[column-1][row-1]==BLUE) if (find3(column-2,row-2,dir)){ return true; } } return false; } //-------------------------------------------------- public boolean find3(int column, int row, int dir) { int i=0, temp=0, Count=1; int j=0, spaceRow = 0, spaceCol = 0, spaceCount = 0; /* CHECK UP*/ if (dir == 1) { for(i=row; Count < 3 && (parent.stone[column][i] == BLUE || parent.stone[column][i] == EMPTY) && spaceCount < 2; i--) { if (parent.stone[column][i] == BLUE) Count++; else { spaceCount++; spaceCol = column; spaceRow = i; } } if (Count == 3 && (parent.stone[column][i] == EMPTY || parent.stone[column][i] == ERASED || parent.stone[column][i] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[column][i] == EMPTY || parent.stone[column][i] == ERASED)){ yyy = column; xxx = i; parent.stone[column][i] = RED_TAN; return true; } return false; } if (dir == 5) { for(i=row; Count < 3 && (parent.stone[column][i] == BLUE || parent.stone[column][i] == EMPTY) && spaceCount < 2; i++) { if (parent.stone[column][i] == BLUE) Count++; else { spaceCount++; spaceCol = column; spaceRow = i; } } if (Count == 3 && (parent.stone[column][i] == EMPTY || parent.stone[column][i] == ERASED || parent.stone[column][i] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[column][i] == EMPTY || parent.stone[column][i] == ERASED)){ yyy = column; xxx = i; parent.stone[column][i] = RED_TAN; return true; } return false; } if (dir == 3) { for(i=column; Count < 3 && (parent.stone[i][row] == BLUE || parent.stone[i][row] == EMPTY) && spaceCount < 2; i++) { if (parent.stone[i][row] == BLUE) Count++; else { spaceCount++; spaceCol = i; spaceRow = row; } } if (Count == 3 && (parent.stone[i][row] == EMPTY || parent.stone[i][row] == ERASED || parent.stone[i][row] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[i][row] == EMPTY || parent.stone[i][row] == ERASED)){ yyy = i; xxx = row; parent.stone[i][row] = RED_TAN; return true; } return false; } if (dir == 7) { for(i=column; Count < 3 && (parent.stone[i][row] == BLUE || parent.stone[i][row] == EMPTY) && spaceCount < 2; i--) { if (parent.stone[i][row] == BLUE) Count++; else { spaceCount++; spaceCol = i; spaceRow = row; } } if (Count == 3 && (parent.stone[i][row] == EMPTY || parent.stone[i][row] == ERASED || parent.stone[i][row] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[i][row] == EMPTY || parent.stone[i][row] == ERASED)){ yyy = i; xxx = row; parent.stone[i][row] = RED_TAN; return true; } return false; } if (dir == 2) { j = row; for(i=column; Count < 3 && (parent.stone[i][j] == BLUE || parent.stone[i][j] == EMPTY) && spaceCount < 2; i++) { if (parent.stone[i][j] == BLUE) Count++; else { spaceCount++; spaceCol = i; spaceRow = j; } j--; } if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED || parent.stone[i][j] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)){ yyy = i; xxx = j; parent.stone[i][j] = RED_TAN; return true; } return false; } if (dir == 4) { j = row; for(i=column; Count < 3 && (parent.stone[i][j] == BLUE || parent.stone[i][j] == EMPTY) && spaceCount < 2; i++) { if (parent.stone[i][j] == BLUE) Count++; else { spaceCount++; spaceCol = i; spaceRow = j; } j++; } if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED || parent.stone[i][j] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)){ yyy = i; xxx = j; parent.stone[i][j] = RED_TAN; return true; } return false; } if (dir == 6) { j = row; for(i=column; Count < 3 && (parent.stone[i][j] == BLUE || parent.stone[i][j] == EMPTY) && spaceCount < 2; i--) { if (parent.stone[i][j] == BLUE) Count++; else { spaceCount++; spaceCol = i; spaceRow = j; } j++; } if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED || parent.stone[i][j] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)){ yyy = i; xxx = j; parent.stone[i][j] = RED_TAN; return true; } return false; } if (dir == 8) { j = row; for(i=column; Count < 3 && (parent.stone[i][j] == BLUE || parent.stone[i][j] == EMPTY) && spaceCount < 2; i--) { if (parent.stone[i][j] == BLUE) Count++; else { spaceCount++; spaceCol = i; spaceRow = j; } j--; } if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED || parent.stone[i][j] == BLUE) && spaceCount == 1){ yyy = spaceCol; xxx = spaceRow; parent.stone[spaceCol][spaceRow] = RED_TAN; return true; } else if (Count == 3 && (parent.stone[i][j] == EMPTY || parent.stone[i][j] == ERASED)){ yyy = i; xxx = j; parent.stone[i][j] = RED_TAN; return true; } return false; } return false; } //---------------------------------------------------- public boolean CapturePair(int color) { /* This code serves the dual purpose of capturing pairs for the computer player as well as defending the computer player against captures. */ int dir, column, row; // int counter = 0; for (column=0; column < 19; column++) for (row=0; row < 19; row++) if (parent.stone[column][row]==-color) for (dir=1; dir<9; dir++) { if (dir == 1 && row > 2 && parent.stone[column][row-1] == color && parent.stone[column][row-2] == color && (parent.stone[column][row-3] == EMPTY || parent.stone[column][row-3] == ERASED)){ parent.stone[column][row-3] = RED_TAN; yyy = column; xxx = row-3; return true; } if (dir == 5 && row < 16 && parent.stone[column][row+1] == color && parent.stone[column][row+2] == color && (parent.stone[column][row+3] == EMPTY || parent.stone[column][row+3] == ERASED)){ parent.stone[column][row+3] = RED_TAN; yyy = column; xxx = row+3; return true; } if (dir == 3 && column < 16 && parent.stone[column+1][row] == color && parent.stone[column+2][row] == color && (parent.stone[column+3][row] == EMPTY || parent.stone[column+3][row] == ERASED)){ parent.stone[column+3][row] = RED_TAN; yyy = column+3; xxx = row; return true; } if (dir == 7 && column > 2 && parent.stone[column-1][row] == color && parent.stone[column-2][row] == color && (parent.stone[column-3][row] == EMPTY || parent.stone[column-3][row] == ERASED)){ parent.stone[column-3][row] = RED_TAN; yyy = column-3; xxx = row; return true; } if (dir == 4 && row < 16 && column < 16 && parent.stone[column+1][row+1] == color && parent.stone[column+2][row+2] == color && (parent.stone[column+3][row+3] == EMPTY || parent.stone[column+3][row+3] == ERASED)){ parent.stone[column+3][row+3] = RED_TAN; yyy = column+3; xxx = row+3; return true; } if (dir == 8 && row > 2 && column > 2 && parent.stone[column-1][row-1] == color && parent.stone[column-2][row-2] == color && (parent.stone[column-3][row-3] == EMPTY || parent.stone[column-3][row-3] == ERASED)){ parent.stone[column-3][row-3] = RED_TAN; yyy = column-3; xxx = row-3; return true; } if (dir == 2 && row > 2 && column < 16 && parent.stone[column+1][row-1] == color && parent.stone[column+2][row-2] == color && (parent.stone[column+3][row-3] == EMPTY || parent.stone[column+3][row-3] == ERASED)){ parent.stone[column+3][row-3] = RED_TAN; yyy = column+3; xxx = row-3; return true; } if (dir == 6 && row < 16 && column > 2 && parent.stone[column-1][row+1] == color && parent.stone[column-2][row+2] == color && (parent.stone[column-3][row+3] == EMPTY || parent.stone[column-3][row+3] == ERASED)){ parent.stone[column-3][row+3] = RED_TAN; yyy = column-3; xxx = row+3; return true; } } return false; } //---------------------------------------------------- public boolean Offense4() { int dir, column, row; int counter = 0; for (column=0; column < 19; column++) for (row=0; row < 19; row++) // if (parent.stone[column][row]==RED_TAN) for (dir=1; dir<9; dir++) { if (dir == 1 && row > 4) if (find4(column,row,dir,RED_TAN)){ parent.stone[column][row-4] = RED_TAN; yyy = column; xxx = row-4; return true; } if (dir == 5 && row < 14) if (find4(column,row,dir,RED_TAN)){ parent.stone[column][row+4] = RED_TAN; yyy = column; xxx = row+4; return true; } if (dir == 3 && column < 14) if (find4(column,row,dir,RED_TAN)){ parent.stone[column+4][row] = RED_TAN; yyy = column+4; xxx = row; return true; } if (dir == 7 && column > 4) if (find4(column,row,dir,RED_TAN)){ parent.stone[column-4][row] = RED_TAN; yyy = column-4; xxx = row; return true; } if (dir == 2 && row > 4 && column < 14) if (find4(column,row,dir,RED_TAN)){ parent.stone[column+4][row-4] = RED_TAN; yyy = column+4; xxx = row-4; return true; } if (dir == 4 && row < 14 && column < 14) if (find4(column,row,dir,RED_TAN)){ parent.stone[column+4][row+4] = RED_TAN; yyy = column+4; xxx = row+4; return true; } if (dir == 6 && column > 4 && row < 14) if (find4(column,row,dir,RED_TAN)){ parent.stone[column-4][row+4] = RED_TAN; yyy = column-4; xxx = row+4; return true; } if (dir == 8 && row > 4 && column > 4) if (find4(column,row,dir,RED_TAN)){ parent.stone[column-4][row-4] = RED_TAN; yyy = column-4; xxx = row-4; return true; } } return false; } } //end of class