-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathother_ncurses.c
130 lines (111 loc) · 3.34 KB
/
other_ncurses.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
129
130
#include <curses.h>
#include <unistd.h>
#define DELAY_DURATION 100
#define KEY_ESCAPE 27
typedef struct star{
int cur_x; /* текущее положение по горизонтали */
int cur_y; /* текущее положение по вертикали */
int max_x; /* максимальный предел терминала по горизонтали */
int max_y; /* максимальный предел терминала по вертикали */
} TypeStar;
void initial_state(TypeStar *s, int x, int y) /* начальное состояние */
{
int walls[s->max_x][s->max_y];
int i, j;
for (i = 0; i <= s->max_x; ++i) {
for (j = 0; j <= s->max_y; ++j) {
walls[i][j] = ' ';
}
}
for (i = 0; i <= s->max_x; ++i) {
for (j = 0; j <= s->max_y; ++j)
walls[i][j] = 'x';
}
for (i = 0; i <= s->max_y; ++i) {
for (j = 0; j <= s->max_x; ++j) {
move(i, j);
addch(walls[j][i]);
refresh();
}
}
s->cur_x = x/2;
s->cur_y = y-1;
move(s->cur_y, s->cur_x);
addch('*');
refresh();
}
void clean_line(TypeStar *s)
{
move(s->cur_y, s->cur_x);
addch(' ');
refresh();
}
void paint_move_star(TypeStar *s)
{
move(s->cur_y, s->cur_x);
addch('*');
refresh();
}
void max_facet(TypeStar *s)
{
if (s->cur_x >= s->max_x) {
s->cur_x = s->max_x - 1;
} else {
if (s->cur_x < 0) {
s->cur_x = 0;
}
}
if (s->cur_y >= s->max_y) {
s->cur_y = s->max_y - 1;
} else {
if (s->cur_y < 0) {
s->cur_y = 0;
}
}
}
void move_star(TypeStar *s, int x, int y)
{
clean_line(s);
s->cur_x += x;
s->cur_y += y;
max_facet(s);
paint_move_star(s);
}
int main()
{
int ord_x, ord_y, key;
TypeStar s;
timeout(DELAY_DURATION); /* эта функция нам понадобится,
когда будет делать функцию автоматической езды без ошибания наших действий */
initscr(); /* вызвали библиотеку*/
curs_set(0); /* скрыть курсив клавиатуры */
cbreak(); /* введеный символ доступен сразу же после ввода */
keypad(stdscr, 1); /* обработка escape поседовательности */
noecho(); /* скрыть отображение введенного символа */
getmaxyx(stdscr, ord_y, ord_x); /* узнать высату и ширину экрана*/
s.max_x = ord_x;
s.max_y = ord_y;
initial_state(&s, ord_x, ord_y);
while((key = getch())!= KEY_ESCAPE) {
switch(key) {
case KEY_UP:
move_star(&s, 0, -1);
break;
case KEY_DOWN:
move_star(&s, 0, 1);
break;
case KEY_LEFT:
move_star(&s, -1, 0);
break;
case KEY_RIGHT:
move_star(&s, 1, 0);
break;
case KEY_RESIZE: /* передает значение если размер экрана
изменился*/
//handle_resize(&x, &y, &max_x, &max_y);
break;
}
}
endwin();
return 0;
}