package com.tacoid.pweek.logic; public class IAEasy implements IA { float sum = 0f; private GameLogic logic; private int potentiel; private Solution dyn[][]; public IAEasy(GameLogic logic) { this.logic = logic; } private class Solution { int potentiel; int m; public Solution(int potentiel, int m) { this.potentiel = potentiel; this.m = m; } } private Solution choice(int n, GameLogic cl, int m) { Coord p1 = cl.getPiece().coords[0]; Coord p2 = cl.getPiece().coords[1]; int dl = (int)(p1.l - p2.l); int dc = (int)(p1.c - p2.c); int r; if (dl == 0) { if (dc == 1) { r = 0; } else { r = 1; } } else if (dl == 1) { r = 2; } else { r = 3; } if (dyn[(int)p1.l * GameLogic.COLUMNS + (int)p1.c][r] != null) { // Si on a déjà été dans cette position en moins de mouvement if (dyn[(int)p1.l * GameLogic.COLUMNS + (int)p1.c][r].m <= m) { // Alors c'est naze. return new Solution(-1, 0); } } if (n == 0) { int diff = 0; cl.poseEtGravity(); for (Coord c : cl.getPiece().coords) { int count = floodfill((int)c.l, (int)c.c, c.coul, cl); if (count > 2) { diff = -(count - 1) * (count - 1) + count * count; } else if (count == 2) { diff = count * count; } } dyn[(int)p1.l * GameLogic.COLUMNS + (int)p1.c][r] = new Solution(potentiel + diff, m); return dyn[(int)p1.l * GameLogic.COLUMNS + (int)p1.c][r]; } else { GameLogic[] logics = new GameLogic[5]; logics[0] = new GameLogic(cl,true); logics[1] = new GameLogic(cl,true); logics[1].rotateLeft(); logics[2] = new GameLogic(cl,true); logics[2].rotateRight(); logics[3] = new GameLogic(cl,true); logics[3].moveLeft(); logics[4] = new GameLogic(cl,true); logics[4].moveRight(); Solution scoreMax = choice(0, logics[0], m); int max = 0; for (int i = 1; i < 5; i++) { Solution score = choice(n - 1, logics[i], m + 1); if (score.potentiel > scoreMax.potentiel || (score.potentiel == scoreMax.potentiel && score.m < scoreMax.m)) { max = i; scoreMax = score; } } if (n == 4) { switch (max) { case 0: if (logic.getPiece().coords[0].l < 10) { logic.dropPiece(); } break; case 1: logic.rotateLeft(); break; case 2: logic.rotateRight(); break; case 3: logic.moveLeft(); break; case 4: logic.moveRight(); break; } } dyn[(int)p1.l * GameLogic.COLUMNS + (int)p1.c][r] = scoreMax; return dyn[(int)p1.l * GameLogic.COLUMNS + (int)p1.c][r]; } } private int floodfill(int l, int c, int coul, GameLogic logic) { if (l < 0 || c < 0 || l >= GameLogic.LINES || c >= GameLogic.COLUMNS || logic.grid[l][c] != coul) { return 0; } logic.grid[l][c] = -1; return 1 + floodfill(l + 1, c, coul, logic) + floodfill(l - 1, c, coul, logic) + floodfill(l, c + 1, coul, logic) + floodfill(l, c - 1, coul, logic); } public void choice1() { logic.gridFF = new boolean[GameLogic.LINES][GameLogic.COLUMNS]; int[][] grid = logic.getGrid(); potentiel = 0; for (int l = 0; l < GameLogic.LINES; l++) { for (int c = 0; c < GameLogic.COLUMNS; c++) { if (grid[l][c] > 0 && !logic.gridFF[l][c]) { int count = logic.floodfill(l, c, grid[l][c], null); if (count > 1) { potentiel += count * count; } } } } dyn = new Solution[(GameLogic.LINES + 1) * GameLogic.COLUMNS][4]; choice(4, logic, 0); } public void update(float delta) { if (logic.getState() == State.MOVE && !logic.paused) { sum += delta; if (sum > 0.2) { sum = 0; choice1(); } } } }