Premier commit - Inclusion dans le système git.
This commit is contained in:
commit
1ad27dca66
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
.settings/
|
||||||
|
bin/
|
||||||
|
|
||||||
87
src/com/bernard/bataille/Card.java
Normal file
87
src/com/bernard/bataille/Card.java
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
package com.bernard.bataille;
|
||||||
|
|
||||||
|
import static java.lang.Math.*;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
public class Card {
|
||||||
|
|
||||||
|
int type;// couleur*13 + genre
|
||||||
|
//12->as,11->roi,10->dame,...,0->2
|
||||||
|
//♠->0,♣->1,♥->2,♦->3
|
||||||
|
Pos pos;
|
||||||
|
public static File backCardImage = new File("/home/mysaa/Pictures/cardBackL.png");
|
||||||
|
public static File tempCardsPNGFolder = new File("/tmp/cardsPNG/");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public Card(int type, Pos pos) {
|
||||||
|
this.type = type;
|
||||||
|
this.pos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Card [type=" + type + ", pos=" + pos + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void draw(Graphics2D g,int wc, int hc) {
|
||||||
|
try {
|
||||||
|
AffineTransform t = g.getTransform();
|
||||||
|
System.out.println(pos);
|
||||||
|
Image img = ((pos.flip%(2*PI)>PI/2 && pos.flip%(2*PI)<3*PI/2)?ImageIO.read(cardImage()):ImageIO.read(backCardImage)).getScaledInstance(wc, hc, 0);
|
||||||
|
t.setToTranslation(pos.x, pos.y);
|
||||||
|
t.rotate(pos.a+PI/2);
|
||||||
|
t.scale(1,abs(cos(pos.flip)));
|
||||||
|
t.translate(-abs(cos(pos.flip))*wc/2, hc/2);//recentrage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
g.drawImage(img, t, null);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public File cardImage() {
|
||||||
|
//System.err.println(type);
|
||||||
|
return new File(tempCardsPNGFolder, "card"+type + ".png");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Pos{
|
||||||
|
public double x,y,a;
|
||||||
|
public double flip;//-pi/2 to pi/2 : endroit
|
||||||
|
// autre : envers
|
||||||
|
|
||||||
|
public Pos(double x, double y, double flip, double a) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.flip = flip;
|
||||||
|
this.a = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Pos [x=" + x + ", y=" + y + ", a=" + a + ", flip=" + flip + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
5
src/com/bernard/bataille/CardType.java
Normal file
5
src/com/bernard/bataille/CardType.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package com.bernard.bataille;
|
||||||
|
|
||||||
|
public enum CardType {
|
||||||
|
|
||||||
|
}
|
||||||
67
src/com/bernard/bataille/Component.java
Normal file
67
src/com/bernard/bataille/Component.java
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
package com.bernard.bataille;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.ColorModel;
|
||||||
|
import java.awt.image.WritableRaster;
|
||||||
|
|
||||||
|
import com.bernard.bataille.Card.Pos;
|
||||||
|
|
||||||
|
public class Component implements Renderable{
|
||||||
|
int[] cards;
|
||||||
|
Pos[] startPos;
|
||||||
|
Pos[] destinations;
|
||||||
|
boolean visible;
|
||||||
|
int wc,hc;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public Component(int[] cards, Pos[] startPos, Pos[] destinations, boolean visible, int wc, int hc) {
|
||||||
|
this.cards = cards;
|
||||||
|
this.startPos = startPos;
|
||||||
|
this.destinations = destinations;
|
||||||
|
this.visible = visible;
|
||||||
|
this.wc = wc;
|
||||||
|
this.hc = hc;
|
||||||
|
for (int i = 0; i < destinations.length; i++) {
|
||||||
|
if(visible) {
|
||||||
|
this.startPos[i].flip = 0.;
|
||||||
|
this.destinations[i].flip = Math.PI;
|
||||||
|
}else {
|
||||||
|
this.startPos[i].flip = 0.;
|
||||||
|
this.destinations[i].flip = 0.;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BufferedImage[] render(BufferedImage background,int frameCount) {
|
||||||
|
BufferedImage[] out = new BufferedImage[frameCount];
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < frameCount; i++) {
|
||||||
|
BufferedImage image = deepCopy(background);
|
||||||
|
Graphics2D g = image.createGraphics();
|
||||||
|
for (int j = 0; j < cards.length; j++) {
|
||||||
|
Pos actual = new Pos(
|
||||||
|
startPos[j].x + (destinations[j].x-startPos[j].x)*((double)i/(frameCount-1)),
|
||||||
|
startPos[j].y + (destinations[j].y-startPos[j].y)*((double)i/(frameCount-1)),
|
||||||
|
startPos[j].flip + (destinations[j].flip-startPos[j].flip)*((double)i/(frameCount-1)),
|
||||||
|
startPos[j].a + (destinations[j].a-startPos[j].a)*((double)i/(frameCount-1)));
|
||||||
|
Card c = new Card(cards[j], actual);
|
||||||
|
c.draw(g,wc,hc);
|
||||||
|
}
|
||||||
|
g.dispose();
|
||||||
|
out[i] = image;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BufferedImage deepCopy(BufferedImage bi) {
|
||||||
|
ColorModel cm = bi.getColorModel();
|
||||||
|
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
|
||||||
|
WritableRaster raster = bi.copyData(bi.getRaster().createCompatibleWritableRaster());
|
||||||
|
return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
224
src/com/bernard/bataille/Componentizer.java
Normal file
224
src/com/bernard/bataille/Componentizer.java
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
package com.bernard.bataille;
|
||||||
|
|
||||||
|
import static java.lang.Math.*;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import com.bernard.bataille.Card.Pos;
|
||||||
|
|
||||||
|
public class Componentizer {
|
||||||
|
|
||||||
|
|
||||||
|
private int playerCount;
|
||||||
|
volatile Pos[] startPoz, endPoz;
|
||||||
|
volatile Double[] directions;//angle 0-2pi, cercle trigo normal (gauche = 0, haut = pi/2)
|
||||||
|
public static File backgroundPicture = new File("/home/mysaa/Pictures/tapisPoker.jpg");
|
||||||
|
public static BufferedImage backgroundPictureImage;
|
||||||
|
private int imgw,imgh,wc,wh;
|
||||||
|
|
||||||
|
List<Renderable> renderables;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crée un generateur de composants graphiques
|
||||||
|
* @param playerCount le nombre de joueurs
|
||||||
|
* @param wc la largeur d'une carte
|
||||||
|
* @param wh la hauteur d'une carte
|
||||||
|
*/
|
||||||
|
public Componentizer(int playerCount, int wc, int wh) {
|
||||||
|
try {
|
||||||
|
backgroundPictureImage = ImageIO.read(backgroundPicture);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new IllegalStateException("Impossible de charger l'image de fond",e);
|
||||||
|
}
|
||||||
|
imgw = backgroundPictureImage.getWidth();
|
||||||
|
imgh = backgroundPictureImage.getHeight();
|
||||||
|
System.out.println(imgw+"---"+imgh);
|
||||||
|
this.playerCount = playerCount;
|
||||||
|
renderables = new ArrayList<>();
|
||||||
|
this.wc = wc;
|
||||||
|
this.wh = wh;
|
||||||
|
pozRechnen();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the renderables
|
||||||
|
*/
|
||||||
|
public List<Renderable> getRenderables() {
|
||||||
|
return renderables;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the backgroundPictureImage
|
||||||
|
*/
|
||||||
|
public static BufferedImage getBackgroundPictureImage() {
|
||||||
|
return backgroundPictureImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void pozRechnen() {
|
||||||
|
//TODO
|
||||||
|
directions = new Double[playerCount];
|
||||||
|
startPoz = new Pos[playerCount];
|
||||||
|
endPoz = new Pos[playerCount];
|
||||||
|
|
||||||
|
double alpha = atan((double)imgh/imgw);// L'angle limite du coin
|
||||||
|
for(int i = 0;i<playerCount;i++) {
|
||||||
|
directions[i] = (((double)i)/playerCount)*2*PI;
|
||||||
|
double t = 2*PI-directions[i];
|
||||||
|
double lradius = (wc*5)/cos(PI-(2*PI/playerCount));
|
||||||
|
endPoz[i] = new Pos((lradius+wh/2)*cos(t)+(imgw/2), (lradius+wh/2)*sin(t)+(imgh/2), Double.NaN, t);
|
||||||
|
System.out.println("(--_)"+t+"((("+endPoz[i]);
|
||||||
|
if(t>=2*PI-alpha || t<alpha) {//droite
|
||||||
|
startPoz[i] = new Pos(imgw, (imgh/2)+(imgw/2)*tan(t), Double.NaN, t);
|
||||||
|
}else if(t>=alpha && t < PI-alpha) {//haut
|
||||||
|
startPoz[i] = new Pos( (imgw/2)+(imgh/2)*tan(PI/2+t), imgh, Double.NaN, t);
|
||||||
|
}else if(t >= PI-alpha && t < PI+alpha) {//gauche
|
||||||
|
startPoz[i] = new Pos(0, (imgh/2)+(imgw/2)*tan(PI-t), Double.NaN, t);
|
||||||
|
}else {//bas
|
||||||
|
startPoz[i] = new Pos( (imgw/2)-(imgh/2)*tan(t-PI), imgh, Double.NaN, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
System.out.println(Arrays.toString(startPoz));
|
||||||
|
System.out.println(Arrays.toString(endPoz));
|
||||||
|
System.out.println("wow");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void turn(int[] cards, boolean hidden) {
|
||||||
|
renderables.add(new Component(cards, startPoz, endPoz, !hidden, wc, wh));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endOfTurn(){
|
||||||
|
renderables.add(new CardsBackGetter(startPoz, endPoz, directions));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void playerDead(int playerIndex) {
|
||||||
|
removeIndex(startPoz, playerIndex);
|
||||||
|
removeIndex(endPoz, playerIndex);
|
||||||
|
removeIndex(directions, playerIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T[] removeIndex(T[] in,int index){
|
||||||
|
|
||||||
|
Object[] result = new Object[in.length - 1];
|
||||||
|
System.arraycopy(in, 0, result, 0, index);
|
||||||
|
System.arraycopy(in, index + 1, result, index, in.length - index - 1);
|
||||||
|
return (T[]) result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CardsBackGetter implements Renderable{
|
||||||
|
|
||||||
|
volatile Pos[] startPoz, endPoz;
|
||||||
|
volatile Double[] directions;//angle 0-2pi, cercle trigo normal (gauche = 0, haut = pi/2)
|
||||||
|
|
||||||
|
public static final File handImage = new File("/home/mysaa/Pictures/manchette.png");
|
||||||
|
public static int wm,hm;
|
||||||
|
static {
|
||||||
|
BufferedImage bimg;
|
||||||
|
try {
|
||||||
|
bimg = ImageIO.read(handImage);
|
||||||
|
wm = bimg.getWidth();
|
||||||
|
hm = bimg.getHeight();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public CardsBackGetter(Pos[] startPoz, Pos[] endPoz, Double[] directions) {
|
||||||
|
super();
|
||||||
|
this.startPoz = startPoz;
|
||||||
|
this.endPoz = endPoz;
|
||||||
|
this.directions = directions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BufferedImage[] render(BufferedImage background, int frameCount) {
|
||||||
|
|
||||||
|
//TODO mains qui ramassent les cartes
|
||||||
|
// utiliser backgroundPicture
|
||||||
|
int fCountP1 = frameCount/2;
|
||||||
|
int fCountP2 = frameCount-fCountP1;
|
||||||
|
|
||||||
|
BufferedImage[] out = new BufferedImage[frameCount];
|
||||||
|
|
||||||
|
for (int i = 0; i < fCountP1; i++) {
|
||||||
|
BufferedImage image = Component.deepCopy(background);
|
||||||
|
Graphics2D g = image.createGraphics();
|
||||||
|
for (int j = 0; j < directions.length; j++) {
|
||||||
|
int x = (int) (startPoz[j].x + (endPoz[j].x-startPoz[j].x)*(i/(fCountP1-1))),
|
||||||
|
y = (int) (startPoz[j].y + (endPoz[j].y-startPoz[j].y)*(i/(fCountP1-1)));
|
||||||
|
|
||||||
|
try {
|
||||||
|
AffineTransform t = g.getTransform();
|
||||||
|
Image img = ImageIO.read(handImage);
|
||||||
|
t.setToTranslation(x, y);
|
||||||
|
t.rotate(directions[j]);
|
||||||
|
t.translate(wm/2, -hm/2);//recentrage
|
||||||
|
|
||||||
|
g.drawImage(img, t, null);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g.dispose();
|
||||||
|
out[i] = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < fCountP2; i++) {
|
||||||
|
BufferedImage image;
|
||||||
|
Graphics2D g;
|
||||||
|
try {
|
||||||
|
image = ImageIO.read(backgroundPicture);
|
||||||
|
g = image.createGraphics();
|
||||||
|
} catch (IOException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (int j = 0; j < directions.length; j++) {
|
||||||
|
int x = (int) (startPoz[j].x + (endPoz[j].x-startPoz[j].x)*(1-i/(fCountP2-1))),
|
||||||
|
y = (int) (startPoz[j].y + (endPoz[j].y-startPoz[j].y)*(1-i/(fCountP2-1)));
|
||||||
|
|
||||||
|
try {
|
||||||
|
AffineTransform t = g.getTransform();
|
||||||
|
Image img = ImageIO.read(handImage);
|
||||||
|
t.setToTranslation(x, y);
|
||||||
|
t.rotate(directions[j]);
|
||||||
|
t.translate(wm/2, -hm/2);//recentrage
|
||||||
|
|
||||||
|
g.drawImage(img, t, null);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g.dispose();
|
||||||
|
out[fCountP1 + i] = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
137
src/com/bernard/bataille/CrapoyamsMotor.java
Normal file
137
src/com/bernard/bataille/CrapoyamsMotor.java
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
package com.bernard.crapoyams;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CrapoyamsMotor {
|
||||||
|
public static int[][] tableDesGains = {
|
||||||
|
/*Paire*/{0,100,100,200,200,300},
|
||||||
|
/*2Paire*/{100,200,300,400,500,600},
|
||||||
|
/*Brelan*/{100,300,400,600,700,900},
|
||||||
|
/*Carré*/{200,400,600,800,1000,1200},
|
||||||
|
/*Full*/{200,500,700,1000,1200,1500},
|
||||||
|
/*Petite suite*/{5000},
|
||||||
|
/*Grande suite*/{25000},
|
||||||
|
/*Quinte*/{60000,60000,60000,60000,60000,60000}
|
||||||
|
};
|
||||||
|
public static int déFaces = 6;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int nombreLancers = 100000000;
|
||||||
|
int[] vals = new int[nombreLancers];
|
||||||
|
for (int n = 1;n < nombreLancers; n++) {
|
||||||
|
int[] dés = new int[] {
|
||||||
|
(int)(Math.random()*6+1),
|
||||||
|
(int)(Math.random()*6+1),
|
||||||
|
(int)(Math.random()*6+1),
|
||||||
|
(int)(Math.random()*6+1),
|
||||||
|
(int)(Math.random()*6+1)
|
||||||
|
};
|
||||||
|
vals[n] = gain(dés);
|
||||||
|
System.out.println(n+":"+Arrays.toString(dés)+"->"+vals[n]);
|
||||||
|
}
|
||||||
|
System.out.println("==>"+moyenne(vals));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int évaluer(int[] dés) {
|
||||||
|
double[] éspérances = new double[0b100000];
|
||||||
|
for (int i = 0; i < éspérances.length; i++)
|
||||||
|
éspérances[i] = espérance(dés, i);
|
||||||
|
List<Integer> bestMélanges = new ArrayList<>();
|
||||||
|
double perfection = highest(éspérances);
|
||||||
|
int pos;
|
||||||
|
while((pos = indexOf(éspérances, perfection)) != -1) {
|
||||||
|
éspérances[pos] = Double.NaN;
|
||||||
|
bestMélanges.add(pos);
|
||||||
|
}
|
||||||
|
System.out.println(perfection);
|
||||||
|
return bestMélanges.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double espérance(int[] dés, int mélange) {
|
||||||
|
if(mélange == 0b00000) {//Aucun mélange, donc l'espérance est le gain réel
|
||||||
|
double gain = gain(dés);
|
||||||
|
//System.out.println(Arrays.toString(dés)+" -> " + gain);
|
||||||
|
return gain;
|
||||||
|
}else {
|
||||||
|
int pos = 0;
|
||||||
|
while((mélange >> pos) % 2 == 0)pos++;
|
||||||
|
double[] espérances = new double[déFaces];
|
||||||
|
mélange -= 0b1 << pos;
|
||||||
|
int[] shuffledDés = Arrays.copyOf(dés, dés.length);
|
||||||
|
for (int tirage = 1; tirage < déFaces + 1; tirage++) {
|
||||||
|
shuffledDés[pos] = tirage;
|
||||||
|
espérances[tirage-1] = espérance(shuffledDés, mélange);
|
||||||
|
}
|
||||||
|
return moyenne(espérances);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int gain(int[] dés) {
|
||||||
|
Arrays.sort(dés);
|
||||||
|
int[] counts = new int[déFaces];
|
||||||
|
Arrays.fill(counts, 0);
|
||||||
|
for (int i : dés) counts[i-1]++;
|
||||||
|
int pos = -1;
|
||||||
|
|
||||||
|
/* Traitement des cas */
|
||||||
|
if(Arrays.equals(dés, new int[] {1,2,3,4,5}))
|
||||||
|
return tableDesGains[6][0];
|
||||||
|
else if(Arrays.equals(dés, new int[] {0,1,2,3,4}))
|
||||||
|
return tableDesGains[5][0];
|
||||||
|
else if((pos = lastIndexOf(counts,5)) != -1)
|
||||||
|
return tableDesGains[7][pos];
|
||||||
|
else if((pos = lastIndexOf(counts,4)) != -1)
|
||||||
|
return tableDesGains[3][pos];
|
||||||
|
else if((pos = lastIndexOf(counts,3)) != -1)
|
||||||
|
if(lastIndexOf(counts,2) == -1)
|
||||||
|
return tableDesGains[2][pos];
|
||||||
|
else
|
||||||
|
return tableDesGains[4][pos];
|
||||||
|
else if((pos = lastIndexOf(counts,2)) != -1)
|
||||||
|
if(indexOf(counts,2) == pos)
|
||||||
|
return tableDesGains[0][pos];
|
||||||
|
else
|
||||||
|
return tableDesGains[1][pos];
|
||||||
|
else
|
||||||
|
return 0;//Aucune combinaison
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final int lastIndexOf(int[] array, int element) {
|
||||||
|
for (int i = array.length -1; i >= 0; i--)
|
||||||
|
if(element == array[i])return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
public static final int indexOf(int[] array, int element) {
|
||||||
|
for (int i = 0; i < array.length; i++)
|
||||||
|
if(element == array[i])return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
public static final int indexOf(double[] array, double element) {
|
||||||
|
for (int i = 0; i < array.length; i++)
|
||||||
|
if(element == array[i])return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
public static final double moyenne(double[] valeurs) {
|
||||||
|
double moyenne = 0;
|
||||||
|
for (double d : valeurs)
|
||||||
|
moyenne += d;
|
||||||
|
return moyenne/((double)valeurs.length);
|
||||||
|
}
|
||||||
|
public static final double moyenne(int[] valeurs) {
|
||||||
|
double moyenne = 0;
|
||||||
|
for (double d : valeurs)
|
||||||
|
moyenne += d;
|
||||||
|
return moyenne/((double)valeurs.length);
|
||||||
|
}
|
||||||
|
public static final double highest(double[] valeurs) {
|
||||||
|
if(valeurs.length == 0)throw new IllegalArgumentException("valeurs ne doit pas etre vide !");
|
||||||
|
double current = valeurs[0];
|
||||||
|
for (double d : valeurs)
|
||||||
|
if(d > current)
|
||||||
|
current = d;
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
159
src/com/bernard/bataille/GameManager.java
Normal file
159
src/com/bernard/bataille/GameManager.java
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
7
src/com/bernard/bataille/Renderable.java
Normal file
7
src/com/bernard/bataille/Renderable.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package com.bernard.bataille;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
public interface Renderable {
|
||||||
|
public BufferedImage[] render(BufferedImage background,int frameCount);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user