Bataille/src/com/bernard/bataille/GameManager.java

160 lines
4.4 KiB
Java

package com.bernard.bataille;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
import java.util.Set;
import javax.imageio.ImageIO;
public class GameManager {
List<Queue<Integer>> cartes;
List<List<Integer>> defausses;
int alivePlayers;
Random shuffler;
public static void main(String[] args) {
Componentizer c = new GameManager(2,2).game();
List<Renderable> l = c.getRenderables();
BufferedImage bg = Componentizer.getBackgroundPictureImage();
try {
for (int i = 0; i < l.size(); i++) {
System.out.println(l.get(i));
if(l.get(i) instanceof Componentizer.CardsBackGetter)continue;
BufferedImage[] imgs = l.get(i).render(bg, 10);
System.out.println(Arrays.toString(imgs));
for (int j = 0; j < imgs.length; j++) {
ImageIO.write(imgs[j], "png", new File("/tmp/bataille/","img_"+i+"_"+j+".png"));
}
bg = imgs[imgs.length-1];
}
} catch (IOException e) {
e.printStackTrace();
}
}
public GameManager(int playerCount,int packetCount) {
this.alivePlayers = playerCount;
shuffler = new Random();
cartes = new ArrayList<>();
defausses = new ArrayList<>();
for (int i = 0; i < playerCount; i++) {
cartes.add(new LinkedList<>());
defausses.add(new LinkedList<>());
}
List<Integer> pioche = new ArrayList<>();
for(int i = 0;i<13*4;i++)pioche.addAll(Collections.nCopies(packetCount, i));
Collections.shuffle(pioche, shuffler);
for (int i = 0; i < pioche.size(); i++)
cartes.get(i%playerCount).add(pioche.get(i));
}
public Componentizer game() {
Componentizer componentizer = new Componentizer(alivePlayers,50,78);
while(alivePlayers > 1) {
int[] upTable = new int[alivePlayers];
List<Integer> winners = new ArrayList<>();
Set<Integer> pot = new HashSet<>();
Integer highest = 0;
boolean flipped = false;
while(winners.size() != 1) {// Tant que bataille
if(alivePlayers == 1) break;
//Fix dead people
fixCards();
for (int i = 0; i < alivePlayers; i++) {
if(cartes.get(i).isEmpty()) {
System.out.println("Le joueur "+i+" nous a quitté ... tout le monde s'en faut de toute façon !");
componentizer.playerDead(i);
alivePlayers--;
int[] oldUpTable = upTable;
upTable = new int[alivePlayers];
System.arraycopy(oldUpTable, 0, upTable, 0, i);
System.arraycopy(oldUpTable, i+1, upTable, i, alivePlayers-i);
cartes.remove(i);
defausses.remove(i);
}
}
highest = 0;
for (int i = 0; i < upTable.length; i++) {
upTable[i] = cartes.get(i).poll();
pot.add(upTable[i]);
highest = (highest > upTable[i]%13)?highest:upTable[i]%13;
}
System.out.println(alivePlayers+" joueurs jouent : "+cardArrayToString(upTable) + (flipped?" (caché)":""));
componentizer.turn(upTable, flipped);
winners.clear();
if(!flipped)
for (int i = 0; i < upTable.length; i++)
if(upTable[i]%13==highest)winners.add(i);
flipped = !flipped;
}
if(alivePlayers > 1) {
componentizer.endOfTurn();
System.out.println("GG au joueur "+winners.get(0));
defausses.get(winners.get(0)).addAll(pot);
}
}
return componentizer;
}
public void fixCards() {
for (int i = 0; i < alivePlayers; i++) {
if(cartes.get(i).isEmpty()) {
Collections.shuffle(defausses.get(i), shuffler);
cartes.get(i).addAll(defausses.get(i));
defausses.get(i).clear();
}
}
}
public static final String cardToString(int i) {
String color = "";
switch(i/13) {
case 0:color="";break;
case 1:color="";break;
case 2:color="";break;
case 3:color="";break;
}
switch(i%13) {
case 0 : return "2"+color;
case 1 : return "3"+color;
case 2 : return "4"+color;
case 3 : return "5"+color;
case 4 : return "6"+color;
case 5 : return "7"+color;
case 6 : return "8"+color;
case 7 : return "9"+color;
case 8 : return "X"+color;
case 9 : return "V"+color;
case 10 : return "D"+color;
case 11 : return "R"+color;
case 12 : return "A"+color;
}
return "";
}
public static final String cardArrayToString(int[] cards) {
String out = "";
for (int i : cards)
out+="|"+cardToString(i);
return out.substring(1);
}
}