Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
wordle
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
repos.tanguy.cavagna
sequencial programming
wordle
Commits
aaac1e94
Commit
aaac1e94
authored
3 years ago
by
tanguy.cavagna
Browse files
Options
Downloads
Patches
Plain Diff
Nearly working proto (only answer to pick and score)
parent
441f087d
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
ui/ui.c
+47
-16
47 additions, 16 deletions
ui/ui.c
ui/ui.h
+16
-0
16 additions, 0 deletions
ui/ui.h
wordle/wordle.c
+67
-13
67 additions, 13 deletions
wordle/wordle.c
wordle/wordle.h
+5
-0
5 additions, 0 deletions
wordle/wordle.h
with
135 additions
and
29 deletions
ui/ui.c
+
47
−
16
View file @
aaac1e94
#include
"ui.h"
#define MENU_MAX 4
#define TITLE_Y_OFFSET
5
#define MENU_CHOICE_Y_OFFSET 2
3
#define GAMEBOARD_Y_OFFSET 1
0
#define TITLE_Y_OFFSET
2
#define MENU_CHOICE_Y_OFFSET 2
0
#define GAMEBOARD_Y_OFFSET 1
3
//==========================
// PRIVATE
...
...
@@ -12,6 +12,26 @@
WINDOW
*
ui_window
=
NULL
;
WINDOW
*
help
=
NULL
;
char
main_title
[
8
][
64
]
=
{
"$$
\\
$$
\\
$$$$$$
\\
$$$$$$$
\\
$$$$$$$
\\
$$
\\
$$$$$$$$
\\
"
,
"$$ | $
\\
$$ |$$ __$$
\\
$$ __$$
\\
$$ __$$
\\
$$ | $$ _____|"
,
"$$ |$$$
\\
$$ |$$ / $$ |$$ | $$ |$$ | $$ |$$ | $$ | "
,
"$$ $$ $$
\\
$$ |$$ | $$ |$$$$$$$ |$$ | $$ |$$ | $$$$$
\\
"
,
"$$$$ _$$$$ |$$ | $$ |$$ __$$< $$ | $$ |$$ | $$ __| "
,
"$$$ /
\\
$$$ |$$ | $$ |$$ | $$ |$$ | $$ |$$ | $$ | "
,
"$$ /
\\
$$ | $$$$$$ |$$ | $$ |$$$$$$$ |$$$$$$$$
\\
$$$$$$$$
\\
"
,
"
\\
__/
\\
__|
\\
______/
\\
__|
\\
__|
\\
_______/
\\
________|
\\
________|"
};
char
mode_solo_title
[
8
][
40
]
=
{
" $$$$$$
\\
$$$$$$
\\
$$
\\
$$$$$$
\\
"
,
"$$ __$$
\\
$$ __$$
\\
$$ | $$ __$$
\\
"
,
"$$ /
\\
__|$$ / $$ |$$ | $$ / $$ |"
,
"
\\
$$$$$$
\\
$$ | $$ |$$ | $$ | $$ |"
,
"
\\
____$$
\\
$$ | $$ |$$ | $$ | $$ |"
,
"$$
\\
$$ |$$ | $$ |$$ | $$ | $$ |"
,
"
\\
$$$$$$ | $$$$$$ |$$$$$$$$
\\
$$$$$$ |"
,
"
\\
______/
\\
______/
\\
________|
\\
______/ "
};
char
mode_1v1_title
[
8
][
54
]
=
{
" $$
\\
$$
\\
$$
\\
$$
\\
"
,
"$$$$ | $$ | $$ | $$$$ |"
,
"
\\
_$$ | $$ | $$ | $$$$$$$
\\
\\
_$$ |"
,
" $$ |
\\
$$
\\
$$ |$$ _____| $$ |"
,
" $$ |
\\
$$
\\
$$ /
\\
$$$$$$
\\
$$ |"
,
" $$ |
\\
$$$ /
\\
____$$
\\
$$ |"
,
" $$$$$$
\\
\\
$ / $$$$$$$ | $$$$$$
\\
"
,
"
\\
______|
\\
_/
\\
_______/
\\
______|"
};
char
mode_computer_title
[
8
][
21
]
=
{
"$$$$$$
\\
$$$$$$
\\
"
,
"
\\
_$$ _|$$ __$$
\\
"
,
" $$ | $$ / $$ |"
,
" $$ | $$$$$$$$ |"
,
" $$ | $$ __$$ |"
,
" $$ | $$ | $$ |"
,
"$$$$$$
\\
$$ | $$ |"
,
"
\\
______|
\\
__|
\\
__|"
};
/**
* @brief Set the color scheme of the programm
*
...
...
@@ -75,6 +95,28 @@ void hide_help() {
//==========================
void
printw_center
(
char
*
foo
,
int
line
)
{
mvaddstr
(
line
,
TERM_MID_COLS
-
(
strlen
(
foo
)
/
2
),
foo
);
}
void
draw_title
(
int
id
)
{
for
(
int
i
=
0
;
i
<
TITLES_LINE_COUNT
;
i
++
)
{
switch
(
id
)
{
case
MAIN_TITLE_ID
:
printw_center
(
main_title
[
i
],
i
+
TITLE_Y_OFFSET
);
break
;
case
SOLO_TITLE_ID
:
printw_center
(
mode_solo_title
[
i
],
i
+
TITLE_Y_OFFSET
);
break
;
case
ONE_V_ONE_TITLE_ID
:
printw_center
(
mode_1v1_title
[
i
],
i
+
TITLE_Y_OFFSET
);
break
;
case
COMPUTER_TITLE_ID
:
printw_center
(
mode_computer_title
[
i
],
i
+
TITLE_Y_OFFSET
);
break
;
}
}
}
bool
init_term
()
{
ui_window
=
initscr
();
cbreak
();
...
...
@@ -108,20 +150,9 @@ void cleanup_term() {
int
show_menu
()
{
hide_help
();
char
title
[
8
][
64
]
=
{
"$$
\\
$$
\\
$$$$$$
\\
$$$$$$$
\\
$$$$$$$
\\
$$
\\
$$$$$$$$
\\
"
,
"$$ | $
\\
$$ |$$ __$$
\\
$$ __$$
\\
$$ __$$
\\
$$ | $$ _____|"
,
"$$ |$$$
\\
$$ |$$ / $$ |$$ | $$ |$$ | $$ |$$ | $$ | "
,
"$$ $$ $$
\\
$$ |$$ | $$ |$$$$$$$ |$$ | $$ |$$ | $$$$$
\\
"
,
"$$$$ _$$$$ |$$ | $$ |$$ __$$< $$ | $$ |$$ | $$ __| "
,
"$$$ /
\\
$$$ |$$ | $$ |$$ | $$ |$$ | $$ |$$ | $$ | "
,
"$$ /
\\
$$ | $$$$$$ |$$ | $$ |$$$$$$$ |$$$$$$$$
\\
$$$$$$$$
\\
"
,
"
\\
__/
\\
__|
\\
______/
\\
__|
\\
__|
\\
_______/
\\
________|
\\
________|"
};
// Title print
if
(
!
window_too_small
())
{
for
(
int
i
=
0
;
i
<
8
;
i
++
)
printw_center
(
title
[
i
],
i
+
TITLE_Y_OFFSET
);
}
if
(
!
window_too_small
())
draw_title
(
MAIN_TITLE_ID
);
// Menu print
attron
(
COLOR_PAIR
(
GREEN_PAIR
));
...
...
This diff is collapsed.
Click to expand it.
ui/ui.h
+
16
−
0
View file @
aaac1e94
...
...
@@ -23,6 +23,15 @@
#define MENU_COMPUTER 2
#define MENU_QUIT 3
// Title lengths
#define TITLES_LINE_COUNT 8
// Title IDs
#define MAIN_TITLE_ID 0
#define SOLO_TITLE_ID 1
#define ONE_V_ONE_TITLE_ID 2
#define COMPUTER_TITLE_ID 3
// Control key handler
#define ctrl(x) ((x)&0x1f)
...
...
@@ -40,6 +49,13 @@
*/
void
printw_center
(
char
*
foo
,
int
line
);
/**
* @brief Print a big title
*
* @param id
*/
void
draw_title
(
int
id
);
/**
* @brief Initialize the terminal
*
...
...
This diff is collapsed.
Click to expand it.
wordle/wordle.c
+
67
−
13
View file @
aaac1e94
...
...
@@ -35,9 +35,13 @@ void initialize_game() {
/**
* @brief Terminate a game
*/
void
terminate_game
()
{
_game_finished
=
true
;
void
terminate_game
()
{
_game_finished
=
true
;
}
/**
* @brief Destroy a game
*
*/
void
destroy_game
()
{
for
(
int
i
=
0
;
i
<
TRIES_COUNT
;
i
++
)
{
free
(
tries
[
i
]);
free
(
validations
[
i
]);
...
...
@@ -47,6 +51,22 @@ void terminate_game() {
free
(
validations
);
}
/**
* @brief Restart the game
*
*/
void
restart_game
()
{
current_try_id
=
0
;
current_try_letter_id
=
0
;
for
(
int
i
=
0
;
i
<
TRIES_COUNT
;
i
++
)
{
for
(
int
j
=
0
;
j
<
WORD_LENGHT
;
j
++
)
{
validations
[
i
][
j
]
=
0
;
tries
[
i
][
j
]
=
'\0'
;
}
}
}
/**
* @brief Condition(s) to lose a game
*
...
...
@@ -55,21 +75,36 @@ void terminate_game() {
*/
bool
lose_condition
()
{
return
(
current_try_id
>
TRIES_COUNT
-
1
);
}
/**
* @brief Condition(s) to win a game
*
* @return true
* @return false
*/
bool
win_condition
()
{
for
(
int
i
=
0
;
i
<
WORD_LENGHT
;
i
++
)
{
if
(
validations
[
current_try_id
-
(
current_try_id
>
0
?
1
:
0
)][
i
]
!=
LETTER_PLACED
)
return
false
;
}
return
true
;
}
/**
* @brief Render the game for the selected gamemode
*/
void
render_game
()
{
switch
(
gamemode
)
{
case
GAMEMODE_SOLO
:
printw_center
(
"Solo"
,
5
);
draw_title
(
SOLO_TITLE_ID
);
break
;
case
GAMEMODE_1_V_1
:
printw_center
(
"Player 1"
,
5
);
draw_title
(
ONE_V_ONE_TITLE_ID
);
break
;
case
GAMEMODE_COMPUTER
:
printw_center
(
"Computer assisted"
,
5
);
draw_title
(
COMPUTER_TITLE_ID
);
break
;
}
...
...
@@ -89,11 +124,27 @@ bool validate_letter(int key) { return (islower(key) || isupper(key)); }
* @brief Validate the last guess
*/
int
*
validate_guess
(
char
answer
[
WORD_LENGHT
],
char
try
[
WORD_LENGHT
])
{
int
a
[
WORD_LENGHT
]
=
{
0
,
2
,
0
,
1
,
0
};
int
*
validation
=
calloc
(
WORD_LENGHT
,
sizeof
(
int
));
char
cpy
[
WORD_LENGHT
+
1
];
strcpy
(
cpy
,
answer
);
for
(
int
i
=
0
;
i
<
WORD_LENGHT
;
i
++
)
{
if
(
strchr
(
cpy
,
try
[
i
])
==
NULL
)
continue
;
for
(
int
i
=
0
;
i
<
WORD_LENGHT
;
i
++
)
validation
[
i
]
=
a
[
i
];
if
(
try
[
i
]
==
answer
[
i
])
{
validation
[
i
]
=
LETTER_PLACED
;
cpy
[
i
]
=
' '
;
continue
;
}
char
*
addr
;
if
((
addr
=
strchr
(
answer
,
try
[
i
]))
!=
NULL
)
{
validation
[
i
]
=
LETTER_WRONG_PLACE
;
cpy
[(
int
)(
addr
-
answer
)]
=
' '
;
// Get the index of the found char
continue
;
}
}
return
validation
;
}
...
...
@@ -137,15 +188,16 @@ void launch_game() {
initialize_game
();
while
(
!
game_finished
())
{
// Render
render_game
();
// Guard clause
if
(
lose_condition
())
{
terminate_game
();
if
(
win_condition
()
||
lose_condition
())
{
restart_game
();
handle_controls
(
getch
());
continue
;
}
// Render
render_game
();
// Key handling
// || Need to check letter by letter every time to be able to continue using
// || shortcut keys like Ctrl+h during a guess.
...
...
@@ -168,6 +220,8 @@ void launch_game() {
handle_controls
(
key
);
refresh
();
}
destroy_game
();
}
bool
game_finished
()
{
return
_game_finished
;
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
wordle/wordle.h
+
5
−
0
View file @
aaac1e94
...
...
@@ -15,6 +15,11 @@
#define TRIES_COUNT 6
#define WORD_LENGHT 5
// Try validation values
#define LETTER_PLACED 2
#define LETTER_WRONG_PLACE 1
#define LETTER_NOT_PRESENT 0
/**
* @brief Set the gamemode
*
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment