Skip to content
Snippets Groups Projects
Commit b5b91931 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Clean / improve / update code

parent 7c075054
No related branches found
No related tags found
1 merge request!27Resolve "Clean / improve / update code"
Pipeline #6107 passed
Showing
with 29 additions and 252 deletions
......@@ -37,7 +37,7 @@ if (keystorePropertiesFile.exists()) {
}
android {
compileSdkVersion 33
compileSdkVersion 34
namespace "org.benoitharrault.puissance4"
defaultConfig {
......
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=1.0.21
app.versionCode=22
app.versionName=1.1.0
app.versionCode=23
File added
File added
File added
File added
{
"app_name": "4 in a row",
"settings_title": "Settings",
"settings_label_theme": "Theme mode",
"about_title": "Informations",
"about_content": "4 in a row",
"about_version": "Version: {version}",
"": ""
}
{
"app_name": "Puissance 4",
"settings_title": "Réglages",
"settings_label_theme": "Thème de couleurs",
"about_title": "Informations",
"about_content": "Puissance 4.",
"about_version": "Version : {version}",
"": ""
}
assets/ui/button_back.png

2.37 KiB

assets/ui/button_delete_saved_game.png

7.65 KiB

assets/ui/button_resume_game.png

3.35 KiB

assets/ui/button_start.png

2.99 KiB

assets/ui/game_draw.png

170 B

assets/ui/game_fail.png

170 B

assets/ui/game_win.png

7.75 KiB

assets/ui/placeholder.png

170 B

Clean / improve / update code and UI.
Nettoyage / amélioration / mise à jour de code et de l'interface.
#! /bin/bash
# Check dependencies
command -v inkscape >/dev/null 2>&1 || { echo >&2 "I require inkscape but it's not installed. Aborting."; exit 1; }
command -v scour >/dev/null 2>&1 || { echo >&2 "I require scour but it's not installed. Aborting."; exit 1; }
command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not installed. Aborting."; exit 1; }
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
BASE_DIR="$(dirname "${CURRENT_DIR}")"
ASSETS_DIR="${BASE_DIR}/assets"
OPTIPNG_OPTIONS="-preserve -quiet -o7"
ICON_SIZE=192
#######################################################
# Game images
AVAILABLE_GAME_IMAGES="
"
# Settings images
AVAILABLES_GAME_SETTINGS="
"
#######################################################
# optimize svg
function optimize_svg() {
SOURCE="$1"
cp ${SOURCE} ${SOURCE}.tmp
scour \
--remove-descriptive-elements \
--enable-id-stripping \
--enable-viewboxing \
--enable-comment-stripping \
--nindent=4 \
--quiet \
-i ${SOURCE}.tmp \
-o ${SOURCE}
rm ${SOURCE}.tmp
}
# build icons
function build_icon() {
SOURCE="$1"
TARGET="$2"
echo "Building ${TARGET}"
if [ ! -f "${SOURCE}" ]; then
echo "Missing file: ${SOURCE}"
exit 1
fi
optimize_svg "${SOURCE}"
inkscape \
--export-width=${ICON_SIZE} \
--export-height=${ICON_SIZE} \
--export-filename=${TARGET} \
${SOURCE}
optipng ${OPTIPNG_OPTIONS} ${TARGET}
}
function build_settings_icons() {
INPUT_STRING="$1"
SETTING_NAME="$(echo "${INPUT_STRING}" | cut -d":" -f1)"
SETTING_VALUES="$(echo "${INPUT_STRING}" | cut -d":" -f2 | tr "," " ")"
for SETTING_VALUE in ${SETTING_VALUES}
do
SETTING_CODE="${SETTING_NAME}_${SETTING_VALUE}"
build_icon ${CURRENT_DIR}/${SETTING_CODE}.svg ${ASSETS_DIR}/icons/${SETTING_CODE}.png
done
}
#######################################################
# Create output folders
mkdir -p ${ASSETS_DIR}/icons
# Delete existing generated images
find ${ASSETS_DIR}/icons -type f -name "*.png" -delete
# build game images
for GAME_IMAGE in ${AVAILABLE_GAME_IMAGES}
do
build_icon ${CURRENT_DIR}/${GAME_IMAGE}.svg ${ASSETS_DIR}/icons/${GAME_IMAGE}.png
done
# build settings images
for GAME_SETTING in ${AVAILABLES_GAME_SETTINGS}
do
build_settings_icons "${GAME_SETTING}"
done
import 'package:puissance4/coordinate.dart';
import 'package:puissance4/match_page.dart';
class Board {
List<List<Color?>> _boxes = List.generate(
7,
(i) => List.generate(
7,
(i) => null,
),
);
Board();
Board.from(List<List<Color?>> boxes) {
_boxes = boxes;
}
Color? getBox(Coordinate coordinate) => _boxes[coordinate.col ?? 0][coordinate.row ?? 0];
int getColumnTarget(int? col) => _boxes[col ?? 0].lastIndexOf(null);
void setBox(Coordinate coordinate, Color? player) =>
_boxes[coordinate.col ?? 0][coordinate.row ?? 0] = player;
bool checkWinner(Coordinate coordinate, Color? player) {
return checkHorizontally(coordinate, player) ||
checkVertically(coordinate, player) ||
checkDiagonally(coordinate, player);
}
bool checkHorizontally(Coordinate coordinate, Color? player) {
var r = 0;
for (;
(coordinate.col ?? 0) + r < 7 &&
r < 4 &&
getBox(coordinate.copyWith(col: (coordinate.col ?? 0) + r)) == player;
++r) {}
if (r >= 4) {
return true;
}
var l = 0;
for (;
(coordinate.col ?? 0) - l >= 0 &&
l < 4 &&
getBox(coordinate.copyWith(col: (coordinate.col ?? 0) - l)) == player;
++l) {}
if (l >= 4 || l + r >= 5) {
return true;
}
return false;
}
bool checkDiagonally(Coordinate coordinate, Color? player) {
var ur = 0;
for (;
(coordinate.col ?? 0) + ur < 7 &&
(coordinate.row ?? 0) + ur < 7 &&
ur < 4 &&
getBox(coordinate.copyWith(
col: (coordinate.col ?? 0) + ur,
row: (coordinate.row ?? 0) + ur,
)) ==
player;
++ur) {}
if (ur >= 4) {
return true;
}
var dl = 0;
for (;
(coordinate.col ?? 0) - dl >= 0 &&
(coordinate.row ?? 0) - dl >= 0 &&
dl < 4 &&
getBox(coordinate.copyWith(
col: (coordinate.col ?? 0) - dl,
row: (coordinate.row ?? 0) - dl,
)) ==
player;
++dl) {}
if (dl >= 4 || dl + ur >= 5) {
return true;
}
var dr = 0;
for (;
(coordinate.col ?? 0) + dr < 7 &&
(coordinate.row ?? 0) - dr >= 0 &&
dr < 4 &&
getBox(coordinate.copyWith(
col: (coordinate.col ?? 0) + dr,
row: (coordinate.row ?? 0) - dr,
)) ==
player;
++dr) {}
if (dr >= 4) {
return true;
}
var ul = 0;
for (;
(coordinate.col ?? 0) - ul >= 0 &&
(coordinate.row ?? 0) + ul < 7 &&
ul < 4 &&
getBox(coordinate.copyWith(
col: (coordinate.col ?? 0) - ul,
row: (coordinate.row ?? 0) + ul,
)) ==
player;
++ul) {}
if (ul >= 4 || dr + ul >= 5) {
return true;
}
return false;
}
bool checkVertically(Coordinate coordinate, Color? player) {
var u = 0;
for (;
(coordinate.row ?? 0) + u < 7 &&
u < 4 &&
getBox(coordinate.copyWith(
row: (coordinate.row ?? 0) + u,
)) ==
player;
++u) {}
if (u >= 4) {
return true;
}
var d = 0;
for (;
(coordinate.row ?? 0) - d >= 0 &&
d < 4 &&
getBox(coordinate.copyWith(
row: (coordinate.row ?? 0) - d,
)) ==
player;
++d) {}
if (d >= 4 || d + u >= 5) {
return true;
}
return false;
}
Board clone() {
return Board.from(_boxes.map((c) => c.map((b) => b).toList()).toList());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment