Index

ncurses-minesweeper / 4740774

Terminal game of Minesweeper, implemented in C with ncurses.

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
2217 Sep 2020 22:139c8d69cFix rendering and logic issuesJosh Stockin110G

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

text/plain5356 bytesdownload raw
1/* ncurses-minesweeper Copyright (c) 2020 Joshua 'joshuas3' Stockin
2 * <https://joshstock.in>
3 * <https://github.com/JoshuaS3/lognestmonster>
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 'j':
69 case 'J': {
70 if (state->page_selection < 3)
71 state->page_selection++;
72 else
73 beep();
74 break;
75 }
76 case 'k':
77 case 'K': {
78 if (state->page_selection > 0)
79 state->page_selection--;
80 else
81 beep();
82 break;
83 }
84 case KEY_RESIZE:
85 clear();
86 break;
87 case ' ':
88 case 10:
89 case KEY_ENTER: {
90 if (state->page_selection == 3) {
91 clear();
92 state->page = Title;
93 state->page_selection = 1;
94 return draw_title_screen(state, 0);
95 }
96 break;
97 }
98 case 0:
99 break;
100 default:
101 beep();
102 }
103
104 int y = centery();
105
106 attron(A_BOLD | COLOR_PAIR(1));
107 mvaddstr(y - 3, centerx(options_screen_title), options_screen_title);
108 attroff(A_BOLD);
109
110 int x = (int)(COLS / 2);
111 mvaddstr(y - 1, x - 10, options_screen_width);
112 mvaddstr(y, x - 10, options_screen_height);
113 mvaddstr(y + 1, x - 10, options_screen_minecount);
114
115 if (state->page_selection == 0) attron(A_STANDOUT);
116 mvprintw(y - 1, x + 4, "%02d", state->board->width);
117 if (state->page_selection == 0) attroff(A_STANDOUT);
118
119 if (state->page_selection == 1) attron(A_STANDOUT);
120 mvprintw(y, x + 4, "%02d", state->board->height);
121 if (state->page_selection == 1) attroff(A_STANDOUT);
122
123 if (state->page_selection == 2) attron(A_STANDOUT);
124 mvprintw(y + 1, x + 4, "%02d", state->board->mine_count);
125 if (state->page_selection == 2) attroff(A_STANDOUT);
126
127 if (state->page_selection == 3) attron(A_STANDOUT);
128 mvaddstr(y + 3, centerx(options_screen_back), options_screen_back);
129 if (state->page_selection == 3) attroff(A_STANDOUT);
130
131 if (ch == ' ' || ch == 10 || ch == KEY_ENTER) {
132 int in = 0;
133 switch (state->page_selection) {
134 case 0: {
135 while ((in = digit_input(y - 1, x + 4))) {
136 if (state->board->mine_count < in * state->board->height - 9)
137 break;
138 else
139 beep();
140 }
141 state->board->width = in;
142 attron(A_STANDOUT);
143 mvprintw(y - 1, x + 4, "%02d", state->board->width);
144 attroff(A_STANDOUT);
145 break;
146 }
147 case 1: {
148 while ((in = digit_input(y, x + 4))) {
149 if (state->board->mine_count < state->board->width * in - 9)
150 break;
151 else
152 beep();
153 }
154 state->board->height = in;
155 attron(A_STANDOUT);
156 mvprintw(y, x + 4, "%02d", state->board->height);
157 attroff(A_STANDOUT);
158 break;
159 }
160 case 2: {
161 while ((in = digit_input(y + 1, x + 4))) {
162 if (in < state->board->width * state->board->height - 9)
163 break;
164 else
165 beep();
166 }
167 state->board->mine_count = in;
168 state->board->mines_left = in;
169 attron(A_STANDOUT);
170 mvprintw(y + 1, x + 4, "%02d", state->board->mine_count);
171 attroff(A_STANDOUT);
172 break;
173 }
174 }
175 state->board->current_cell = state->board->width / 2;
176 }
177
178 attroff(COLOR_PAIR(1));
179
180 return 0;
181}
182