Index

ncurses-minesweeper / 48ca66b

Terminal game of Minesweeper, implemented in C with ncurses.

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
3230 Sep 2020 15:18ac05185Add arrow key supportJosh Stockin124G

Blob @ ncurses-minesweeper / src / draw / options.c

text/plain5333 bytesdownload raw
1/* ncurses-minesweeper Copyright (c) 2020 Joshua 'joshuas3' Stockin
2 * <https://joshstock.in>
3 * <https://github.com/JoshuaS3/ncurses-minesweeper>
4 *
5 * This software is licensed and distributed under the terms of the MIT License.
6 * See the MIT License in the LICENSE file of this project's root folder.
7 *
8 * This comment block and its contents, including this disclaimer, MUST be
9 * preserved in all copies or distributions of this software's source.
10 */
11
12// TODO: rewrite this POS
13
14#include <ncurses.h>
15
16#include "../state.h"
17#include "pages.h"
18#include "text.h"
19
20const char *options_screen_title = "OPTIONS";
21
22const char *options_screen_width = " Board width:";
23const char *options_screen_height = "Board height:";
24const char *options_screen_minecount = " # of Mines:";
25
26const char *options_screen_back = "Back";
27
28int digit_input(int line, int col) {
29 // input of two digits for int
30 move(line, col);
31 clrtoeol();
32
33 char in1, in2;
34 uint8_t n = 0;
35
36 // digit one (tens)
37 attron(A_UNDERLINE);
38 mvaddch(line, col, ' ');
39 while ((in1 = getch())) {
40 if (in1 >= '0' && in1 <= '9') {
41 n = 10 * (in1 - '0');
42 break;
43 } else if (in1 > 0) // invalid input, beep
44 beep();
45 }
46 attroff(A_UNDERLINE);
47 mvaddch(line, col, in1);
48
49 // digit two (ones)
50 attron(A_UNDERLINE);
51 mvaddch(line, col + 1, ' ');
52 while ((in2 = getch())) {
53 if (in2 >= '0' && in2 <= '9') {
54 n += in2 - '0';
55 break;
56 } else if (in2 > 0) // invalid input, beep
57 beep();
58 }
59 attroff(A_UNDERLINE);
60
61 return n;
62}
63
64int draw_options_screen(game_state *state, int ch) {
65 switch (ch) {
66 case -1:
67 return 0;
68 case KEY_DOWN: {
69 if (state->page_selection < 3)
70 state->page_selection++;
71 else
72 beep();
73 break;
74 }
75 case KEY_UP: {
76 if (state->page_selection > 0)
77 state->page_selection--;
78 else
79 beep();
80 break;
81 }
82 case KEY_RESIZE:
83 clear();
84 break;
85 case ' ':
86 case 10:
87 case KEY_ENTER: {
88 if (state->page_selection == 3) {
89 clear();
90 state->page = Title;
91 state->page_selection = 1;
92 return draw_title_screen(state, 0);
93 }
94 break;
95 }
96 case 0:
97 break;
98 default:
99 beep();
100 }
101
102 int y = centery();
103
104 attron(A_BOLD | COLOR_PAIR(1));
105 mvaddstr(y - 3, centerx(options_screen_title), options_screen_title);
106 attroff(A_BOLD);
107
108 int x = (int)(COLS / 2);
109 mvaddstr(y - 1, x - 10, options_screen_width);
110 mvaddstr(y, x - 10, options_screen_height);
111 mvaddstr(y + 1, x - 10, options_screen_minecount);
112
113 if (state->page_selection == 0) attron(A_STANDOUT);
114 mvprintw(y - 1, x + 4, "%02d", state->board->width);
115 if (state->page_selection == 0) attroff(A_STANDOUT);
116
117 if (state->page_selection == 1) attron(A_STANDOUT);
118 mvprintw(y, x + 4, "%02d", state->board->height);
119 if (state->page_selection == 1) attroff(A_STANDOUT);
120
121 if (state->page_selection == 2) attron(A_STANDOUT);
122 mvprintw(y + 1, x + 4, "%02d", state->board->mine_count);
123 if (state->page_selection == 2) attroff(A_STANDOUT);
124
125 if (state->page_selection == 3) attron(A_STANDOUT);
126 mvaddstr(y + 3, centerx(options_screen_back), options_screen_back);
127 if (state->page_selection == 3) attroff(A_STANDOUT);
128
129 if (ch == ' ' || ch == 10 || ch == KEY_ENTER) {
130 int in = 0;
131 switch (state->page_selection) {
132 case 0: {
133 while ((in = digit_input(y - 1, x + 4))) {
134 if (state->board->mine_count < in * state->board->height - 8)
135 break;
136 else
137 beep();
138 }
139 state->board->width = in;
140 attron(A_STANDOUT);
141 mvprintw(y - 1, x + 4, "%02d", state->board->width);
142 attroff(A_STANDOUT);
143 break;
144 }
145 case 1: {
146 while ((in = digit_input(y, x + 4))) {
147 if (state->board->mine_count < state->board->width * in - 8)
148 break;
149 else
150 beep();
151 }
152 state->board->height = in;
153 attron(A_STANDOUT);
154 mvprintw(y, x + 4, "%02d", state->board->height);
155 attroff(A_STANDOUT);
156 break;
157 }
158 case 2: {
159 while ((in = digit_input(y + 1, x + 4))) {
160 if (in < state->board->width * state->board->height - 8)
161 break;
162 else
163 beep();
164 }
165 state->board->mine_count = in;
166 state->board->mines_left = in;
167 attron(A_STANDOUT);
168 mvprintw(y + 1, x + 4, "%02d", state->board->mine_count);
169 attroff(A_STANDOUT);
170 break;
171 }
172 }
173 state->board->current_cell = state->board->width / 2;
174 }
175
176 attroff(COLOR_PAIR(1));
177
178 return 0;
179}
180