Skip to content

Commit

Permalink
Merge pull request #10 from WROracer/UNO-4
Browse files Browse the repository at this point in the history
UNO-4 Add Game Logic
  • Loading branch information
WROracer committed Jun 2, 2023
2 parents 1bfcc7d + 97ef76b commit 7af65bf
Show file tree
Hide file tree
Showing 16 changed files with 244 additions and 94 deletions.
117 changes: 117 additions & 0 deletions src/main/java/de/wroracer/uno/engine/Game.java
@@ -0,0 +1,117 @@
package de.wroracer.uno.engine;

import de.wroracer.uno.engine.card.Card;
import de.wroracer.uno.engine.card.Deck;
import de.wroracer.uno.engine.card.Special;
import de.wroracer.uno.engine.error.CardNotPlayableError;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class Game {

private final Deck deck;
private final UUID id;
private final List<Player> players;
private final boolean clockwise = true;
private State state;
private Player currentTurn;

public Game() {
deck = new Deck();
players = new ArrayList<>();
id = UUID.randomUUID();

System.out.println(deck);
}


public Player addPlayer() {
Player p = new Player();
players.add(p);
return p;
}

public void removePlayer(Player p) {
players.remove(p);
}

public void startGame() {
this.state = State.IN_GAME;
for (int i = 0; i < players.size() * 7; i++) {
players.get(i % players.size()).getHand().add(deck.drawCard());
}
deck.discard(deck.drawCard());
this.currentTurn = players.get(0);
}

public Card getCurrentCard() {
return deck.currentCard();
}


public void play(Card card) {
if (card.canPlayedOn(deck.currentCard())) {
deck.discard(card);
currentTurn.getHand().remove(card);
if (card instanceof Special) {
((Special) card).execute(this);
}
nextTurn();
} else {
throw new CardNotPlayableError(card, deck.currentCard());
}
}

private void nextTurn() {
if (currentTurn.getHand().size() == 0) {
state = State.FINISHED;
return;
}
int index = players.indexOf(currentTurn);
if (clockwise) {
index++;
if (index >= players.size()) {
index = 0;
}
} else {
index--;
if (index < 0) {
index = players.size() - 1;
}
}
currentTurn = players.get(index);
}

public boolean canBePlay(Card card) {
return card.canPlayedOn(deck.currentCard());
}

public void draw(Player player) {
if (player == currentTurn) {
player.getHand().add(deck.drawCard());
nextTurn();
} else {
player.getHand().add(deck.drawCard());
}
}

public UUID getId() {
return id;
}

public Player getCurrentTurn() {
return currentTurn;
}

public List<Player> getPlayers() {
return players;
}

public enum State {
LOBBY,
IN_GAME,
FINISHED
}
}
@@ -1,16 +1,16 @@
package de.wroracer.unoengine;
package de.wroracer.uno.engine;

import de.wroracer.unoengine.card.Card;
import de.wroracer.uno.engine.card.Card;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class Player {
private List<Card> hand;
private UUID id;
private final List<Card> hand;
private final UUID id;

public Player(){
public Player() {
id = UUID.randomUUID();
hand = new ArrayList<>();
}
Expand Down
@@ -1,4 +1,4 @@
package de.wroracer.unoengine.card;
package de.wroracer.uno.engine.card;

public class Card {
protected Color color;
Expand Down
@@ -1,4 +1,4 @@
package de.wroracer.unoengine.card;
package de.wroracer.uno.engine.card;

import java.util.ArrayDeque;
import java.util.List;
Expand Down
@@ -1,14 +1,14 @@
package de.wroracer.unoengine.card;
package de.wroracer.uno.engine.card;

import de.wroracer.unoengine.Game;
import de.wroracer.uno.engine.Game;

public class DrawTwoCard extends Card implements Special {
public DrawTwoCard(Color color) {
super(color, Type.DRAW_TWO);
}

@Override
public void performAction(Game game) {
public void execute(Game game) {
//TODO
}
}
@@ -1,14 +1,14 @@
package de.wroracer.unoengine.card;
package de.wroracer.uno.engine.card;

import de.wroracer.unoengine.Game;
import de.wroracer.uno.engine.Game;

public class ReverseCard extends Card implements Special {
public ReverseCard(Color color) {
super(color, Type.REVERSE);
}

@Override
public void performAction(Game game) {
public void execute(Game game) {
//TODO
}
}
@@ -1,14 +1,14 @@
package de.wroracer.unoengine.card;
package de.wroracer.uno.engine.card;

import de.wroracer.unoengine.Game;
import de.wroracer.uno.engine.Game;

public class SkipCard extends Card implements Special {
public SkipCard(Color color) {
super(color, Type.SKIP);
}

@Override
public void performAction(Game game) {
public void execute(Game game) {
//TODO
}
}
9 changes: 9 additions & 0 deletions src/main/java/de/wroracer/uno/engine/card/Special.java
@@ -0,0 +1,9 @@
package de.wroracer.uno.engine.card;

import de.wroracer.uno.engine.Game;

public interface Special {

void execute(Game game);

}
@@ -1,4 +1,4 @@
package de.wroracer.unoengine.card;
package de.wroracer.uno.engine.card;

public class WildCard extends Card {
public WildCard() {
Expand Down
@@ -1,14 +1,14 @@
package de.wroracer.unoengine.card;
package de.wroracer.uno.engine.card;

import de.wroracer.unoengine.Game;
import de.wroracer.uno.engine.Game;

public class WildDrawFourCard extends WildCard implements Special {
public WildDrawFourCard() {
this.type = Type.WILDE_DRAW_FOUR;
}

@Override
public void performAction(Game game) {
public void execute(Game game) {
//TODO
}
}
@@ -0,0 +1,9 @@
package de.wroracer.uno.engine.error;

import de.wroracer.uno.engine.card.Card;

public class CardNotPlayableError extends UnoError {
public CardNotPlayableError(Card play, Card current) {
super("The card " + play + " is not playable on " + current);
}
}
16 changes: 16 additions & 0 deletions src/main/java/de/wroracer/uno/engine/error/UnoError.java
@@ -0,0 +1,16 @@
package de.wroracer.uno.engine.error;

public class UnoError extends Error {
public UnoError(String message) {
super(message);
}

public UnoError(String message, Throwable cause) {
super(message, cause);
}

public UnoError(Throwable cause) {
super(cause);
}

}
62 changes: 0 additions & 62 deletions src/main/java/de/wroracer/unoengine/Game.java

This file was deleted.

9 changes: 0 additions & 9 deletions src/main/java/de/wroracer/unoengine/card/Special.java

This file was deleted.

0 comments on commit 7af65bf

Please sign in to comment.