Jenkins
3 years ago
4 changed files with 316 additions and 0 deletions
-
60src/main/java/TicTacToe/Cell.java
-
45src/main/java/TicTacToe/Scoreboard.java
-
134src/main/java/TicTacToe/TicTacToeGame.java
-
77src/test/java/TicTacToe/TicTacToeGameTest.java
@ -0,0 +1,60 @@ |
|||||
|
package TicTacToe; |
||||
|
|
||||
|
import java.awt.Color; |
||||
|
import java.awt.Graphics; |
||||
|
import java.awt.Graphics2D; |
||||
|
import java.awt.event.ActionEvent; |
||||
|
import java.awt.event.ActionListener; |
||||
|
|
||||
|
import javax.swing.JButton; |
||||
|
|
||||
|
public class Cell extends JButton { |
||||
|
|
||||
|
public int playerID = 0; |
||||
|
private TicTacToeGame ttt; |
||||
|
|
||||
|
public Cell(TicTacToeGame _ttt) { |
||||
|
ttt = _ttt; |
||||
|
setBackground(new Color(0)); |
||||
|
|
||||
|
addActionListener(new ActionListener() { |
||||
|
@Override |
||||
|
public void actionPerformed(ActionEvent e) { |
||||
|
OnMouseClick(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
protected void OnMouseClick() { |
||||
|
if (playerID == 0) { |
||||
|
playerID = ttt.playerID; |
||||
|
setEnabled(false); |
||||
|
ttt.endTurn(); |
||||
|
repaint(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void paintComponent(Graphics g) { |
||||
|
super.paintComponent(g); |
||||
|
Graphics2D g2 = (Graphics2D) g; |
||||
|
g2.setPaint(Color.white); |
||||
|
switch (playerID) { |
||||
|
case 1: |
||||
|
g2.drawLine(5, 5, 90, 90); |
||||
|
g2.drawLine(90, 5, 5, 90); |
||||
|
break; |
||||
|
case 2: |
||||
|
g2.drawOval(5, 5, 90, 90); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
protected void reset() { |
||||
|
playerID = 0; |
||||
|
setEnabled(true); |
||||
|
repaint(); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,45 @@ |
|||||
|
package TicTacToe; |
||||
|
|
||||
|
import java.awt.Color; |
||||
|
|
||||
|
import javax.swing.JLabel; |
||||
|
|
||||
|
public class Scoreboard extends JLabel{ |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
public int[] playerPoints; |
||||
|
|
||||
|
public Scoreboard(int _playerCount) { |
||||
|
playerPoints = new int[_playerCount]; |
||||
|
setForeground(Color.white); |
||||
|
updateScores(); |
||||
|
} |
||||
|
|
||||
|
public void addPoint(int playerID) { |
||||
|
playerPoints[playerID]++; |
||||
|
updateScores(); |
||||
|
} |
||||
|
|
||||
|
public void subPoint(int playerID) { |
||||
|
playerPoints[playerID]--; |
||||
|
updateScores(); |
||||
|
} |
||||
|
|
||||
|
public void updateScores() { |
||||
|
int gamesPlayed = 0; |
||||
|
for(int i = 0; i < playerPoints.length; i++){ |
||||
|
if(i == 0) { |
||||
|
setText("Draws: " + playerPoints[0]); |
||||
|
} else { |
||||
|
setText(getText() + " Player " + i + ": " + playerPoints[i]); |
||||
|
} |
||||
|
|
||||
|
gamesPlayed += playerPoints[i]; |
||||
|
} |
||||
|
setText(getText() + " Games played: " + gamesPlayed); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,134 @@ |
|||||
|
package TicTacToe; |
||||
|
|
||||
|
import java.awt.Color; |
||||
|
import java.awt.Graphics; |
||||
|
import java.awt.Graphics2D; |
||||
|
import java.awt.geom.Line2D; |
||||
|
|
||||
|
import javax.swing.JFrame; |
||||
|
import javax.swing.JOptionPane; |
||||
|
import javax.swing.JPanel; |
||||
|
|
||||
|
|
||||
|
public class TicTacToeGame extends JPanel { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
private static final int width = 600, height = 600; |
||||
|
private static final int maxPlayers = 3; |
||||
|
private static final int playFieldSize = 9; |
||||
|
|
||||
|
public Cell[] field; |
||||
|
public int playerID = 1; |
||||
|
public int turns = 0; |
||||
|
public Scoreboard scoreboard; |
||||
|
|
||||
|
public TicTacToeGame() { |
||||
|
this.setSize(width, height); |
||||
|
setBackground(Color.black); |
||||
|
setLayout(null); |
||||
|
initField(); |
||||
|
initScoreboard(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
JFrame f = new JFrame(); |
||||
|
TicTacToeGame ttt = new TicTacToeGame(); |
||||
|
|
||||
|
f.add(ttt); |
||||
|
f.setSize(width,height); |
||||
|
f.setLayout(null); |
||||
|
f.setVisible(true); |
||||
|
} |
||||
|
|
||||
|
public void initField() { |
||||
|
field = new Cell[playFieldSize]; |
||||
|
|
||||
|
for(int i = 0; i < field.length; i++) { |
||||
|
field[i] = new Cell(this); |
||||
|
add(field[i]); |
||||
|
} |
||||
|
|
||||
|
for(int i = 0; i < field.length; i++) { |
||||
|
if(i < 3) { |
||||
|
field[i].setBounds(150 + i*100, 150 , 100, 100); |
||||
|
} else if (i < 6) { |
||||
|
field[i].setBounds(150 + i%3*100, 250 , 100, 100); |
||||
|
} else { |
||||
|
field[i].setBounds(150 + i%3*100, 350 , 100, 100); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void initScoreboard() { |
||||
|
scoreboard = new Scoreboard(maxPlayers); |
||||
|
scoreboard.setBounds(150, 100, 300, 50); |
||||
|
add(scoreboard); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void paintComponent(Graphics g) { |
||||
|
super.paintComponent(g); |
||||
|
Graphics2D g2 = (Graphics2D) g; |
||||
|
g2.setColor(Color.white); |
||||
|
|
||||
|
Line2D lin = new Line2D.Float(250, 150, 250, 450); |
||||
|
Line2D lin2 = new Line2D.Float(350, 150, 350, 450); |
||||
|
Line2D lin3 = new Line2D.Float(150, 250, 450, 250); |
||||
|
Line2D lin4 = new Line2D.Float(150, 350, 450, 350); |
||||
|
|
||||
|
g2.draw(lin); |
||||
|
g2.draw(lin2); |
||||
|
g2.draw(lin3); |
||||
|
g2.draw(lin4); |
||||
|
} |
||||
|
|
||||
|
public void endTurn() { |
||||
|
if(checkPlayfield() != 0) { |
||||
|
JOptionPane.showMessageDialog(getParent(),"Player: " + playerID + " Wins!"); |
||||
|
scoreboard.addPoint(playerID); |
||||
|
resetGame(); |
||||
|
} else { |
||||
|
turns++; |
||||
|
if(turns >= playFieldSize) { |
||||
|
JOptionPane.showMessageDialog(getParent(),"Draw!"); |
||||
|
scoreboard.addPoint(0); |
||||
|
resetGame(); |
||||
|
} |
||||
|
|
||||
|
playerID++; |
||||
|
if(playerID >= maxPlayers) { |
||||
|
playerID = 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
public int checkPlayfield() { |
||||
|
if ((field[0].playerID == playerID && field[1].playerID == playerID && field[2].playerID == playerID) |
||||
|
|| (field[0].playerID == playerID && field[3].playerID == playerID && field[6].playerID == playerID) |
||||
|
|| (field[8].playerID == playerID && field[5].playerID == playerID && field[2].playerID == playerID) |
||||
|
|| (field[8].playerID == playerID && field[7].playerID == playerID && field[6].playerID == playerID) |
||||
|
|| (field[0].playerID == playerID && field[4].playerID == playerID && field[8].playerID == playerID) |
||||
|
|| (field[0].playerID == playerID && field[4].playerID == playerID && field[8].playerID == playerID) |
||||
|
|| (field[2].playerID == playerID && field[4].playerID == playerID && field[6].playerID == playerID) |
||||
|
|| (field[3].playerID == playerID && field[4].playerID == playerID && field[5].playerID == playerID) |
||||
|
|| (field[1].playerID == playerID && field[4].playerID == playerID && field[7].playerID == playerID)) { |
||||
|
|
||||
|
return playerID; |
||||
|
} |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
public void resetGame() { |
||||
|
for (Cell c : field) { |
||||
|
c.reset(); |
||||
|
} |
||||
|
playerID = 1; |
||||
|
turns = 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,77 @@ |
|||||
|
package TicTacToe; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
import java.util.stream.Stream; |
||||
|
|
||||
|
import org.junit.jupiter.params.ParameterizedTest; |
||||
|
import org.junit.jupiter.params.provider.Arguments; |
||||
|
import org.junit.jupiter.params.provider.MethodSource; |
||||
|
|
||||
|
|
||||
|
class TicTacToeGameTest { |
||||
|
|
||||
|
@ParameterizedTest |
||||
|
@MethodSource("testFieldsWinning") |
||||
|
void testGameEndWin(int[] _field, int _winner) { |
||||
|
TicTacToeGame ttt = new TicTacToeGame(); |
||||
|
|
||||
|
for(int i = 0; i < ttt.field.length; i++) { |
||||
|
ttt.field[i].playerID = _field[i]; |
||||
|
} |
||||
|
ttt.playerID = _winner; |
||||
|
int realWinner = ttt.checkPlayfield(); |
||||
|
|
||||
|
assertEquals(_winner, realWinner); |
||||
|
} |
||||
|
|
||||
|
@ParameterizedTest |
||||
|
@MethodSource("testFieldsDraw") |
||||
|
void testGameEndDraw(int[] _field) { |
||||
|
TicTacToeGame ttt = new TicTacToeGame(); |
||||
|
|
||||
|
for(int i = 0; i < ttt.field.length; i++) { |
||||
|
ttt.field[i].playerID = _field[i]; |
||||
|
} |
||||
|
|
||||
|
int noWinner = ttt.checkPlayfield(); |
||||
|
|
||||
|
assertEquals(0, noWinner); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
private static Stream<Arguments> testFieldsWinning(){ |
||||
|
return Stream.of( |
||||
|
Arguments.of(new int[]{ 1,2,1, |
||||
|
2,2,2, |
||||
|
1,2,1}, 2), |
||||
|
Arguments.of(new int[]{ 2,1,2, |
||||
|
2,2,1, |
||||
|
1,1,1}, 1), |
||||
|
Arguments.of(new int[]{ 1,1,2, |
||||
|
1,2,2, |
||||
|
1,2,1}, 1), |
||||
|
Arguments.of(new int[]{ 2,1,1, |
||||
|
1,2,1, |
||||
|
1,1,2}, 2) |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
private static Stream<Arguments> testFieldsDraw(){ |
||||
|
return Stream.of( |
||||
|
Arguments.of(new int[]{ 2,1,1, |
||||
|
2,2,2, |
||||
|
1,2,1}), |
||||
|
Arguments.of(new int[]{ 2,1,2, |
||||
|
2,2,1, |
||||
|
1,2,1}), |
||||
|
Arguments.of(new int[]{ 2,1,2, |
||||
|
1,2,2, |
||||
|
1,2,1}), |
||||
|
Arguments.of(new int[]{ 2,1,1, |
||||
|
1,2,2, |
||||
|
2,1,1}) |
||||
|
); |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue