1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
/* TODO: check for compatibility with different implementations */
#include <curses.h>
#include "clicker-ncurses.h"
int
main (void)
{
/* Initialize NCurses screen and get the default window, stdscr */
if ( ! initscr() )
{
printf("Too little amount of memory\n");
return 1;
}
/* This fixes the problem of input that shows up */
noecho();
/* Place a border with default settings (0 means default) */
border(0, 0, 0, 0, 0, 0, 0, 0);
/* Get window size */
int sy, sx;
getmaxyx(stdscr, sy, sx);
/* Place a string onto the window in the center */
char *name = "NCurses clicker";
mvprintw(0, sx / 2 - strlen(name) / 2, name);
char *help = "[ ] - click, [q]uit, [u]pgrade";
mvprintw(sy - 2, sx / 2 - strlen(help) / 2, help);
mvprintw(3, 1, "Score:\n");
mvprintw(5, 1, "Points by click:\n");
mvprintw(7, 1, "Required score to update:\n");
/* Refresh our window to include settings above */
refresh();
/* Initialize the structure and set the values */
struct game *cur_game = malloc(sizeof(struct game));
cur_game->click = 1;
cur_game->multiplifier = 128;
cur_game->score = 0;
/* The main loop that also catches user input */
int ch = 0;
while (ch = getch())
{
switch (ch)
{
/* TODO: Make a delay between clicks, it is possible either via X, or custom Linux APIs that cannot be used in cross-platform software */
case ' ':
render_values(cur_game, cur_game->score + cur_game->click, cur_game->click, cur_game->multiplifier);
break;
case 'q':
goto endwin;
case 'u':
if (cur_game->score >= cur_game->click * cur_game->multiplifier)
{
render_values(cur_game, 0, ++cur_game->click, cur_game->multiplifier * 2);
}
break;
}
if (cur_game->score < 0)
{
render_values(cur_game, 0, cur_game->click, cur_game->multiplifier);
}
}
/* Remove the main window and exit */
endwin: endwin();
printf("You have got %d points.\n", cur_game->score);
/* TODO: deal with memory leaks */
free(cur_game);
exit(EXIT_SUCCESS);
}
void
render_values (struct game *game, int score, int click, int multiplifier)
{
int score_len = snprintf(NULL, 0, "%d", game->score);
for (int i = 0; i < score_len; ++i)
{
mvaddch(4, i + 1, ' ');
refresh();
}
game->score = score;
game->click = click;
game->multiplifier = multiplifier;
mvprintw(4, 1, "%d", game->score);
mvprintw(6, 1, "%d", game->click);
mvprintw(8, 1, "%d", game->multiplifier * game->click);
}
|