Created
January 27, 2015 13:25
-
-
Save CSchoel/1c407c7cb5f365620212 to your computer and use it in GitHub Desktop.
Connect four game
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Autor: Christopher Schölzel, Nadja Krümmel | |
int TYPE_EMPTY = 0; | |
int TYPE_BLUE = 1; | |
int TYPE_RED = -1; | |
class ConnectFour { | |
float brickWidth = 50; | |
float margin = 50; | |
int[][] field; | |
// 0 = leer, +1 = blau, -1 = rot | |
ConnectFour(int cols, int rows) { | |
field = new int[cols][rows]; | |
} | |
int findWinner() { | |
int rowType = TYPE_BLUE; | |
int rowCount = 0; | |
for (int row = 0; row < field[0].length; row++) { | |
for (int col = 0; col < field.length; col++) { | |
int type = field[col][row]; | |
if (type == TYPE_EMPTY) continue; | |
if (isSeries(col, row, 0, 1) || isSeries(col, row, 1, 0) | |
|| isSeries(col, row, 1, 1) || isSeries(col, row, -1, 1)) | |
return type; | |
} | |
} | |
return TYPE_EMPTY; | |
} | |
boolean isSeries(int col, int row, int dc, int dr) { | |
int type = field[col][row]; | |
if (!isLegalIndex(col+3*dc, row+3*dr)) return false; | |
for (int i = 1; i < 4; i++) { | |
if (field[col+i*dc][row+i*dr] != type) return false; | |
} | |
return true; | |
} | |
boolean isLegalIndex(int col, int row) { | |
return col >= 0 && col < field.length && row >= 0 && row < field[col].length; | |
} | |
int count(int type) { | |
int value = 0; | |
for (int i = 0; i < field.length; i++) { | |
for (int j = 0; j< field[0].length; j++) { | |
if (field[i][j] == type) { | |
value++; | |
} | |
} | |
} | |
return value; | |
} | |
void display() { | |
int rows = field[0].length; | |
for (int i = 0; i < field.length; i++) { | |
for (int j = 0; j< field[0].length; j++) { | |
if (field[i][j] == 0) fill(255); | |
if (field[i][j] == 1) fill(0, 0, 255); | |
if (field[i][j] == -1) fill(255, 0, 0); | |
ellipse( | |
margin+(i+0.5)*brickWidth, | |
margin+(rows-j-0.5)*brickWidth, | |
brickWidth-2, | |
brickWidth-2 | |
); | |
} | |
} | |
} | |
void placeBrick(int col, int brick) { | |
int i = 0; | |
boolean notPlaced = true; | |
while (notPlaced && i < field[col].length) { | |
if (field[col][i] == 0) { | |
field[col][i] = brick; | |
notPlaced = false; | |
return; | |
} | |
i++; | |
} | |
} | |
int col(float x) { | |
return (int)((x-margin)/brickWidth); | |
} | |
int row(float y) { | |
return (int)((y-margin)/brickWidth); | |
} | |
int getColumns() { | |
return field.length; | |
} | |
} | |
ConnectFour cf; | |
int currentPlayer = TYPE_BLUE; | |
void setup() { | |
size(500, 400); | |
cf = new ConnectFour(7, 6); | |
} | |
void draw() { | |
background(0); | |
cf.display(); | |
} | |
void gameOver(int playerWon) { | |
draw(); | |
textAlign(CENTER); | |
textSize(30); | |
fill(255,0,255); | |
if(playerWon == TYPE_EMPTY) { | |
text("Gleichstand!",width/2.0,height/2.0); | |
} else if (playerWon == TYPE_BLUE) { | |
text("Blau gewinnt!",width/2.0,height/2.0); | |
} else if (playerWon == TYPE_RED) { | |
text("Rot gewinnt!",width/2.0,height/2.0); | |
} | |
noLoop(); | |
} | |
void mousePressed() { | |
int col = cf.col(mouseX); | |
if (col < 0 || col >= cf.getColumns()) return; | |
cf.placeBrick(cf.col(mouseX),currentPlayer); | |
currentPlayer *= -1; | |
int winner = cf.findWinner(); | |
if(cf.count(TYPE_EMPTY) == 0) gameOver(TYPE_EMPTY); | |
else if (winner != TYPE_EMPTY) gameOver(winner); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment