Compare commits
117 Commits
a1e36ccbc7
...
delete_whi
Author | SHA1 | Date | |
---|---|---|---|
ecdff3cbd0 | |||
fbd214bc23 | |||
d37059b7de | |||
3d4730cfc0 | |||
518a37ba8c | |||
aecbf2cb9a | |||
178d076883 | |||
16d2c89e95 | |||
3dd1b6b059
|
|||
3e4b4d257e | |||
d389b22f2d | |||
9fabc8128b | |||
def25d9e38
|
|||
e424cdca4e
|
|||
201eb3ec10
|
|||
cb54e753d7
|
|||
0f1ecc753b
|
|||
334e0ad99b
|
|||
a35d823ec4
|
|||
4f821b44bc
|
|||
9aa09f8fbd
|
|||
90d6d47cc8
|
|||
8ec5a622d8
|
|||
e7c7065a8d
|
|||
a472df26ed | |||
24730a1362
|
|||
af3489d078 | |||
7320fea2f9 | |||
60bf1fa5d0
|
|||
7c37c46830
|
|||
6280b39c20
|
|||
592780bb73
|
|||
e3d28b21b4
|
|||
7b6291bda9
|
|||
382af6b541
|
|||
15e1745ad1
|
|||
4583bbd7e6
|
|||
c68e680768
|
|||
a043cb487f | |||
1af5db700e | |||
752c722b0c | |||
a3ad448fba | |||
a7a3e8b36e
|
|||
8110a93910 | |||
53972cd1ef
|
|||
de146b216d
|
|||
f1519ba40c | |||
72dcbcbf4f | |||
a43e3b150a | |||
7ac860850c | |||
a076ca12cb | |||
dc5da4956a | |||
c6df656381 | |||
692e22b5b9 | |||
f21c036b1c | |||
b4b89bcd86 | |||
644af67a55 | |||
ee0350c251 | |||
d455b7f450 | |||
02b4ab8a35 | |||
24a7a73f36 | |||
ce99e1faf9 | |||
075bdd9338 | |||
25a6782f3c | |||
0baef08205
|
|||
f71675dd21
|
|||
9711be3665 | |||
8749c23333 | |||
ac368a6d19 | |||
00f62097f1 | |||
592b179a19 | |||
eeae13b339 | |||
b41714c27f | |||
7527309d79 | |||
0a72e6e047 | |||
3b6234f4a1 | |||
dd01bc96cb | |||
e7d82b3076 | |||
bc2feee03c | |||
e4478c878c
|
|||
1ef428962f | |||
c585c54da2 | |||
df457b830a | |||
bd41d24a36 | |||
24df4e376c | |||
4854fef677
|
|||
71beb69c84
|
|||
1740ad2e13 | |||
04fd342a57 | |||
dfc6056767 | |||
1837d976aa | |||
f5bd36f4e0 | |||
716e874b7e | |||
3ab6ff1bfa | |||
f08ed98897 | |||
aafb5f5c66 | |||
bbfc5687d9 | |||
922497573b | |||
e55b17fcd8 | |||
08c4a08a01 | |||
207195c0c8 | |||
ec7692f8d3 | |||
5c4dc5c370 | |||
bc05260ba7 | |||
36c79daa4e | |||
5a45ab43ba | |||
c70e30b629 | |||
a55dcc678a | |||
d5b8da4f21 | |||
2ef6bdb9ed | |||
2d9a4d2aec | |||
acd786744b | |||
8d88f01c9d
|
|||
cc11b0d882 | |||
3b6c21f4b4 | |||
4608208b7f | |||
29b73a31b3 |
49
.drone.yml
Normal file
49
.drone.yml
Normal file
@ -0,0 +1,49 @@
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: Check_Requirement
|
||||
|
||||
steps:
|
||||
- name: base_check
|
||||
image: gradle:jdk11-alpine
|
||||
commands:
|
||||
- ./gradlew clean
|
||||
- ./gradlew build
|
||||
- ./gradlew test
|
||||
|
||||
- name: syntax_check
|
||||
image: gradle:jdk11-alpine
|
||||
commands:
|
||||
- ./gradlew check
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: master_build
|
||||
|
||||
steps:
|
||||
- name: make_archive
|
||||
image: alpine:latest
|
||||
volumes:
|
||||
- name: archives
|
||||
path: /build
|
||||
commands:
|
||||
- apk add --no-cache git
|
||||
- tar cvzf /build/$(git log -n 1 --format="%h")_school_archive.gz.tar app/ gradle/ gradlew/ gradlew.bat README.md settings.gradle
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
event:
|
||||
exclude:
|
||||
- pull_request
|
||||
volumes:
|
||||
- name: archives
|
||||
host:
|
||||
path: /srv/drone/school_project/archive/
|
||||
depends_on:
|
||||
- Check_Requirement
|
||||
---
|
||||
kind: signature
|
||||
hmac: 6b154c74ec624ce2d5867386bb7a6ee51cae9153457a8ce15f53e54546ccbc0e
|
||||
|
||||
...
|
@ -3,4 +3,13 @@
|
||||
# Rapports
|
||||
|
||||
- [Première entrevue](./rapports/130223.md)
|
||||
- [Deuxième entrevue](./rapports/200223.md)
|
||||
- [Deuxième entrevue](./rapports/200223.md)
|
||||
- [Troisième entrevue](./rapports/230323.md)
|
||||
|
||||
# Specification
|
||||
|
||||
- [File Parser](./spec/FileParser.md)
|
||||
|
||||
# Histoire
|
||||
|
||||
- [Plot Story](./histoire/plot_story.md)
|
69
JournalDeBord/src/histoire/plot_story.md
Normal file
69
JournalDeBord/src/histoire/plot_story.md
Normal file
@ -0,0 +1,69 @@
|
||||
|
||||
# Intro histoire
|
||||
|
||||
|
||||
Après notre premier quadri à l unif assez compliqué entre calculus, inégalités et physique
|
||||
et la perte de temps dans les transports en commun.
|
||||
Je décide de enfin me prendre un kot à Mons pour réussir ce quadri en beauté
|
||||
|
||||
# Day 1
|
||||
## intro à jouer
|
||||
|
||||
Faire les cartons de différentes cours
|
||||
Calculus --> big carton( encombrant pas possible de tourner)
|
||||
Algo 1 --> pc portable (fragile)
|
||||
Math elem carton avec une inégalité dessus qui change dès qu on tourne la pièce)
|
||||
Objet perso à chacun
|
||||
1. Mat --> poids de sport
|
||||
2. Eddy --> balle de basket,...
|
||||
3. Anthony --> tenue de scout
|
||||
|
||||
## Déménagement histoire :
|
||||
|
||||
Arrivé à l appartement :
|
||||
La pièce est assez petite mais avec assez d'imagination je serai tout mettre
|
||||
(j'aurais aimé déjà être en master pour faire une AI qui me aiderai à ranger tous
|
||||
ça peut-etre que chatgpt pourrait m aider..)
|
||||
|
||||
## Déménagement à jouer :
|
||||
|
||||
Galère à tout rangé --> (interaction avec le jouer)
|
||||
--> en repensant c est peut-être pour ça que l ancien propriétaire et partie et que le prix était de si bas
|
||||
Notion de jour donc cours unifs -> pas le temps de ranger dans le WK on doit terminer en semaine
|
||||
|
||||
# Day 2
|
||||
|
||||
## continuité histoire
|
||||
|
||||
Après un long mardi terminer par le cours d algo 2 il est
|
||||
tant de ranger le dernier carton dans la buanderie après une 10 minute de marche
|
||||
j arrive à mon kot mais qlq chose à changer, la couleur de la porte n est plus la même.
|
||||
De plus il faut tirer et plus poussé pour l ouvrir.
|
||||
Après être rentré tous les cartons sont refait et l ordre des pièces à changer
|
||||
|
||||
## à jouer
|
||||
|
||||
----> refaire des niveaux différents pour ranger les cartons
|
||||
|
||||
(intercation pendant le jeu)
|
||||
--> Hormis la fatigue qui me gagne et se sentiment étrange par rapport à ce kot
|
||||
je defais encore une fois tous mes cartons
|
||||
(je ne sais pas comment mais tout mes exo en calculus ont été corrigées les cartons sont tous remplie de rouge) Après avoir défait le dernier carton dans le bureau je remarque une Trap mystérieuse mais il est déjà 23h et demain j'ai une longue journée qui m'attend (8-10 et 15h45-17h45)
|
||||
|
||||
# Day 3 histoire
|
||||
La nuit passe --> rien ne bouge
|
||||
(Level bonus)
|
||||
(choix entre faire le petit dej ou allez directement en cours)
|
||||
|
||||
## Si choix petit dej
|
||||
|
||||
Après un bon petit déj --> puzzle cassé les oeuf au bonne endroit dans la poêle
|
||||
mettre le bacon au bonne endroit
|
||||
|
||||
## si choix rien déjeuner
|
||||
rien ne se passer (peut avoir de l'importance pour la suite ex : fin pendant la journée donc allez faire des courses idée de niveau de remplir le caddie)
|
||||
|
||||
|
||||
La journée se termine je croise les doigts pour que tout reste comme avant
|
||||
Puis on ouvre la Trap est... space cat avec qlq level
|
||||
ou reveil devant l examen de calculus
|
34
JournalDeBord/src/rapports/230323.md
Normal file
34
JournalDeBord/src/rapports/230323.md
Normal file
@ -0,0 +1,34 @@
|
||||
# 23 mars 2023
|
||||
|
||||
Nous nous sommes rassemblés ce jeudi afin de parler de plusieurs sujets tel que :
|
||||
|
||||
1. L'avancement du travail d'Eddy.
|
||||
2. Clarifiction sur les tâches.
|
||||
3. Rassembler notre travail.
|
||||
|
||||
## L'avancement du travail d'Eddy
|
||||
|
||||
Eddy a commencé à travailler avec javaFX afin de modéliser les premiers mouvements/ déplacement sur les pièces dont nous aurons besoins pour la suite du projet. Il va rajouter son travail sur notre git.
|
||||
|
||||
## Clarifiction sur les tâches du projet
|
||||
|
||||
En ceux qui concerne Eddy va continuer de :
|
||||
- Travailler sur les mouvements des pièces
|
||||
- Faire l'interface graphique pour le jeu.
|
||||
|
||||
Anthony va :
|
||||
- Continuer à travailler sur Map
|
||||
- Travailler sur son Parser
|
||||
|
||||
Pour finir Matteo va :
|
||||
- S'occuper de faire le menu du jeu
|
||||
- Faire la musique du jeu
|
||||
|
||||
## Rassembler notre travail
|
||||
|
||||
Après la mise en commun du travaille d'Eddy avec celle d'Anthony deux points important ont été souligné.
|
||||
|
||||
En effet désormais Anthony se consacre sur toutes les propriétés des pièces à l'intérieur du plateau de jeu, tandis que Eddy lui fait en sorte de lier son travail pour les mouvements en dehors du plateau c'est-à-dire la sélection des pièces, la sélections de la texture en bref l'interface graphique.
|
||||
De plus concernant la position des pièces il a été décidé de se référer au coin en haut à gauche de la matrice une méthode qui pourra nous aider est la méthode Vec2 qui Anthony a rajouté
|
||||
|
||||
En ce qui concerne la création du menu pour Matteo, il faudrait créer une classe select level pour que chaque level contiennent : le parser qui est relié à Shape et à Pièce mais aussi à l'interface graphique.
|
50
JournalDeBord/src/spec/FileParser.md
Normal file
50
JournalDeBord/src/spec/FileParser.md
Normal file
@ -0,0 +1,50 @@
|
||||
<!-- --- -->
|
||||
<!-- title: File Parser -->
|
||||
<!-- author: Debucquoy Anthony (tonitch) -->
|
||||
<!-- date: 5 March 2023 -->
|
||||
<!-- --- -->
|
||||
# File Parser Specification
|
||||
|
||||
For the Project, I wanted to challenge myself, I decided to do my own file parser with my own specification that would
|
||||
have the special objective of being really small.
|
||||
|
||||
## The File format
|
||||
|
||||
The file would use the .level file extension.
|
||||
|
||||
The file can contain anything, the used data is enclosed between a header and a footer.
|
||||
This could be used to add: musics, images and other stuff in the level file itself
|
||||
|
||||
Only one Header and One Footer should be present in the file.
|
||||
The parser will only read the first one it finds so to avoid problem, it is best practise to put the
|
||||
level data at the top of the file.
|
||||
|
||||
- The HEADER will be defined by the succesion of the characters 'S', 'M' then 'S'
|
||||
- The FOOTER will be defined by the succesion of the characters 'S', 'M', then 'E'
|
||||
- The bytes in between are the level data
|
||||
- byte 1: Width of the map
|
||||
- byte 2: Height of the map
|
||||
- bytes 3 -> Width * Height (+1 if Width * Height % 8 is not 0)
|
||||
- byte after Map Data: Pieces amount
|
||||
- for each pieces
|
||||
- 1 byte: size of the piece
|
||||
- 4 first bits : width
|
||||
- 4 last bits: height
|
||||
- next bytes -> Width * Height (+1 if Width * Height % 8 is not 0)
|
||||
|
||||
### Saved file
|
||||
|
||||
For saved file, the extension will be .slevel
|
||||
The only difference is that at the end of the map data (after the pieces and before the
|
||||
Footer. there will be the position of each pieces from their top-left corner in the map.
|
||||
following this pattern for each pieces
|
||||
|
||||
- 'F' and 'L' on 2 bytes for floating positions when the piece is not placed
|
||||
- x and y on 2 bytes for position if the piece is placed
|
||||
|
||||
## Known Limitation
|
||||
|
||||
1) by putting the piece size on one byte. We limit the maximum piece size to 15 x 15 (1111 | 1111)
|
||||
I don't think we will ever need a piece larger than 5x5 so this is clearly a feature, not a bug! :-)
|
||||
We might use the same methods for the pieces positions but there could be a posibility to have
|
||||
larger map if I use 2 bytes for the positions.
|
@ -1,3 +1,5 @@
|
||||
# School_Project
|
||||
|
||||
[](http://drone.herisson.ovh/undefined_name/School_Project)
|
||||
|
||||
School Project based on Cats Organized Neatly
|
@ -19,7 +19,9 @@ repositories {
|
||||
|
||||
dependencies {
|
||||
// Use JUnit Jupiter for testing.
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
|
||||
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.9.2'
|
||||
|
||||
// This dependency is used by the application.
|
||||
implementation 'com.google.guava:guava:31.1-jre'
|
||||
|
@ -1,32 +1,51 @@
|
||||
/*
|
||||
* This Java source file was generated by the Gradle 'init' task.
|
||||
*/
|
||||
package school_project;
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.scene.Group;
|
||||
import javafx.scene.Parent;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Button;
|
||||
|
||||
import javafx.scene.input.KeyCombination;
|
||||
import javafx.stage.Screen;
|
||||
import javafx.stage.Stage;
|
||||
import school_project.Menu.MenuAccueil;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
||||
public class Controller extends Application {
|
||||
private static Stage stage;
|
||||
Parent root;
|
||||
public static Vec2 screen_size;
|
||||
|
||||
@Override
|
||||
public void start(Stage primaryStage) throws Exception {
|
||||
primaryStage.setTitle("test");
|
||||
Button btn = new Button("test");
|
||||
btn.setOnAction(event -> System.out.println("hey"));
|
||||
public void start(Stage primaryStage) throws IOException {
|
||||
stage = primaryStage;
|
||||
screen_size = new Vec2(
|
||||
(int) Screen.getPrimary().getBounds().getWidth(),
|
||||
(int) Screen.getPrimary().getBounds().getHeight()
|
||||
);
|
||||
|
||||
Group root = new Group();
|
||||
root.getChildren().add(btn);
|
||||
stage.setTitle("ROAD TO MASTER YOU");
|
||||
|
||||
Scene scene = new Scene(root, 300,300);
|
||||
primaryStage.setScene(scene);
|
||||
// Full Screen mode
|
||||
stage.setFullScreen(true);
|
||||
stage.setFullScreenExitHint("");
|
||||
primaryStage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH);
|
||||
|
||||
primaryStage.show();
|
||||
root = new MenuAccueil();
|
||||
|
||||
switchRoot(root);
|
||||
stage.show();
|
||||
}
|
||||
|
||||
|
||||
public static void switchRoot(Parent root){
|
||||
Scene scene = new Scene(root);
|
||||
stage.setScene(scene);
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
launch();
|
||||
launch();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
83
app/src/main/java/school_project/GameUI.java
Normal file
83
app/src/main/java/school_project/GameUI.java
Normal file
@ -0,0 +1,83 @@
|
||||
package school_project;
|
||||
|
||||
import javafx.scene.Group;
|
||||
import javafx.scene.input.MouseButton;
|
||||
import school_project.Menu.MenuAccueil;
|
||||
import school_project.Utils.MatrixShape;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
|
||||
public class GameUI extends Group{
|
||||
public final static int SEGMENT_SIZE = 50;
|
||||
public final static int SPACE_SIZE = 5;
|
||||
private final Vec2 piece_pos_click = new Vec2();
|
||||
|
||||
public GameUI(Map level) throws FileNotFoundException {
|
||||
super();
|
||||
|
||||
MatrixShape grid = new MatrixShape(level);
|
||||
|
||||
//center the grid
|
||||
grid.setLayoutX((Controller.screen_size.x - grid.boundary_size.x) >> 1);
|
||||
grid.setLayoutY((Controller.screen_size.y - grid.boundary_size.y) >> 1);
|
||||
|
||||
getChildren().add(grid);
|
||||
|
||||
Vec2 piece_space = new Vec2(SPACE_SIZE, SPACE_SIZE);
|
||||
int column = 0;
|
||||
for (Piece p : level.getPieces()) {
|
||||
MatrixShape _piece = new MatrixShape(p);
|
||||
|
||||
_piece.setLayoutX(piece_space.x);
|
||||
_piece.setLayoutY(piece_space.y);
|
||||
|
||||
piece_space.y += _piece.boundary_size.y;
|
||||
|
||||
if(piece_space.y >= Controller.screen_size.y){
|
||||
column++;
|
||||
piece_space.y = SPACE_SIZE;
|
||||
piece_space.x = (SEGMENT_SIZE*3 + SPACE_SIZE*4 )* column;
|
||||
}
|
||||
|
||||
// Pieces Events
|
||||
_piece.setOnMouseClicked(event -> {
|
||||
if(event.getButton() == MouseButton.SECONDARY){
|
||||
((Piece) _piece.shape).RotateRight(1);
|
||||
_piece.update();
|
||||
}
|
||||
});
|
||||
_piece.setOnMousePressed(event -> {
|
||||
piece_pos_click.x = (int) event.getX();
|
||||
piece_pos_click.y = (int) event.getY();
|
||||
});
|
||||
_piece.setOnMouseDragged(event -> {
|
||||
_piece.toFront();
|
||||
_piece.setLayoutX(event.getSceneX() - piece_pos_click.x);
|
||||
_piece.setLayoutY(event.getSceneY() - piece_pos_click.y);
|
||||
});
|
||||
_piece.setOnMouseReleased(event -> {
|
||||
if(event.getButton() != MouseButton.PRIMARY)
|
||||
return;
|
||||
if(event.getSceneX() > grid.getLayoutX() && event.getSceneX() < grid.getLayoutX() + grid.boundary_size.x
|
||||
&& event.getSceneY() > grid.getLayoutY() && event.getSceneY() < grid.getLayoutY() + grid.boundary_size.y )
|
||||
{
|
||||
// Inverted because screen is x →; y ↓ and matrix is x ↓; y →
|
||||
Vec2 piece_position_in_grid = new Vec2(
|
||||
(int) (_piece.getLayoutY() + (SEGMENT_SIZE+SPACE_SIZE)/2 - grid.getLayoutY())/(SEGMENT_SIZE+SPACE_SIZE),
|
||||
(int) (_piece.getLayoutX() + (SEGMENT_SIZE+SPACE_SIZE)/2 - grid.getLayoutX())/(SEGMENT_SIZE+SPACE_SIZE)
|
||||
);
|
||||
System.out.println(level.placePiece(p, piece_position_in_grid) + piece_position_in_grid.toString());
|
||||
if(p.getPosition() != null){
|
||||
_piece.setLayoutX(grid.getLayoutX() + p.getPosition().y * (SEGMENT_SIZE+SPACE_SIZE));
|
||||
_piece.setLayoutY(grid.getLayoutY() + p.getPosition().x * (SEGMENT_SIZE+SPACE_SIZE));
|
||||
}
|
||||
if(level.gameDone()){
|
||||
Controller.switchRoot(new MenuAccueil());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
getChildren().add(_piece);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,14 @@
|
||||
package school_project;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Represent the map with its pieces.
|
||||
* Every piece has a position element that represent its position on the map
|
||||
*/
|
||||
public class Map extends Shape{
|
||||
private ArrayList<Piece> pieces;
|
||||
private final ArrayList<Piece> pieces = new ArrayList<>();
|
||||
|
||||
public Map(boolean[][] matrix) {
|
||||
super(matrix);
|
||||
@ -13,8 +18,110 @@ public class Map extends Shape{
|
||||
super();
|
||||
}
|
||||
|
||||
// TODO: 2/27/23 Tests for Map
|
||||
public void AddShape(Piece piece){
|
||||
public void addPiece(Piece piece){
|
||||
piece.setLinked_map(this);
|
||||
pieces.add(piece);
|
||||
}
|
||||
|
||||
public void addPiece(Piece[] pieces) {
|
||||
for (Piece p : pieces)
|
||||
this.addPiece(p);
|
||||
}
|
||||
|
||||
/**
|
||||
* try to place a piece on the map, return true if succeed and false if it failed
|
||||
* @param piece the piece to place
|
||||
* @param pos the position to place the piece in matrix position
|
||||
* @return true if the piece can and is placed and false if it can't and won't not be palced
|
||||
*/
|
||||
public boolean placePiece(Piece piece, Vec2 pos){
|
||||
|
||||
if(!pieces.contains(piece))
|
||||
return false;
|
||||
|
||||
piece.setPosition(null);
|
||||
// In the map limits
|
||||
if ( pos.x + piece.height > height
|
||||
|| pos.y+piece.width > width
|
||||
|| pos.x < 0
|
||||
|| pos.y < 0)
|
||||
return false;
|
||||
|
||||
ArrayList<Vec2> occupation = new ArrayList<>();
|
||||
for(Piece p: pieces){
|
||||
if(p.getPosition() == null || p == piece)
|
||||
continue;
|
||||
for (Vec2 o : p.getOccupation()) {
|
||||
occupation.add(o);
|
||||
}
|
||||
}
|
||||
|
||||
for (int x = pos.x; x < pos.x + piece.height; x++) {
|
||||
for (int y = pos.y; y < pos.y + piece.width; y++) {
|
||||
if ((!getShape()[x][y] || occupation.contains(new Vec2(x, y))) && piece.getShape()[x - pos.x][y - pos.y]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
piece.setPosition(pos);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if every pieces has a space on the board to know if the game is finished
|
||||
* @return true if the game is finished, false if not
|
||||
*/
|
||||
public boolean gameDone(){
|
||||
ArrayList<Vec2> posList = getPosList();
|
||||
for(Piece p: pieces){
|
||||
posList.removeAll(p.getOccupation());
|
||||
}
|
||||
return posList.isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a matrix with all used space on the map to see if a piece can fit in a space
|
||||
*
|
||||
* @return matrix of boolean with false being the not used space
|
||||
*/
|
||||
public boolean[][] getUsedSpace(){
|
||||
|
||||
// Copy of the map to avoid side effect
|
||||
boolean[][] used = new boolean[height][width];
|
||||
for (int i = 0; i < height; i++) {
|
||||
used[i] = Arrays.copyOf(matrix[i], width);
|
||||
}
|
||||
|
||||
for (Piece p : pieces) {
|
||||
if(p.getPosition() == null)
|
||||
continue;
|
||||
for(int x = 0; x < p.height; x++){
|
||||
for(int y = 0; y < p.width; y++){
|
||||
if (p.getShape()[x][y]){
|
||||
used[p.getPosition().x + x][p.getPosition().y + y] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return used;
|
||||
}
|
||||
|
||||
public ArrayList<Piece> getPieces() {
|
||||
return pieces;
|
||||
}
|
||||
|
||||
/**
|
||||
* return a new Clean Map without any pieces on it for saving purpose
|
||||
* @return a New Map Object without any pieces or saved data
|
||||
*/
|
||||
public Map getCleanedMap() {
|
||||
try {
|
||||
Map ret = (Map) this.clone();
|
||||
ret.getPieces().clear();
|
||||
return ret;
|
||||
} catch (CloneNotSupportedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
102
app/src/main/java/school_project/MapGenerator.java
Normal file
102
app/src/main/java/school_project/MapGenerator.java
Normal file
@ -0,0 +1,102 @@
|
||||
package school_project;
|
||||
|
||||
import school_project.Utils.Array;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Random;
|
||||
|
||||
public class MapGenerator {
|
||||
private static final Random rand = new Random();
|
||||
public enum Difficulty {
|
||||
Easy,
|
||||
Medium,
|
||||
Difficult,
|
||||
}
|
||||
public static Map generate(Difficulty difficulty){
|
||||
Vec2 map_size;
|
||||
int depth = 1; // how much the map shape generator could grind
|
||||
|
||||
// define map size depending on the difficulty
|
||||
switch (difficulty){
|
||||
case Easy:
|
||||
map_size = new Vec2(rand.nextInt(2) + 3, rand.nextInt(2) + 3);
|
||||
break;
|
||||
case Medium:
|
||||
map_size = new Vec2(rand.nextInt(3)+5, rand.nextInt(3)+5);
|
||||
break;
|
||||
case Difficult:
|
||||
map_size = new Vec2(rand.nextInt(2)+8, rand.nextInt(2)+8);
|
||||
depth = 2;
|
||||
break;
|
||||
default:
|
||||
map_size = new Vec2();
|
||||
break;
|
||||
}
|
||||
|
||||
// Cut edges
|
||||
boolean[][] map_shape = new boolean[map_size.x][map_size.y];
|
||||
for (boolean[] b : map_shape) {
|
||||
Arrays.fill(b, true);
|
||||
}
|
||||
for (int i = 0; i < map_shape.length; i++) {
|
||||
for (int j = 0; j < map_shape[0].length; j++) {
|
||||
if(i > depth - 1 && i < map_shape.length - depth && j > depth - 1 && j < map_shape[0].length - depth){
|
||||
j = map_shape[0].length - depth;
|
||||
}
|
||||
map_shape[i][j] = rand.nextBoolean();
|
||||
}
|
||||
}
|
||||
//delete lonely piece
|
||||
for (int i =0;i<map_shape.length;i++){
|
||||
for (int j = 0; j<map_shape[i].length;j++){
|
||||
boolean test = false;
|
||||
if(map_shape[i][j]){
|
||||
for(int k = Math.max(i - 1, 0); k<= Math.min(i+1,map_shape.length-1); k++){
|
||||
for (int l = Math.max(j - 1, 0); l<= Math.min(j+1,map_shape[i].length-1); l++){
|
||||
if (k==i && l == j)
|
||||
continue;
|
||||
if (map_shape[k][l])
|
||||
test = true;
|
||||
}
|
||||
}
|
||||
if (!test)
|
||||
map_shape[i][j] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Map ret = new Map(map_shape);
|
||||
boolean[][] piece_layout = Array.MatrixCopyOf(map_shape);
|
||||
ArrayList<Vec2> EmptySlots = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < piece_layout.length; i++) {
|
||||
for (int j = 0; j < piece_layout[i].length; j++) {
|
||||
if(piece_layout[i][j]){
|
||||
EmptySlots.add(new Vec2(i, j));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (EmptySlots.size() > 0){
|
||||
Collections.shuffle(EmptySlots);
|
||||
Vec2 selected = EmptySlots.get(0);
|
||||
int size = 3;
|
||||
boolean[][] shape = new boolean[size][size];
|
||||
for(int i = 0; i < size; i++){
|
||||
for (int j = 0; j < size; j++) {
|
||||
Vec2 checked = new Vec2(i, j).add(selected);
|
||||
if(EmptySlots.contains(checked)){
|
||||
EmptySlots.remove(checked);
|
||||
piece_layout[checked.x][checked.y] = false;
|
||||
shape[i][j] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret.addPiece(new Piece(shape));
|
||||
}
|
||||
|
||||
//generate pieces
|
||||
return ret;
|
||||
}
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
package school_project;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class MapParser {
|
||||
public static Map ParseMapFile(File file) throws IllegalArgumentException, IllegalAccessException, IOException {
|
||||
System.out.println(file.getAbsolutePath());
|
||||
FileInputStream fileStream = new FileInputStream(file);
|
||||
if(!file.isFile()) throw new IllegalArgumentException("The argument should be a file");
|
||||
if(!file.canRead()) throw new IllegalAccessException("This file can't be read");
|
||||
|
||||
byte[] bytes = fileStream.readAllBytes();
|
||||
int start_position = 0, end_position = 0;
|
||||
for (int i = 0; i < bytes.length; i++) {
|
||||
if(bytes[i] == 83 && bytes[i+1] == 77 && bytes[i+2] == 83){ // SMS
|
||||
start_position = i+3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = start_position; i < bytes.length; i++) {
|
||||
if(bytes[i] == 83 && bytes[i+1] == 77 && bytes[i+2] == 69){ // SME
|
||||
end_position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
byte[] map_data = Arrays.copyOfRange(bytes, start_position, end_position); //TODO tonitch cursor
|
||||
|
||||
|
||||
fileStream.close();
|
||||
return new Map(); //TODO: Send the parsed map
|
||||
}
|
||||
|
||||
// public static void SaveMapFile(File file){
|
||||
// }
|
||||
|
||||
public static void main(String[] args) throws IOException, IllegalAccessException {
|
||||
ParseMapFile(new File("test.smap"));
|
||||
}
|
||||
|
||||
}
|
42
app/src/main/java/school_project/Menu/MenuAccueil.java
Normal file
42
app/src/main/java/school_project/Menu/MenuAccueil.java
Normal file
@ -0,0 +1,42 @@
|
||||
package school_project.Menu;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.geometry.Pos;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.BorderPane;
|
||||
import javafx.scene.paint.Color;
|
||||
import javafx.scene.text.Font;
|
||||
import school_project.Controller;
|
||||
public class MenuAccueil extends BorderPane {
|
||||
|
||||
|
||||
public MenuAccueil(){
|
||||
super();
|
||||
//create all the objet that i need
|
||||
Button Play = new Button("Play");
|
||||
Button SelectLevel= new Button("Select Level");
|
||||
Button Trophy = new Button("Trophy");
|
||||
Label Title = new Label("Welcome to Road to Master");
|
||||
//set up all the Button where i need
|
||||
setTop(Title);
|
||||
setLeft(Play);
|
||||
setRight(SelectLevel);
|
||||
setBottom(Trophy);
|
||||
Title.setFont(Font.font(20));
|
||||
Title.setTextFill(Color.GOLD);
|
||||
setAlignment(Title, Pos.CENTER);
|
||||
setAlignment(Play,Pos.CENTER);
|
||||
setAlignment(SelectLevel,Pos.CENTER);
|
||||
setAlignment(Trophy,Pos.CENTER);
|
||||
setPadding(new Insets(20,60,20,60));
|
||||
SelectLevel.setOnAction(event -> Controller.switchRoot(new MenuLevel(1)));
|
||||
getStyleClass().add("BorderPane");
|
||||
getStylesheets().add(String.valueOf(getClass().getResource("StyleMenuAcceuil.css")));
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
110
app/src/main/java/school_project/Menu/MenuLevel.java
Normal file
110
app/src/main/java/school_project/Menu/MenuLevel.java
Normal file
@ -0,0 +1,110 @@
|
||||
package school_project.Menu;
|
||||
|
||||
import javafx.geometry.HPos;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.layout.ColumnConstraints;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.layout.RowConstraints;
|
||||
import school_project.Controller;
|
||||
|
||||
public class MenuLevel extends GridPane {
|
||||
private int StartLevel;
|
||||
public MenuLevel(int choose_day) {
|
||||
|
||||
//create all Object that I need
|
||||
RowConstraints[] Rows = new RowConstraints[5];
|
||||
ColumnConstraints[] Columns = new ColumnConstraints[3];
|
||||
Button[] Days = new Button[3];
|
||||
Button BckMenu = new Button("Back to menu");
|
||||
|
||||
BckMenu.setOnAction(event -> Controller.switchRoot(new MenuAccueil()));
|
||||
setHalignment(BckMenu,HPos.CENTER);
|
||||
add(BckMenu,2,4);
|
||||
|
||||
|
||||
for (int i = 0; i < Days.length; i++){
|
||||
Days[i] = new Button("Day"+(i+1));
|
||||
}
|
||||
|
||||
//it's here that I know which day I can show on the screen
|
||||
|
||||
if (choose_day == 1) {
|
||||
StartLevel = 1;
|
||||
add(Days[1],0,0);
|
||||
add(Days[2],2,0);
|
||||
setHalignment(Days[1], HPos.CENTER);
|
||||
setHalignment(Days[2], HPos.CENTER);
|
||||
}
|
||||
|
||||
else if (choose_day == 2) {
|
||||
StartLevel = 11;
|
||||
add(Days[0], 0, 0);
|
||||
add(Days[2], 2, 0);
|
||||
setHalignment(Days[0], HPos.CENTER);
|
||||
setHalignment(Days[2], HPos.CENTER);
|
||||
}
|
||||
|
||||
else if (choose_day == 3) {
|
||||
StartLevel = 21;
|
||||
add(Days[0], 0, 0);
|
||||
add(Days[1], 2, 0);
|
||||
setHalignment(Days[0], HPos.CENTER);
|
||||
setHalignment(Days[1], HPos.CENTER);
|
||||
}
|
||||
|
||||
Days[0].setOnAction(event -> Controller.switchRoot(new MenuLevel(1)));
|
||||
Days[1].setOnAction(event -> Controller.switchRoot(new MenuLevel(2)));
|
||||
Days[2].setOnAction(event -> Controller.switchRoot(new MenuLevel(3)));
|
||||
|
||||
//It's here that I put all buttons where I need (base on column not row)
|
||||
for (int i = 0; i < 3; i++) {
|
||||
for (int j = 1; j < 5; j++) {
|
||||
if(i==0){
|
||||
Button Level = new Button("level "+(StartLevel));
|
||||
StartLevel+=3;
|
||||
add(Level,i,j);
|
||||
setHalignment(Level,HPos.CENTER);
|
||||
if(j==4){
|
||||
StartLevel-=11;
|
||||
}
|
||||
}
|
||||
else if(i==1&&j!=4) {
|
||||
Button Level = new Button("level "+(StartLevel));
|
||||
StartLevel += 3;
|
||||
add(Level, i, j);
|
||||
setHalignment(Level,HPos.CENTER);
|
||||
if (j == 3) {
|
||||
StartLevel -=8;
|
||||
|
||||
}
|
||||
}
|
||||
else if(i==2&&j!=4){
|
||||
Button Level = new Button("level "+(StartLevel));
|
||||
StartLevel+=3;
|
||||
add(Level,i,j);
|
||||
setHalignment(Level,HPos.CENTER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0;i<=2;i++){
|
||||
Columns[i] = new ColumnConstraints();
|
||||
Columns[i].setPercentWidth(33);
|
||||
getColumnConstraints().addAll(Columns[i]);
|
||||
}
|
||||
|
||||
for (int i= 0;i<=4;i++){
|
||||
Rows[i] = new RowConstraints();
|
||||
Rows[i].setPercentHeight(20);
|
||||
getRowConstraints().addAll(Rows[i]);
|
||||
}
|
||||
|
||||
setHgap(20);
|
||||
setVgap(20);
|
||||
setPadding(new Insets(20,10,10,20));
|
||||
getStyleClass().add("GridPane");
|
||||
getStylesheets().add(String.valueOf(getClass().getResource("StyleMenuAcceuil.css")));
|
||||
}
|
||||
}
|
||||
|
220
app/src/main/java/school_project/Parsers/BinaryParser.java
Normal file
220
app/src/main/java/school_project/Parsers/BinaryParser.java
Normal file
@ -0,0 +1,220 @@
|
||||
package school_project.Parsers;
|
||||
|
||||
import school_project.Map;
|
||||
import school_project.Piece;
|
||||
import school_project.Utils.Bitwise;
|
||||
import school_project.Vec2;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class BinaryParser implements FileParser {
|
||||
|
||||
@Override
|
||||
public Map getLevel(File file, boolean saved_data) throws IOException {
|
||||
Map ret;
|
||||
|
||||
FileInputStream fileStream = new FileInputStream(file);
|
||||
|
||||
byte[] level_data = ExtractLevelData(fileStream);
|
||||
|
||||
ret = new Map(ExtractMapFromLevelData(level_data));
|
||||
|
||||
ret.addPiece(ExtractPiecesFromLevelData(level_data, saved_data));
|
||||
|
||||
fileStream.close();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveLevel(File file, Map level_data, boolean save_data) throws IOException {
|
||||
int byteSize = getByteSizeForMap(level_data, save_data);
|
||||
byte[] data = new byte[byteSize];
|
||||
int i = 0;
|
||||
data[i++] = 'S'; data[i++] = 'M'; data[i++] = 'S';
|
||||
data[i++] = (byte) level_data.getWidth(); data[i++] = (byte) level_data.getHeight();
|
||||
for(byte b : BuildByteFromMatrix(level_data.getShape())){
|
||||
data[i++] = b;
|
||||
}
|
||||
data[i++] = (byte) level_data.getPieces().size();
|
||||
for (Piece p : level_data.getPieces()) {
|
||||
data[i++] = Bitwise.NibbleToByte((byte) p.getWidth(), (byte) p.getHeight());
|
||||
for(byte b : BuildByteFromMatrix(p.getShape())){
|
||||
data[i++] = b;
|
||||
}
|
||||
}
|
||||
if (save_data){
|
||||
for (Piece p : level_data.getPieces()) {
|
||||
Vec2 _piece_pos = p.getPosition();
|
||||
if(_piece_pos == null){
|
||||
data[i++] = 'F';
|
||||
data[i++] = 'L';
|
||||
}else{
|
||||
data[i++] = (byte) _piece_pos.x;
|
||||
data[i++] = (byte) _piece_pos.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
data[i++] = 'S'; data[i++] = 'M'; data[i++] = 'E';
|
||||
FileOutputStream save_file = new FileOutputStream(file);
|
||||
save_file.write(data);
|
||||
save_file.flush();
|
||||
save_file.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract Level data from file content
|
||||
* @param fileStream file stream to read extract data from
|
||||
* @return Level data as an array of byte
|
||||
* @throws IOException Expected if we can't read the file
|
||||
*/
|
||||
static byte[] ExtractLevelData(InputStream fileStream) throws IOException {
|
||||
|
||||
byte[] bytes = fileStream.readAllBytes();
|
||||
|
||||
int start_position = 0, end_position = 0;
|
||||
for (int i = 0; i < bytes.length; i++) {
|
||||
if(bytes[i] == 83 && bytes[i+1] == 77 && bytes[i+2] == 83){ // SMS
|
||||
start_position = i+3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = start_position; i < bytes.length - 2; i++) {
|
||||
if(bytes[i] == 83 && bytes[i+1] == 77 && bytes[i+2] == 69){ // SME
|
||||
end_position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Arrays.copyOfRange(bytes, start_position, end_position);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Pieces out of the level data
|
||||
*
|
||||
* @param levelData full data of the level without header and footer
|
||||
* @param saved_data Should extract saved data and included it in the pieces
|
||||
* @return array of Piece from level data
|
||||
*/
|
||||
static Piece[] ExtractPiecesFromLevelData(byte[] levelData, boolean saved_data) {
|
||||
byte map_width = levelData[0], map_height = levelData[1];
|
||||
byte piece_count = levelData[2 + map_width * map_height / 8 + (map_height * map_width % 8 != 0 ? 1 : 0)];
|
||||
Piece[] ret = new Piece[piece_count];
|
||||
byte[] pieces_data = Arrays.copyOfRange(levelData, 3 + map_width * map_height / 8 + (map_height * map_width % 8 != 0 ? 1 : 0), levelData.length);
|
||||
byte[] pieces_positions = saved_data ? Arrays.copyOfRange(levelData, levelData.length - piece_count*2,levelData.length ): null;
|
||||
int piece_offset = 0;
|
||||
for (int piece_index = 0; piece_index < piece_count; piece_index++) {
|
||||
Vec2 _piece_size = Bitwise.ByteToNible(pieces_data[piece_index + piece_offset]);
|
||||
|
||||
byte[] _piece_data = Arrays.copyOfRange(pieces_data, piece_index + piece_offset + 1, piece_index + piece_offset + 1 + _piece_size.x * _piece_size.y / 8 + (_piece_size.x * _piece_size.y % 8 != 0 ? 1 : 0));
|
||||
|
||||
boolean[][] _piece_matrix = BuildMatrixFromBytes(_piece_size.x, _piece_size.y, _piece_data);
|
||||
|
||||
ret[piece_index] = new Piece(_piece_matrix);
|
||||
|
||||
if(saved_data){
|
||||
Vec2 _piece_pos = new Vec2(pieces_positions[piece_index*2], pieces_positions[piece_index*2 + 1]);
|
||||
ret[piece_index].setPosition(_piece_pos);
|
||||
}
|
||||
|
||||
piece_offset += _piece_size.x * _piece_size.y / 8 + (_piece_size.x * _piece_size.y % 8 != 0 ? 1 : 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Map Matrix out of the level data
|
||||
* @param level_data full data of the level without header and footer
|
||||
* @return boolean matrix of the map
|
||||
*/
|
||||
static boolean[][] ExtractMapFromLevelData(byte[] level_data){
|
||||
int map_width = level_data[0], map_height = level_data[1];
|
||||
byte[] map_data = Arrays.copyOfRange(level_data, 2, 2 + map_width * map_height / 8 + (map_height * map_width % 8 != 0 ? 1 : 0));
|
||||
return BuildMatrixFromBytes(map_width, map_height, map_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* take a boolean matrix and build an array of byte following the specs of the parser
|
||||
* @param shape bolean matrix where true are 1 and false are 0
|
||||
* @return byte array with each element compiled for file format
|
||||
*/
|
||||
static byte[] BuildByteFromMatrix(boolean[][] shape){
|
||||
int width = shape[0].length , height = shape.length;
|
||||
boolean[] b_list = new boolean[width * height];
|
||||
for (int x = 0; x < shape.length; x++) {
|
||||
for (int y = 0; y < shape[x].length; y++) {
|
||||
b_list[x * shape[x].length + y] = shape[x][y];
|
||||
}
|
||||
}
|
||||
byte[] ret = new byte[width * height / 8 + (width * height % 8 == 0 ? 0 : 1)];
|
||||
for (int i = 0; i < ret.length; i++) {
|
||||
byte current_byte = 0;
|
||||
boolean[] current_byte_data = Arrays.copyOfRange(b_list, i * 8, i * 8 + 8);
|
||||
for (boolean curr_data: current_byte_data) {
|
||||
current_byte = (byte) (current_byte << 1);
|
||||
current_byte = (byte) (current_byte | (curr_data ? 1 : 0));
|
||||
}
|
||||
ret[i] = current_byte;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a boolean Matrix From a byte array
|
||||
* Each Byte is composed of 8 bit, each bit is 1 or 0
|
||||
* if the bit is 0 then it's a false for this cell
|
||||
* else it's true for this cell
|
||||
* @param matrix_width width of the matrix
|
||||
* @param matrix_height height of the matrix
|
||||
* @param matrix_data byte array of the data to export
|
||||
* @return boolean Matrix of the data decompiled
|
||||
*/
|
||||
static boolean[][] BuildMatrixFromBytes(int matrix_width, int matrix_height, byte[] matrix_data){
|
||||
boolean[][] ret = new boolean[matrix_height][matrix_width];
|
||||
|
||||
// Transforming the bit from matrix_data's byte into boolean array for better manipulation
|
||||
boolean[] b_array = new boolean[matrix_height * matrix_width];
|
||||
int index = 0;
|
||||
for(byte b: matrix_data){
|
||||
for (int i = 0; i < 8; i++) { // because 8 bit in a byte
|
||||
b_array[index] = Bitwise.IsBitSetAt(b, i);
|
||||
index++;
|
||||
if(index >= matrix_height * matrix_width)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Transforming b_array to a 2D matrix
|
||||
for (int x = 0; x < matrix_height; x++) {
|
||||
for (int y = 0; y < matrix_width; y++) {
|
||||
ret[x][y] = b_array[y + x * matrix_width];
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* give the amount of byte needed to store the given Map
|
||||
* following the binary file format
|
||||
* @param level the map to check
|
||||
* @param data should add save data or only level data
|
||||
* @return integer of the ammount of byte needed
|
||||
*/
|
||||
public static int getByteSizeForMap(Map level, boolean data){
|
||||
int ret = 6; // header + footer
|
||||
ret += 2; //size of the piece
|
||||
ret += ((level.getWidth() * level.getHeight()) / 8); // size of the map
|
||||
ret += level.getHeight() * level.getWidth() % 8 == 0 ? 0 : 1; // Add 1 if the size of map is not a mult of 8
|
||||
ret += 1; // amount of pieces
|
||||
for(Piece p: level.getPieces()){
|
||||
ret += 1; // size of the piece
|
||||
ret += p.getHeight() * p.getWidth() / 8;
|
||||
ret += p.getHeight() * p.getWidth() % 8 == 0 ? 0 : 1; // add 1 if the size of the piece is not mult of 8
|
||||
if(data){
|
||||
ret += 2; // if the piece is not placed, only one byte else 2
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
33
app/src/main/java/school_project/Parsers/FileParser.java
Normal file
33
app/src/main/java/school_project/Parsers/FileParser.java
Normal file
@ -0,0 +1,33 @@
|
||||
package school_project.Parsers;
|
||||
|
||||
import school_project.Map;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
|
||||
public interface FileParser {
|
||||
|
||||
/**
|
||||
* Parse the file and create a Map with its shape and pieces setup
|
||||
*
|
||||
* @param file file to parse
|
||||
* @param saved_data does the saved data should be added to the map
|
||||
* @return Map Object parsed with file data
|
||||
* @see <a href="http://school.debucquoy.me/spec/FileParser.html#file-parser-specification"> Parser Specification</a>
|
||||
* @throws FileNotFoundException if the file was not found or was not accessible
|
||||
* @throws IOException if an I/O occurs
|
||||
*/
|
||||
Map getLevel(File file, boolean saved_data) throws IOException;
|
||||
|
||||
/**
|
||||
* Save Map to a file without all it's data
|
||||
* Could be used for generating level file. might not be used in game.
|
||||
* @param file the file where to save
|
||||
* @param levelData the map to save
|
||||
* @param save_data should save the map data (need to be false only in development I think)
|
||||
* @throws FileNotFoundException The file could not be created
|
||||
* @throws IOException if an I/O occurs
|
||||
*/
|
||||
void saveLevel(File file, Map levelData, boolean save_data) throws IOException;
|
||||
}
|
132
app/src/main/java/school_project/Parsers/FileParserFactory.java
Normal file
132
app/src/main/java/school_project/Parsers/FileParserFactory.java
Normal file
@ -0,0 +1,132 @@
|
||||
package school_project.Parsers;
|
||||
|
||||
import javafx.util.Pair;
|
||||
import school_project.Map;
|
||||
import school_project.Piece;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.NotSerializableException;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* This is used to find the right parser to parser a save/level file.
|
||||
* This should be the only right way to save/load a file! you can just use `Map loadMapFromFile(File)` to load a file
|
||||
* and `void saveFileFromMap(File, Map)` to save a file
|
||||
*
|
||||
* <p>
|
||||
* there is currently 2 file format with 2 variation each (save file or level file)
|
||||
* - BinaryParser
|
||||
* - ".level"
|
||||
* - ".slevel"
|
||||
* - SerializeParser
|
||||
* - ".serialized"
|
||||
* - ".sserialized"
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* More file format can be added in the future by adding a new class that implement parser
|
||||
* and adding it to this file
|
||||
* </p>
|
||||
*
|
||||
* @author tonitch
|
||||
*/
|
||||
public class FileParserFactory {
|
||||
/**
|
||||
* Load a file and return a map
|
||||
* If this is a save map, return the map with its save data
|
||||
* @param file file to get data from
|
||||
* @return Map generated from the file
|
||||
* @throws FileNotFoundException if the file was not found or was not accessible
|
||||
* @throws IOException if an I/O occurs
|
||||
*/
|
||||
public static Map loadMapFromFile(File file) throws IOException {
|
||||
Pair<FileParser, Boolean> parser= getFileParser(file);
|
||||
return parser.getKey().getLevel(file, parser.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a file in a specific format, this format is defined by the file extension
|
||||
* This file extention could be: ".level", ".slevel", ".serialized", ".sserialized"
|
||||
* for save file use the .s variations
|
||||
* @param file file name to be saved to with the right extension
|
||||
* @param map map file to save
|
||||
* @throws NotSerializableException the file extension is not recognised
|
||||
* @throws FileNotFoundException The file could not be created
|
||||
* @throws IOException if an I/O occurs
|
||||
*/
|
||||
public static void saveFileFromMap(File file, Map map) throws IOException {
|
||||
Pair<FileParser, Boolean> parser= getFileParser(file);
|
||||
parser.getKey().saveLevel(file, map, parser.getValue());
|
||||
}
|
||||
|
||||
private static Pair<FileParser, Boolean> getFileParser(File file) throws NotSerializableException {
|
||||
FileParser fileParser;
|
||||
boolean save_data;
|
||||
|
||||
if (file.toString().toLowerCase().endsWith(".level")){
|
||||
fileParser = new BinaryParser();
|
||||
save_data = false;
|
||||
}else if(file.toString().toLowerCase().endsWith(".slevel")){
|
||||
fileParser = new BinaryParser();
|
||||
save_data = true;
|
||||
}else if(file.toString().toLowerCase().endsWith(".serialized")){
|
||||
fileParser = new SerializeParser();
|
||||
save_data = false;
|
||||
}else if(file.toString().toLowerCase().endsWith(".sserialized")) {
|
||||
fileParser = new SerializeParser();
|
||||
save_data = true;
|
||||
}else {
|
||||
throw new NotSerializableException("This file format is not supported");
|
||||
}
|
||||
return new Pair<FileParser, Boolean>(fileParser, save_data);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
Scanner in = new Scanner(System.in);
|
||||
Map level = new Map();
|
||||
|
||||
System.out.print("Entrez le nom du fichier:");
|
||||
File file = new File(in.nextLine());
|
||||
|
||||
System.out.print("Entrez la largeur de la map:");
|
||||
int map_width = in.nextInt();
|
||||
|
||||
System.out.print("Entrez la hauteur de la map:");
|
||||
int map_height = in.nextInt();
|
||||
|
||||
boolean[][] map_shape = new boolean[map_height][map_width];
|
||||
|
||||
for (int i = 0; i < map_height; i++) {
|
||||
for (int j = 0; j < map_width; j++) {
|
||||
System.out.print("mur (" + i + ", " + j + ")? (y/n):");
|
||||
map_shape[i][j] = in.next(".").charAt(0) != 'y';
|
||||
}
|
||||
}
|
||||
|
||||
level.setShape(map_shape);
|
||||
System.out.println(level);
|
||||
System.out.print("Entrez le nombre de pieces:");
|
||||
int piece_amount = in.nextInt();
|
||||
|
||||
for (int i = 0; i < piece_amount; i++) {
|
||||
System.out.print("Entrez la largeur de la piece" + (i+1) +": ");
|
||||
int _piece_width = in.nextInt();
|
||||
|
||||
System.out.print("Entrez la hauteur de la piece" + (i+1) +": ");
|
||||
int _piece_height = in.nextInt();
|
||||
boolean[][] _piece_shape = new boolean[_piece_height][_piece_width];
|
||||
|
||||
for (int k = 0; k < _piece_height; k++) {
|
||||
for (int j = 0; j < _piece_width; j++) {
|
||||
System.out.print("mur (" + k + ", " + j + ")? (y/n):");
|
||||
_piece_shape[k][j] = in.next(".").charAt(0) != 'y';
|
||||
}
|
||||
}
|
||||
|
||||
level.addPiece(new Piece(_piece_shape));
|
||||
}
|
||||
saveFileFromMap(file, level);
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package school_project.Parsers;
|
||||
|
||||
import school_project.Map;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
public class SerializeParser implements FileParser{
|
||||
|
||||
@Override
|
||||
public Map getLevel(File file, boolean saved_data) throws IOException {
|
||||
// saved_data is ignored in this case because the file is serialized data and it already knows if should have saved_data or not at this point
|
||||
FileInputStream fileStream = new FileInputStream(file);
|
||||
ObjectInputStream objectStream = new ObjectInputStream(fileStream);
|
||||
try {
|
||||
return (Map) objectStream.readObject();
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException("the serialized file format has not found any object in the file");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveLevel(File file, Map levelData, boolean save_data) throws IOException {
|
||||
FileOutputStream fileStream = new FileOutputStream(file);
|
||||
ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);
|
||||
objectStream.writeObject(save_data ? levelData : levelData.getCleanedMap());
|
||||
|
||||
objectStream.close();
|
||||
fileStream.close();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,14 +1,68 @@
|
||||
package school_project;
|
||||
|
||||
import javafx.scene.paint.Color;
|
||||
import javafx.scene.paint.Paint;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
|
||||
import static javafx.scene.paint.Color.WHITE;
|
||||
import static javafx.scene.paint.Color.color;
|
||||
|
||||
/**
|
||||
* Represent a Piece in the game.
|
||||
* Every Piece should be contained in a Map Object.
|
||||
* A piece has a position witch is the position of its top-leftest position in its matrix.
|
||||
* If the piece is not placed in the Map (in a floating state) the position should be null;
|
||||
*/
|
||||
public class Piece extends Shape{
|
||||
|
||||
private int x,y; // Position in the Map Object
|
||||
public Piece() {
|
||||
super();
|
||||
}
|
||||
private Vec2 Position;
|
||||
private Map linked_map;
|
||||
private transient Paint color; // https://www.baeldung.com/java-transient-keyword
|
||||
|
||||
public Piece(boolean[][] matrix) {
|
||||
super(matrix);
|
||||
Random rand = new Random();
|
||||
color = new Color((rand.nextDouble()%190), (rand.nextDouble()%190), (rand.nextDouble()%190), 1);
|
||||
|
||||
}
|
||||
public void setColor(Paint p){
|
||||
color = p;
|
||||
}
|
||||
|
||||
public Paint getColor(){
|
||||
return color;
|
||||
}
|
||||
|
||||
public Vec2 getPosition() {
|
||||
return Position;
|
||||
}
|
||||
|
||||
public void setPosition(Vec2 position){
|
||||
this.Position = position;
|
||||
}
|
||||
|
||||
public ArrayList<Vec2> getOccupation(){
|
||||
ArrayList<Vec2> ret = new ArrayList<>();
|
||||
if(Position == null)
|
||||
return ret;
|
||||
for (int x = 0; x < height; x++) {
|
||||
for (int y = 0; y < width; y++) {
|
||||
if(getShape()[x][y]){
|
||||
ret.add(new Vec2(getPosition().x + x, getPosition().y + y));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* set the map the piece is into the the map argument
|
||||
* @param map map where to place the piece
|
||||
*/
|
||||
public void setLinked_map(Map map){
|
||||
this.linked_map = map;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -26,6 +80,20 @@ public class Piece extends Shape{
|
||||
}
|
||||
times--;
|
||||
matrix = temp_matrix;
|
||||
height = matrix.length;
|
||||
width = matrix[0].length;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if(obj instanceof Piece){
|
||||
Piece pieceObj = (Piece) obj;
|
||||
if (pieceObj.getPosition() != null && this.getPosition() != null){
|
||||
return pieceObj.getPosition().equals(this.getPosition()) && pieceObj.getShape().equals(getShape());
|
||||
}
|
||||
return pieceObj.getShape().equals(getShape());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -1,8 +1,17 @@
|
||||
package school_project;
|
||||
|
||||
|
||||
public class Shape {
|
||||
import school_project.Utils.Array;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Base class for everything that is a shape kind, like map and pieces
|
||||
* it contain a matrix of boolean where the shape is defined by the true's
|
||||
*/
|
||||
public class Shape implements Serializable, Cloneable{
|
||||
|
||||
protected boolean[][] matrix;
|
||||
protected int height, width;
|
||||
|
||||
@ -15,14 +24,52 @@ public class Shape {
|
||||
}
|
||||
|
||||
public void setShape(boolean[][] matrix) throws IllegalArgumentException{
|
||||
height = matrix.length;
|
||||
width = matrix[0].length;
|
||||
|
||||
for (boolean[] row: matrix){
|
||||
if(row.length != width){
|
||||
if(row.length != matrix[0].length){
|
||||
throw new IllegalArgumentException("The argument should be a square matrix");
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < matrix.length; i++) {
|
||||
if(!Array.isRowOnlyFalse(matrix, i)) {
|
||||
for (int j = 0; j < i; j++) {
|
||||
matrix = Array.MatrixRemoveRow(matrix, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = matrix.length-1; i >= 0; i--) {
|
||||
if(!Array.isRowOnlyFalse(matrix, i)) {
|
||||
for (int j = matrix.length-1; j > i; j--) {
|
||||
matrix = Array.MatrixRemoveRow(matrix, j);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < matrix[0].length; i++) {
|
||||
if(!Array.isColumnOnlyFalse(matrix, i)) {
|
||||
for (int j = 0; j < i; j++) {
|
||||
matrix = Array.MatrixRemoveColumn(matrix, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = matrix[0].length-1; i >= 0; i--){
|
||||
if(!Array.isColumnOnlyFalse(matrix, i)) {
|
||||
for (int j = matrix[0].length-1; j > i; j--) {
|
||||
matrix = Array.MatrixRemoveColumn(matrix, j);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
height = matrix.length;
|
||||
width = matrix[0].length;
|
||||
|
||||
this.matrix = matrix;
|
||||
}
|
||||
|
||||
@ -37,4 +84,33 @@ public class Shape {
|
||||
public boolean[][] getShape() {
|
||||
return matrix;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of all the open possition of the map
|
||||
* @return ArrayList of vec2 of all the positions
|
||||
*/
|
||||
public ArrayList<Vec2> getPosList(){
|
||||
ArrayList<Vec2> ret = new ArrayList<>();
|
||||
for (int x = 0; x < height; x++) {
|
||||
for (int y = 0; y < width; y++) {
|
||||
if(matrix[x][y]){
|
||||
ret.add(new Vec2(x, y));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
String ret = "";
|
||||
for (boolean[] row : matrix) {
|
||||
for (boolean el : row) {
|
||||
if(el) ret = ret.concat("⬛");
|
||||
else ret = ret.concat("⬜");
|
||||
}
|
||||
ret = ret.concat("\n");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
61
app/src/main/java/school_project/Utils/Array.java
Normal file
61
app/src/main/java/school_project/Utils/Array.java
Normal file
@ -0,0 +1,61 @@
|
||||
package school_project.Utils;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Array{
|
||||
public static boolean[][] MatrixCopyOf(boolean[][] o){
|
||||
boolean[][] ret = new boolean[o.length][];
|
||||
for (int i = 0; i < o.length; i++){
|
||||
ret[i] = Arrays.copyOf(o[i], o[i].length);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static boolean[][] MatrixRemoveRow(boolean[][] o, int row){
|
||||
boolean[][] newMatrix = new boolean[o.length - 1][o[0].length];
|
||||
int newRow = 0;
|
||||
for (int i = 0; i < o.length; i++) {
|
||||
if(i == row)
|
||||
i++;
|
||||
if(i >= o.length)
|
||||
continue;
|
||||
newMatrix[newRow] = o[i];
|
||||
newRow++;
|
||||
}
|
||||
return newMatrix;
|
||||
}
|
||||
|
||||
public static boolean[][] MatrixRemoveColumn(boolean[][] o, int col){
|
||||
boolean[][] newMatrix = new boolean[o.length][o[0].length - 1];
|
||||
for (int i = 0; i < o.length; i++) {
|
||||
int newCol = 0;
|
||||
for(int j = 0; j < o[0].length; j++){
|
||||
if(j == col)
|
||||
j++;
|
||||
if(j >= o[0].length)
|
||||
continue;
|
||||
newMatrix[i][newCol] = o[i][j];
|
||||
newCol++;
|
||||
}
|
||||
}
|
||||
return newMatrix;
|
||||
}
|
||||
|
||||
public static boolean isRowOnlyFalse(boolean[][] o, int row){
|
||||
boolean mark = true;
|
||||
for (int i = 0; i < o[row].length; i++) {
|
||||
if(o[row][i])
|
||||
mark = false;
|
||||
}
|
||||
return mark;
|
||||
}
|
||||
|
||||
public static boolean isColumnOnlyFalse(boolean[][] o, int column){
|
||||
boolean mark = true;
|
||||
for (int i = 0; i < o.length; i++) {
|
||||
if(o[i][column])
|
||||
mark = false;
|
||||
}
|
||||
return mark;
|
||||
}
|
||||
}
|
43
app/src/main/java/school_project/Utils/Bitwise.java
Normal file
43
app/src/main/java/school_project/Utils/Bitwise.java
Normal file
@ -0,0 +1,43 @@
|
||||
package school_project.Utils;
|
||||
|
||||
import school_project.Vec2;
|
||||
|
||||
public class Bitwise {
|
||||
|
||||
/**
|
||||
* Check if the bit at pos is 1 or 0
|
||||
* @param b byte to test
|
||||
* @param pos position in b to check
|
||||
* @return true if the bit at pos is 1 or false if it is 0
|
||||
*/
|
||||
public static boolean IsBitSetAt(byte b, int pos){
|
||||
pos = 7 - pos;
|
||||
return (b & (1 << pos))!= 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform a byte (8 bit) to two Nible (4 bit) with a split in the middle
|
||||
* Exemple:
|
||||
* in = 01000101 (=69)
|
||||
* out = { 00000100, 00000101 } (={4, 5})
|
||||
*
|
||||
* @param in the byte to split
|
||||
* @return an arrya of 2 byte ret[0] = left part; ret[1] = right part
|
||||
*/
|
||||
public static Vec2 ByteToNible(byte in){
|
||||
Vec2 ret = new Vec2();
|
||||
ret.x = (byte) (in >> 4);
|
||||
ret.y = (byte) (in & 15); // apply the mask '00001111'
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform 2 byte into 1 with a left part ( 4 bits ) and a right part ( 4 bits)
|
||||
* @param left first 4 bits
|
||||
* @param right last 4 bits
|
||||
* @return concatenated byte
|
||||
*/
|
||||
public static byte NibbleToByte(byte left, byte right){
|
||||
return (byte) ((left << 4) | right);
|
||||
}
|
||||
}
|
64
app/src/main/java/school_project/Utils/MatrixShape.java
Normal file
64
app/src/main/java/school_project/Utils/MatrixShape.java
Normal file
@ -0,0 +1,64 @@
|
||||
package school_project.Utils;
|
||||
|
||||
import javafx.scene.Node;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.paint.Paint;
|
||||
import javafx.scene.shape.Rectangle;
|
||||
import school_project.*;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
|
||||
public class MatrixShape extends GridPane {
|
||||
public Shape shape;
|
||||
public Vec2 boundary_size = new Vec2();
|
||||
private Paint color;
|
||||
public MatrixShape(Shape shape) {
|
||||
super();
|
||||
this.shape = shape;
|
||||
if(shape instanceof Piece){
|
||||
Piece p = (Piece) shape;
|
||||
color = p.getColor();
|
||||
}
|
||||
|
||||
update();
|
||||
|
||||
setHgap(GameUI.SPACE_SIZE);
|
||||
setVgap(GameUI.SPACE_SIZE);
|
||||
}
|
||||
|
||||
public void update(){
|
||||
getChildren().clear();
|
||||
boolean[][] shape_matrix = shape.getShape();
|
||||
for (int i = 0; i < shape_matrix.length; i++) {
|
||||
for (int j = 0; j < shape_matrix[i].length; j++) {
|
||||
Node _cell;
|
||||
if(shape_matrix[i][j]){
|
||||
if(shape instanceof Piece){
|
||||
Piece p = (Piece) shape;
|
||||
_cell = new Rectangle(GameUI.SEGMENT_SIZE, GameUI.SEGMENT_SIZE);
|
||||
((Rectangle) _cell).setFill(color);
|
||||
}else{
|
||||
try {
|
||||
_cell = new ImageView(new Image(new FileInputStream(Controller.class.getResource("tile.png").getFile())));
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
_cell = new Pane();
|
||||
((Pane) _cell).setPrefSize(GameUI.SEGMENT_SIZE, GameUI.SEGMENT_SIZE);
|
||||
}
|
||||
add(_cell, j, i);
|
||||
}
|
||||
}
|
||||
boundary_size = new Vec2((GameUI.SEGMENT_SIZE + GameUI.SPACE_SIZE) * shape.getWidth(), (GameUI.SEGMENT_SIZE + GameUI.SPACE_SIZE) * shape.getHeight());
|
||||
}
|
||||
public void setColor(Paint p) {
|
||||
color = p;
|
||||
}
|
||||
}
|
39
app/src/main/java/school_project/Vec2.java
Normal file
39
app/src/main/java/school_project/Vec2.java
Normal file
@ -0,0 +1,39 @@
|
||||
package school_project;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* This is used to represent a position/vector/... any ensemble of 2 elements that have to work together in
|
||||
* a plan. This way we can use some basic operations over them.
|
||||
*/
|
||||
public class Vec2 implements Serializable {
|
||||
public int x, y;
|
||||
|
||||
public Vec2() {
|
||||
x = 0;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
public Vec2(int x, int y ){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof Vec2) {
|
||||
Vec2 vec = (Vec2) obj;
|
||||
return this.x == vec.x && this.y == vec.y;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Vec2 add(Vec2 o){
|
||||
return new Vec2(x + o.x, y + o.y);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "("+x+","+y+")";
|
||||
}
|
||||
}
|
BIN
app/src/main/resources/school_project/Menu/BackGround-menu.jpg
Normal file
BIN
app/src/main/resources/school_project/Menu/BackGround-menu.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
Binary file not shown.
After Width: | Height: | Size: 423 KiB |
@ -0,0 +1,8 @@
|
||||
.BorderPane{
|
||||
-fx-background-image: url("BackGround-menu.jpg");
|
||||
-fx-background-position:center;
|
||||
}
|
||||
.GridPane{
|
||||
-fx-background-image: url("Background-select-level.jpg");
|
||||
-fx-background-position:right;
|
||||
}
|
1
app/src/main/resources/school_project/level11.level
Normal file
1
app/src/main/resources/school_project/level11.level
Normal file
@ -0,0 +1 @@
|
||||
SMS<05><><EFBFBD><EFBFBD>3<><33>"<22>"<22>"p"<22><11>SME
|
BIN
app/src/main/resources/school_project/tile.png
Normal file
BIN
app/src/main/resources/school_project/tile.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
26
app/src/test/java/school_project/MapGeneratorTest.java
Normal file
26
app/src/test/java/school_project/MapGeneratorTest.java
Normal file
@ -0,0 +1,26 @@
|
||||
package school_project;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class MapGeneratorTest {
|
||||
|
||||
@Test
|
||||
void generate() {
|
||||
Map[] maps = new Map[] {
|
||||
MapGenerator.generate(MapGenerator.Difficulty.Easy),
|
||||
MapGenerator.generate(MapGenerator.Difficulty.Medium),
|
||||
MapGenerator.generate(MapGenerator.Difficulty.Difficult),
|
||||
};
|
||||
|
||||
for(Map m: maps){
|
||||
System.out.println("==========");
|
||||
System.out.println(m);
|
||||
System.out.println("++++++++++++++++++++");
|
||||
for (Piece p: m.getPieces()){
|
||||
System.out.println(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
35
app/src/test/java/school_project/MapTest.java
Normal file
35
app/src/test/java/school_project/MapTest.java
Normal file
@ -0,0 +1,35 @@
|
||||
package school_project;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class MapTest {
|
||||
|
||||
@Test
|
||||
void getUsedSpace() {
|
||||
boolean[][] map_matrix = {
|
||||
{false, true, true, false},
|
||||
{false, true, true, true},
|
||||
{true, true, true, false},
|
||||
{false, true, true, true}
|
||||
};
|
||||
Map testMap = new Map(map_matrix);
|
||||
|
||||
boolean[][] piece1_matrix = {
|
||||
{true, true},
|
||||
{true, true},
|
||||
};
|
||||
Piece piece1 = new Piece(piece1_matrix);
|
||||
testMap.addPiece(piece1);
|
||||
piece1.setPosition(new Vec2(0,1));
|
||||
|
||||
boolean[][] result_matrix = {
|
||||
{false, false, false, false},
|
||||
{false, false, false, true},
|
||||
{true, true, true, false},
|
||||
{false, true, true, true}
|
||||
};
|
||||
assertArrayEquals(result_matrix, testMap.getUsedSpace());
|
||||
}
|
||||
}
|
177
app/src/test/java/school_project/Parsers/BinaryParserTest.java
Normal file
177
app/src/test/java/school_project/Parsers/BinaryParserTest.java
Normal file
@ -0,0 +1,177 @@
|
||||
package school_project.Parsers;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import school_project.Map;
|
||||
import school_project.Piece;
|
||||
import school_project.Vec2;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class BinaryParserTest {
|
||||
|
||||
static byte[] file_data = {
|
||||
'S', 'M', 'S',
|
||||
6, 5, (byte) 0x31, (byte) 0xEC, (byte) 0xF3, (byte) 0xFC,
|
||||
4,
|
||||
(byte) 0x22, (byte) 0x70,
|
||||
(byte) 0x33, (byte) 0x99, (byte) 0x80,
|
||||
(byte) 0x32, (byte) 0x7C,
|
||||
(byte) 0x33, (byte) 0xDB, (byte) 0x80,
|
||||
'S', 'M', 'E'
|
||||
};
|
||||
|
||||
@Test
|
||||
void getByteSizeForMap() {
|
||||
boolean[][] map_shape = {
|
||||
{ true, true, true },
|
||||
{ true, false, true },
|
||||
{ true, true, true },
|
||||
|
||||
};
|
||||
boolean[][] piece1_shape = {
|
||||
{ true, true },
|
||||
{ true, false },
|
||||
{ true, true },
|
||||
|
||||
};
|
||||
boolean[][] piece2_shape = {
|
||||
{ true },
|
||||
{ true },
|
||||
{ true },
|
||||
|
||||
};
|
||||
Map map = new Map(map_shape);
|
||||
Piece piece1 = new Piece(piece1_shape);
|
||||
Piece piece2 = new Piece(piece2_shape);
|
||||
|
||||
map.addPiece(new Piece[]{piece1, piece2});
|
||||
piece2.setPosition(new Vec2(0, 2));
|
||||
|
||||
|
||||
assertEquals(15, BinaryParser.getByteSizeForMap(map, false));
|
||||
assertEquals(19, BinaryParser.getByteSizeForMap(map, true));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void BuildByteFromMatrix(){
|
||||
byte[] map_data = Arrays.copyOfRange(file_data, 5, 9);
|
||||
boolean[][] map_shape = {
|
||||
{false, false, true, true, false, false},
|
||||
{false, true, true, true, true, false},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, true, true, true, true},
|
||||
};
|
||||
assertArrayEquals(map_data, BinaryParser.BuildByteFromMatrix(map_shape));
|
||||
}
|
||||
|
||||
@Test
|
||||
void BuildMatrixFromByte_map(){
|
||||
byte[] map_data = Arrays.copyOfRange(file_data, 5, 9);
|
||||
boolean[][] map_shape = {
|
||||
{false, false, true, true, false, false},
|
||||
{false, true, true, true, true, false},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, true, true, true, true},
|
||||
};
|
||||
assertArrayEquals(map_shape, BinaryParser.BuildMatrixFromBytes(6, 5, map_data));
|
||||
}
|
||||
|
||||
@Test
|
||||
void BuildMatrixFromByte_piece1(){
|
||||
byte[] piece1_data = Arrays.copyOfRange(file_data, 11, 12);
|
||||
boolean[][] piece1_shape = {
|
||||
{false, true},
|
||||
{true, true},
|
||||
};
|
||||
assertArrayEquals(piece1_shape, BinaryParser.BuildMatrixFromBytes(2, 2, piece1_data));
|
||||
}
|
||||
|
||||
@Test
|
||||
void BuildMatrixFromByte_piece2(){
|
||||
byte[] piece2_data = Arrays.copyOfRange(file_data, 13, 15);
|
||||
boolean[][] piece2_shape = {
|
||||
{true, false, false},
|
||||
{true, true, false},
|
||||
{false, true, true},
|
||||
};
|
||||
assertArrayEquals(piece2_shape, BinaryParser.BuildMatrixFromBytes(3, 3, piece2_data));
|
||||
}
|
||||
|
||||
@Test
|
||||
void BuildMatrixFromByte_piece3(){
|
||||
byte[] piece3_data = Arrays.copyOfRange(file_data, 16, 17);
|
||||
boolean[][] piece3_shape = {
|
||||
{false, true, true},
|
||||
{true, true, true},
|
||||
};
|
||||
assertArrayEquals(piece3_shape, BinaryParser.BuildMatrixFromBytes(3, 2, piece3_data));
|
||||
}
|
||||
|
||||
@Test
|
||||
void BuildMatrixFromByte_piece4(){
|
||||
byte[] piece4_data = Arrays.copyOfRange(file_data, 18, 20);
|
||||
boolean[][] piece4_shape = {
|
||||
{true, true, false},
|
||||
{true, true, false},
|
||||
{true, true, true},
|
||||
};
|
||||
assertArrayEquals(piece4_shape, BinaryParser.BuildMatrixFromBytes(3, 3, piece4_data));
|
||||
}
|
||||
|
||||
@Test
|
||||
void ExtractLevelData() throws IOException {
|
||||
boolean[][] expected_map_shape = {
|
||||
{false, false, true, true, false, false},
|
||||
{false, true, true, true, true, false},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, true, true, true, true},
|
||||
};
|
||||
|
||||
byte[] level_data = BinaryParser.ExtractLevelData(new ByteArrayInputStream(file_data));
|
||||
boolean[][] map = BinaryParser.ExtractMapFromLevelData(level_data);
|
||||
|
||||
assertArrayEquals(expected_map_shape, map);
|
||||
}
|
||||
|
||||
@Test
|
||||
void ExtractPiecesFronLevelDataTest() throws IOException {
|
||||
boolean[][] piece1_shape = {
|
||||
{false, true},
|
||||
{true, true},
|
||||
};
|
||||
boolean[][] piece2_shape = {
|
||||
{true, false, false},
|
||||
{true, true, false},
|
||||
{false, true, true},
|
||||
};
|
||||
boolean[][] piece3_shape = {
|
||||
{false, true, true},
|
||||
{true, true, true},
|
||||
};
|
||||
boolean[][] piece4_shape = {
|
||||
{true, true, false},
|
||||
{true, true, false},
|
||||
{true, true, true},
|
||||
};
|
||||
boolean[][][] pieces_shapes = {
|
||||
piece1_shape,
|
||||
piece2_shape,
|
||||
piece3_shape,
|
||||
piece4_shape
|
||||
};
|
||||
byte[] level_data = BinaryParser.ExtractLevelData(new ByteArrayInputStream(file_data));
|
||||
Piece[] pieces = BinaryParser.ExtractPiecesFromLevelData(level_data, false);
|
||||
|
||||
for (int i = 0; i < pieces_shapes.length; i++) {
|
||||
assertArrayEquals(pieces_shapes[i], pieces[i].getShape());
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,103 @@
|
||||
package school_project.Parsers;
|
||||
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
import school_project.Map;
|
||||
import school_project.Piece;
|
||||
import school_project.Vec2;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class FileParserFactoryTest {
|
||||
|
||||
static Map generateMapTest(){
|
||||
boolean[][] map_shape = {
|
||||
{false, false, true, true, false, false},
|
||||
{false, true, true, true, true, false},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, false, false, true, true},
|
||||
{true, true, true, true, true, true},
|
||||
};
|
||||
boolean[][] piece1_shape = {
|
||||
{false, true},
|
||||
{true, true},
|
||||
};
|
||||
boolean[][] piece2_shape = {
|
||||
{true, false, false},
|
||||
{true, true, false},
|
||||
{false, true, true},
|
||||
};
|
||||
boolean[][] piece3_shape = {
|
||||
{false, true, true},
|
||||
{true, true, true},
|
||||
};
|
||||
boolean[][] piece4_shape = {
|
||||
{true, true, false},
|
||||
{true, true, false},
|
||||
{true, true, true},
|
||||
};
|
||||
Piece[] pieces = { new Piece(piece1_shape), new Piece(piece2_shape), new Piece(piece3_shape), new Piece(piece4_shape) };
|
||||
Map map = new Map(map_shape);
|
||||
map.addPiece(pieces);
|
||||
|
||||
pieces[0].setPosition(new Vec2(1, 0));
|
||||
pieces[1].setPosition(new Vec2(3, 0));
|
||||
pieces[2].setPosition(new Vec2(3, 3));
|
||||
pieces[3].setPosition(new Vec2(0, 2));
|
||||
return map;
|
||||
}
|
||||
|
||||
@Test
|
||||
void saveLoadFileFromMap_Binary(@TempDir Path tmpFolder) throws IOException {
|
||||
Map map = generateMapTest();
|
||||
FileParserFactory.saveFileFromMap(tmpFolder.resolve("TestBinaryLevel.level").toFile(), map);
|
||||
|
||||
Map testMap = FileParserFactory.loadMapFromFile(tmpFolder.resolve("TestBinaryLevel.level").toFile());
|
||||
assertArrayEquals(map.getCleanedMap().getShape(), testMap.getShape());
|
||||
for (int i = 0; i < map.getPieces().size(); i++) {
|
||||
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void saveLoadFileFromMap_save_Binary(@TempDir Path tmpFolder) throws IOException {
|
||||
Map map = generateMapTest();
|
||||
FileParserFactory.saveFileFromMap(tmpFolder.resolve("TestBinarySave.slevel").toFile(), map);
|
||||
|
||||
Map testMap = FileParserFactory.loadMapFromFile(tmpFolder.resolve("TestBinarySave.slevel").toFile());
|
||||
assertArrayEquals(map.getShape(), testMap.getShape());
|
||||
for (int i = 0; i < map.getPieces().size(); i++) {
|
||||
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
|
||||
assertEquals(map.getPieces().get(i).getPosition(), testMap.getPieces().get(i).getPosition());
|
||||
}
|
||||
}
|
||||
@Test
|
||||
void saveLoadFileFromMap_Serialized(@TempDir Path tmpFolder) throws IOException {
|
||||
Map map = generateMapTest();
|
||||
FileParserFactory.saveFileFromMap( tmpFolder.resolve("TestSerializedLevel.serialized").toFile(), map);
|
||||
|
||||
Map testMap = FileParserFactory.loadMapFromFile( tmpFolder.resolve("TestSerializedLevel.serialized").toFile());
|
||||
assertArrayEquals(map.getShape(), testMap.getShape());
|
||||
for (int i = 0; i < map.getPieces().size(); i++) {
|
||||
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void saveLoadFileFromMap_save_Serialized(@TempDir Path tmpFolder) throws IOException{
|
||||
Map map = generateMapTest();
|
||||
FileParserFactory.saveFileFromMap(tmpFolder.resolve("TestSerializedSave.sserialized").toFile(), map);
|
||||
|
||||
Map testMap = FileParserFactory.loadMapFromFile(tmpFolder.resolve("TestSerializedSave.sserialized").toFile());
|
||||
assertArrayEquals(map.getShape(), testMap.getShape());
|
||||
for (int i = 0; i < map.getPieces().size(); i++) {
|
||||
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
|
||||
assertEquals(map.getPieces().get(i).getPosition(), testMap.getPieces().get(i).getPosition());
|
||||
}
|
||||
}
|
||||
}
|
@ -17,7 +17,6 @@ class PieceTest {
|
||||
boolean[][] piece1_matrix_result = {
|
||||
{true, false, true},
|
||||
{true, true, false},
|
||||
{false, false, false},
|
||||
};
|
||||
|
||||
boolean[][] piece2_matrix = {
|
||||
@ -31,12 +30,11 @@ class PieceTest {
|
||||
};
|
||||
|
||||
boolean[][] piece3_matrix_result = {
|
||||
{false, false, false},
|
||||
{false, true, true},
|
||||
{true, false, true},
|
||||
};
|
||||
|
||||
Piece piece1 = new Piece();
|
||||
Piece piece1 = new Piece(piece2_matrix);
|
||||
piece1.setShape(piece1_matrix);
|
||||
|
||||
Piece piece2 = new Piece(piece2_matrix);
|
||||
|
@ -1,6 +1,9 @@
|
||||
package school_project;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import school_project.Utils.Array;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
@ -29,6 +32,30 @@ class ShapeTest {
|
||||
{true}
|
||||
};
|
||||
|
||||
boolean[][] matrix_shape5 = {
|
||||
{false, false, false, false, false},
|
||||
{false, false, false, false, false},
|
||||
{false, true, true, true, false},
|
||||
{false, true, false, true, false},
|
||||
{false, false, false, false, false},
|
||||
{false, false, false, false, false},
|
||||
};
|
||||
|
||||
boolean[][] matrix_shape5_result = {
|
||||
{true, true, true},
|
||||
{true, false, true},
|
||||
};
|
||||
|
||||
boolean[][] matrix_shape6 = {
|
||||
{true, false},
|
||||
{false, false}
|
||||
};
|
||||
|
||||
boolean[][] matrix_shape6_result = {
|
||||
{true},
|
||||
};
|
||||
|
||||
System.out.println(Array.isRowOnlyFalse(matrix_shape1, 0));
|
||||
Shape shape1 = new Shape();
|
||||
shape1.setShape(matrix_shape1);
|
||||
assertEquals(3, shape1.getHeight());
|
||||
@ -44,5 +71,11 @@ class ShapeTest {
|
||||
assertEquals(3, shape4.getHeight());
|
||||
assertEquals(1, shape4.getWidth());
|
||||
|
||||
Shape shape5 = new Shape(matrix_shape5);
|
||||
assertArrayEquals(matrix_shape5_result, shape5.getShape());
|
||||
|
||||
Shape shape6 = new Shape(matrix_shape6);
|
||||
assertArrayEquals(matrix_shape6_result, shape6.getShape());
|
||||
|
||||
}
|
||||
}
|
81
app/src/test/java/school_project/Utils/ArrayTest.java
Normal file
81
app/src/test/java/school_project/Utils/ArrayTest.java
Normal file
@ -0,0 +1,81 @@
|
||||
package school_project.Utils;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class ArrayTest {
|
||||
|
||||
@Test
|
||||
void matrixCopyOf() {
|
||||
boolean[][] a = new boolean[][] {
|
||||
{true, false, true},
|
||||
{false, false, false},
|
||||
{true, false, true},
|
||||
};
|
||||
boolean[][] b = new boolean[][] {
|
||||
{true, false, true},
|
||||
{false, false, false},
|
||||
{true, false, true},
|
||||
};
|
||||
boolean[][] c = Array.MatrixCopyOf(a);
|
||||
assertArrayEquals(a, c);
|
||||
a[1][1] = true;
|
||||
assertArrayEquals(b, c);
|
||||
}
|
||||
|
||||
@Test
|
||||
void matrixRemoveRow() {
|
||||
boolean[][] a = new boolean[][] {
|
||||
{true, false, true},
|
||||
{false, false, false},
|
||||
{true, false, true},
|
||||
};
|
||||
boolean[][] b = new boolean[][] {
|
||||
{true, false, true},
|
||||
{true, false, true},
|
||||
};
|
||||
|
||||
boolean[][] result = Array.MatrixRemoveRow(a, 1);
|
||||
assertArrayEquals(b, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void matrixRemoveColumn() {
|
||||
boolean[][] a = new boolean[][] {
|
||||
{true, false, true},
|
||||
{false, false, false},
|
||||
{true, false, true},
|
||||
};
|
||||
boolean[][] b = new boolean[][] {
|
||||
{true, true},
|
||||
{false, false},
|
||||
{true, true},
|
||||
};
|
||||
|
||||
boolean[][] result = Array.MatrixRemoveColumn(a, 1);
|
||||
assertArrayEquals(b, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void isRowOnlyFalse() {
|
||||
boolean[][] a = new boolean[][] {
|
||||
{true, false, true},
|
||||
{false, false, false},
|
||||
{true, false, true},
|
||||
};
|
||||
assertTrue(Array.isRowOnlyFalse(a, 1));
|
||||
assertFalse(Array.isRowOnlyFalse(a, 0));
|
||||
}
|
||||
|
||||
@Test
|
||||
void isColumnOnlyFalse() {
|
||||
boolean[][] a = new boolean[][] {
|
||||
{true, false, true},
|
||||
{false, false, false},
|
||||
{true, false, true},
|
||||
};
|
||||
assertTrue(Array.isColumnOnlyFalse(a, 1));
|
||||
assertFalse(Array.isColumnOnlyFalse(a, 0));
|
||||
}
|
||||
}
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
4
gradlew
vendored
4
gradlew
vendored
@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
|
82
misc/pre-commit.sh
Executable file
82
misc/pre-commit.sh
Executable file
@ -0,0 +1,82 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo 'Lovely Idea';
|
||||
|
||||
BASE_DIR="$(dirname $(readlink -f $0))/.."
|
||||
cd $BASE_DIR
|
||||
echo $BASE_DIR
|
||||
|
||||
function clean() {
|
||||
echo "Cleaning the folder"
|
||||
$BASE_DIR/gradlew clean
|
||||
|
||||
}
|
||||
|
||||
function build() {
|
||||
echo "Building the project"
|
||||
$BASE_DIR/gradlew build
|
||||
|
||||
}
|
||||
|
||||
function test() {
|
||||
echo "Testing the project"
|
||||
$BASE_DIR/gradlew test
|
||||
|
||||
}
|
||||
|
||||
function run() {
|
||||
echo "Running the project"
|
||||
$BASE_DIR/gradlew run &
|
||||
_PID=$!
|
||||
sleep 3
|
||||
killpid $_PID
|
||||
}
|
||||
|
||||
function check_syntax() {
|
||||
echo "Checking the syntax"
|
||||
echo 'TODO Tonitch: check syntax script'
|
||||
|
||||
}
|
||||
|
||||
function make_archive() {
|
||||
echo "Creating the archive on the parent folder"
|
||||
tar --create --gzip --exclude-vcs --exclude-vcs-ignores -f ../archive.tar.gz "${BASE_DIR}/{app/, gradle/, gralew, gradlew.bat, settings.gradle}"
|
||||
}
|
||||
|
||||
case $1 in
|
||||
|
||||
clean )
|
||||
clean ;;
|
||||
|
||||
build )
|
||||
build ;;
|
||||
|
||||
test )
|
||||
test ;;
|
||||
|
||||
run )
|
||||
run ;;
|
||||
|
||||
syntax )
|
||||
check_syntax ;;
|
||||
|
||||
archive )
|
||||
clean &&
|
||||
build &&
|
||||
test &&
|
||||
run &&
|
||||
check_syntax &&
|
||||
make_archive ;;
|
||||
|
||||
all )
|
||||
clean &&
|
||||
build &&
|
||||
test &&
|
||||
run &&
|
||||
check_syntax ;;
|
||||
* )
|
||||
clean &&
|
||||
build &&
|
||||
test &&
|
||||
check_syntax ;;
|
||||
esac
|
77
prototypes/cat_puzzle.py
Normal file
77
prototypes/cat_puzzle.py
Normal file
@ -0,0 +1,77 @@
|
||||
import os
|
||||
import rotate_matrix
|
||||
def turn_piece(piece): #based on a matrix MxN ie [(0,0),(0,0),(0,0)] m = 3 and n = 2
|
||||
new_piece = rotate_matrix.clockwise(piece)
|
||||
return new_piece
|
||||
|
||||
game = True
|
||||
while game:
|
||||
print('Bienvenue dans le jeu cat puzzle')
|
||||
|
||||
choose_level = 0
|
||||
while choose_level == 0:
|
||||
choose_level = input('Choissisez un niveau à résoudre\n') #choose a level of the game
|
||||
try:
|
||||
choose_level = int(choose_level)
|
||||
except ValueError:
|
||||
choose_level= 0
|
||||
print('Il me faut un nombre')
|
||||
if choose_level!=1:
|
||||
choose_level = 0
|
||||
print('Il n\'existe que le niveau 1 pour l\'instant')
|
||||
|
||||
print('Découvrons ensemeble le niveau',choose_level) #make a first level
|
||||
|
||||
if choose_level ==1: #select the level one and print it
|
||||
level_one = [(1,1,1),(1,1,0),(1,1,1)]
|
||||
print(level_one[0])
|
||||
print(level_one[1])
|
||||
print(level_one[2])
|
||||
|
||||
|
||||
print('Voilà les pièces que vous disposez pour complèter le puzzle') #make piece for resolve the puzzle
|
||||
|
||||
piece_for_level = {
|
||||
1:[(1,1),(1,0)],2:[(1,0),(1,0),(1,0)],3:[(1,1)]}
|
||||
|
||||
|
||||
print('Voilà la pièce 1:') #show the piece at the player
|
||||
for i in piece_for_level[1]:
|
||||
print(i)
|
||||
|
||||
print('Voilà la pièce 2:')
|
||||
for i in piece_for_level[2]:
|
||||
print(i)
|
||||
|
||||
print('Voilà la pièce 3:')
|
||||
for i in piece_for_level[3]:
|
||||
print(i)
|
||||
|
||||
choose_piece = 0
|
||||
while choose_piece ==0:
|
||||
choose_piece = input('Choissisez la pièce que vous voulez bouger ? ') #choice of the piece to move
|
||||
try:
|
||||
choose_piece = int(choose_piece)
|
||||
except ValueError:
|
||||
choose_piece =0
|
||||
print('J\'ai besoin d\'un nombre')
|
||||
|
||||
|
||||
|
||||
move_piece = input('Voulez vous tournez la pièce ? (o/n)\n')
|
||||
if move_piece== 'o':
|
||||
print('Voilà la pièce tourner')
|
||||
piece_turn = turn_piece(piece_for_level[choose_piece])
|
||||
for i in piece_turn:
|
||||
print(i)
|
||||
|
||||
m = input('A quelle ligne voulez-vous mettre la pièce ? ')
|
||||
n = input("A quelle colonne voulez-vous mettre la pièce ? ")
|
||||
m,n=m-1,n-1
|
||||
|
||||
|
||||
|
||||
game=False
|
||||
|
||||
|
||||
os.system('pause')
|
BIN
prototypes/interface-menu/BackGround-menu.jpg
Normal file
BIN
prototypes/interface-menu/BackGround-menu.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 MiB |
BIN
prototypes/interface-menu/Background-select-level.jpg
Normal file
BIN
prototypes/interface-menu/Background-select-level.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 423 KiB |
32
prototypes/interface-menu/Road-to-masterU/Level.html
Normal file
32
prototypes/interface-menu/Road-to-masterU/Level.html
Normal file
@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Level - Road to masterU</title>
|
||||
<link href="style-Level.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="select-day">
|
||||
<h1>Day 1</h1>
|
||||
<a href="" class="lien-icone">></a>
|
||||
</section>
|
||||
<section class="select-level">
|
||||
<div class="level"><a href="">1</a></div>
|
||||
<div class="level"><a href="">2</a></div>
|
||||
<div class="level"><a href="">3</a></div>
|
||||
<div class="level"><a href="">4</a></div>
|
||||
<div class="level"><a href="">5</a></div>
|
||||
<div class="level"><a href="">6</a></div>
|
||||
<div class="level"><a href="">7</a></div>
|
||||
<div class="level"><a href="">8</a></div>
|
||||
<div class="level"><a href="">9</a></div>
|
||||
<div class="level"><a href="">10</a></div>
|
||||
|
||||
</section>
|
||||
</main>
|
||||
<footer>
|
||||
<a href="Menu.html" class="back-to-accueil">Menu</a>
|
||||
</footer>
|
||||
|
||||
</body>
|
23
prototypes/interface-menu/Road-to-masterU/Menu.html
Normal file
23
prototypes/interface-menu/Road-to-masterU/Menu.html
Normal file
@ -0,0 +1,23 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Menu - Road to masterU</title>
|
||||
<link href="style-menu.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<section class="title">
|
||||
<h1>ROAD TO MASTERU </h1>
|
||||
</section>
|
||||
<section class="setting">
|
||||
<a href="" class="setting-Play"><h2>Play</h2></a>
|
||||
<a href="Level.html" class="setting-level"><h2>Level</h2></a>
|
||||
</section>
|
||||
</main>
|
||||
<footer>
|
||||
<a href="" class="lien-icone"><img src="../Trophee-pic.jpg" alt="trophy"></a>
|
||||
<a href="" class="lien-icone"><img src="" alt="link-setting"></a>
|
||||
</footer>
|
||||
|
||||
</body>
|
45
prototypes/interface-menu/Road-to-masterU/style-Level.css
Normal file
45
prototypes/interface-menu/Road-to-masterU/style-Level.css
Normal file
@ -0,0 +1,45 @@
|
||||
body{
|
||||
background-image: url("../Background-select-level.jpg");
|
||||
background-position: right;
|
||||
}
|
||||
h1,.lien-icone,.back-to-accueil{
|
||||
font-size: 75px;
|
||||
padding-top: 80px;
|
||||
color:gold;
|
||||
}
|
||||
footer{
|
||||
text-align: center;
|
||||
padding:50px
|
||||
|
||||
}
|
||||
a{
|
||||
text-decoration: none;
|
||||
color:black;
|
||||
}
|
||||
.select-day{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: baseline;
|
||||
|
||||
}
|
||||
.select-level{
|
||||
display:grid;
|
||||
grid-template-columns: 40px 40px 40px;
|
||||
grid-gap: 30px;
|
||||
justify-content: center;
|
||||
}
|
||||
.level{
|
||||
height: 60px;
|
||||
border:3px solid black;
|
||||
|
||||
}
|
||||
.level>a{
|
||||
font-size:30px;
|
||||
display: flex;
|
||||
justify-content:center;
|
||||
}
|
||||
.lien-icone{
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
27
prototypes/interface-menu/Road-to-masterU/style-menu.css
Normal file
27
prototypes/interface-menu/Road-to-masterU/style-menu.css
Normal file
@ -0,0 +1,27 @@
|
||||
body{
|
||||
background-image: url("../BackGround-menu.jpg");
|
||||
background-position: center;
|
||||
}
|
||||
h1{
|
||||
font-size: 75px;
|
||||
padding-top: 80px;
|
||||
text-decoration: underline;
|
||||
}
|
||||
h1,h2{
|
||||
text-align: center;
|
||||
color: gold;
|
||||
}
|
||||
h2{
|
||||
font-size: 50px;
|
||||
padding-top: 40px;
|
||||
}
|
||||
footer{
|
||||
position:absolute;
|
||||
bottom:0;
|
||||
padding-bottom: 10px;
|
||||
right:10px;
|
||||
|
||||
}
|
||||
a{
|
||||
text-decoration: none;
|
||||
}
|
BIN
prototypes/interface-menu/Trophee-pic.jpg
Normal file
BIN
prototypes/interface-menu/Trophee-pic.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
Reference in New Issue
Block a user