-
Notifications
You must be signed in to change notification settings - Fork 0
/
ui.c
128 lines (117 loc) · 3.39 KB
/
ui.c
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "battle_ship.h"
int main () {
printf ("\e[s"); //store cursor position
printf ("\e[?1049h"); //store window in buffer
printf ("\e[2J"); //clear screen
struct termios saved_state = set_non_canonical ();
print_grid (206);
while (getchar () != 'q');
set_canonical (saved_state);//reset terminal
printf ("\e[u\n"); //restore cursor position
printf ("\e[?1049l"); //restore the terminal window
return EXIT_SUCCESS;
}
// For howard
char get_key () {
char signal;
char key;
bool escape;
signal = getchar ();
if (0x1b == signal) {
escape = true;
if (0x5b == getchar ()) {
signal = getchar ();
}
} else {
escape = false;
}
if (escape) {
switch (signal) {
case 0x41: key = 'U'; break;
case 0x42: key = 'D'; break;
case 0x43: key = 'R'; break;
case 0x44: key = 'L'; break;
default: key = 'x'; break;
}
} else {
switch (signal) {
case 0x77: case 0x57: key = 'U'; break;
case 0x73: case 0x53: key = 'D'; break;
case 0x64: case 0x44: key = 'R'; break;
case 0x61: case 0x41: key = 'L'; break;
case 0x72: case 0x52: key = 'r'; break;
case 0x71: case 0x51: key = 'q'; break;
case 0x69: case 0x49:
case 0x68: case 0x48: key = 'h'; break;
default: key = 'x'; break;
}
}
return key;
}
void print_grid (int start_pos) {
/*
* Avaliable position:
* row: 01 ~ 04
* col: 01 ~ 81
*/
unsigned short int r, c; // row and column
char column_num = 'A';
bool labeled = false;
int row;
int col;
row = start_pos / 100;
col = start_pos % 100;
/*
* For positions in method 2.
* row = start_pos / 12 + 1;
* col = start_pos % 12 + 1;
*/
for (r=0;r<ROWS;r++) {
if (r % 3 == 1) { // grid_size + 1
printf ("\e[%d;%dH", r + row, col);
for (c=0;c<COLS;c++) {
if (c % 5 == 2) { // grid_size * 2 + 1
printf ("+");
} else {
printf ("-");
}
}
} else {
printf ("\e[%d;%dH", r + row, col);
for (c=0;c<COLS;c++) {
if (r == 0) {
if (c % 5 == 4) {
printf ("%c", column_num);
column_num++;
labeled = true;
}
}
if (c % 5 == 2) { // grid_size * 2 + 1
printf ("|");
} else {
if (labeled) {
labeled = false;
continue;
}
printf (" ");
}
}
if (r % 3 == 2) {
printf ("\e[%d;%dH%02d", r + row, col, r / 3 + 1);
}
}
}
}
struct termios set_non_canonical () {
struct termios old_info;
tcgetattr(0, &old_info);
struct termios info = old_info;
info.c_lflag &= ~(ICANON | ECHO);
info.c_cc[VMIN] = 1;
info.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &info);
return old_info;
}
void set_canonical (struct termios old) {
tcsetattr(0, TCSANOW, &old);
}