- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
const int x_size(20), y_size(10); int x_pos(x_size/2+1); int y_pos(y_size/2+1);
enum border_types{lineNL, single, singleNL};
enum directions{UpLeft=1, UpRight, DownLeft, DownRight}dir;
void draw_border(enum border_types borders) {
do{
if(borders == single || borders == singleNL) break;
for(int i=0; i<x_size+1; i++)
putchar('#');
}while(false);
putchar('#');
if(borders == singleNL || borders == lineNL) std::cout << '\n';}
void display_update() {
system("cls");
draw_border(lineNL);
for(int i=1; i<=y_size; i++)
{
draw_border(single);
for(int j=1; j<=x_size; j++)
{
if(j == x_pos && i == y_pos)
{
putchar('x');
continue;
}
putchar(32);
}
draw_border(singleNL);;
}
draw_border(lineNL);
std::cout << "X: " << x_pos << "\tY: " << y_pos;}
void logic() {
switch(x_pos)
{
case 1:
if(dir == UpLeft) dir = UpRight;
if(dir == DownLeft) dir = DownRight;
break;
case x_size:
if(dir == UpRight) dir = UpLeft;
if(dir == DownRight) dir = DownLeft;
}
switch(y_pos)
{
case 1:
if(dir == UpLeft) dir = DownLeft;
if(dir == UpRight) dir = DownRight;
break;
case y_size:
if(dir == DownLeft) dir = UpLeft;
if(dir == DownRight) dir = UpRight;
}}
void move() {
switch(dir)
{
case UpLeft:
x_pos--;
y_pos--;
break;
case UpRight:
x_pos++;
y_pos--;
break;
case DownLeft:
x_pos--;
y_pos++;
break;
case DownRight:
x_pos++;
y_pos++;
}}
int main() {
srand(time(0));
rand();
switch(rand()%4+1)
{
case UpLeft:
dir = UpLeft;
break;
case UpRight:
dir = UpRight;
break;
case DownLeft:
dir = DownLeft;
break;
case DownRight:
dir = DownRight;
}
while(!kbhit())
{
display_update();
logic();
move();
}
return 0;}
Сорян, пришлось уплотнить фигурные скобки, чтобы код уместился в 100 строк.
Pig 18.09.2020 20:42 # 0
> return 0;}
Какая экономия )))
BelCodeMonkey 18.09.2020 20:56 # 0
bormand 18.09.2020 20:52 # +2
Ну раз уж на венду завязался, поюзай виндовые апишки. Там и очистка экрана и перемещение курсора есть и цвета. Всё лучше, чем процесс поднимать на каждый фрейм.
oaoaoammm 19.09.2020 03:00 # 0
MAKAKA 19.09.2020 03:04 # +1
но лучше конечно сделать это через ConsoleApi на винде и через ncruses напрямую на Linux: последнее будет совместимо с любым униксом
Правда я вот не уверен про переносимость
<conio.h> азаза
bormand 19.09.2020 03:11 # 0
MAKAKA 19.09.2020 03:14 # 0
а в досе был cls?
bormand 19.09.2020 03:16 # 0
З.Ы. Но в старом конио и clrscr() был. Просрали все полимеры.
MAKAKA 19.09.2020 03:17 # 0
а туда он из CP/M небось?
Кстати, почему в паскале conio назывался crt?
bormand 19.09.2020 03:18 # 0
MAKAKA 19.09.2020 03:19 # 0
3.14159265 19.09.2020 03:20 # 0
bormand 19.09.2020 12:22 # 0
bormand 19.09.2020 03:13 # 0
MAKAKA 19.09.2020 03:15 # +2
а почему она не умеет сигналы? а почему winsock отличается в некоторых местах от berkely sockets?
на то и щука, чтоб карась не скучал
oaoaoammm 19.09.2020 11:29 # 0
Потому что винду создали анскильные менеджеры для ещё более анскильных юзверей, а линукс — программисты для чуть более продвинутых юзеров и других программистов
YpaHeLI_ 19.09.2020 13:03 # 0
MAKAKA 19.09.2020 17:10 # 0
DOS был уже куплен -- его никто не делал изначально, а сделан он был на основе cp/m (ну в стилистике её во всяк случае).
Windows NT делалось под сильным влияниекм VMS (Дейв Калтер бывший VMSовец).
С IBM они делали OS/2, но та была просрана (потому что IBM всё просирает).
А Unix, кмк, в ту пору на фоне unix wars не выглядел привлекательно, и не пах деньгами (В отличие от VMS) отсюда и вот.
Myxa 19.09.2020 18:42 # 0
Про «Unix»: мелкомягкие делали платный юниксоподобный «Xenix» (ты даже где-то писал, что в нём не было виртуальной памяти, что с позиции нашего времени звучит как очередная порнуха на порнхабе).
MAKAKA 19.09.2020 18:46 # 0
YpaHeLI_ 19.09.2020 13:08 # 0
bormand 19.09.2020 13:21 # 0
YpaHeLI_ 19.09.2020 13:27 # 0
bormand 19.09.2020 13:28 # 0
В винде ты просто отдашь этот буфер в винапишную функцию и она его нарисует.
gost 19.09.2020 13:32 # 0
Кстати, с десятки винда поддерживает стандартные ANSI коды, так что теперь можно даже винапишными функциями не заморачиваться.
bormand 19.09.2020 13:34 # +1
А как же Сёма?
gost 19.09.2020 13:35 # 0
bormand 19.09.2020 13:38 # 0
gost 19.09.2020 13:39 # 0
bormand 19.09.2020 13:41 # 0
Обновись, перестанет.
Они вроде в какой-то версии изкоробки включили. А потом задумались над совместимостью и теперь надо явно звать апишку для включения.
Не то чтобы ее сложно было позвать. Один фиг надо тест на терминал делать, даже в прыщах.
gost 19.09.2020 13:45 # 0
И тут мы возвращаемся к тому, о чём я уже говорил…
> над совместимостью
А что там с совместимостью? Кто-то случайно введёт «\x1b[30;1m» и получит багор?
guest8 19.09.2020 13:49 # −999
guest8 19.09.2020 14:23 # −999
MAKAKA 19.09.2020 16:40 # 0
в какой из восьми используемых версий?:)
YpaHeLI_ 19.09.2020 13:54 # 0
Ну ncurses, как и любая Linux программа с цветным выводом и передает эти цвета уже буфер вместе с управляющими кодами в TTY.
В винде же, как я нагуглил, сначала переключают консоль в нужный цветовой режим, а потом выводят через printf\cout.
https://docs.microsoft.com/en-us/windows/console/setconsoletextattribute
https://coderoad.ru/9262270/Цветной-консольный-вывод-с-C-в-Windows
То есть подходы совершенно разные. И в винде совершенно другие абстракции.
Можно, конечно, сделать функцию которая на основе этих управляющих кодов TTY будет переключать виндовую консоль в разные режимы и выводить, и будет совместимость ncurses с виндой.
YpaHeLI_ 19.09.2020 14:03 # 0
То есть тоже подставляет туда коды.
Странно, противоречит примерам со второй ссылки.
Хотя никакого буфера туда не надо передавать.
Значит меняется текст непосредственно абстракцией консоли.
bormand 19.09.2020 14:04 # 0
Сука, зачем они названия функций то переводят...
YpaHeLI_ 19.09.2020 15:11 # 0
То бишь та же самая ncurses, которая тоже позволяет рассматривать вывод как двумерное полотно.
Тогда в ncurses и отпадает нужда. Разве что только если нужна кроссплатформенность.
MAKAKA 19.09.2020 15:14 # 0
Структура курд
да
Вертикальная координата или значение строки. Единицы зависят от вызова функции.
филлконсолеаутпутаттрибуте
филлконсолеаутпутчарактер
жетконсолефонтсизе
жетларжестконсолевиндовсизе
bormand 19.09.2020 15:17 # 0
Только полный и качественный перевод.
З.Ы. Хотя вместо "слева" должны быть "оставленные" для полной аутентичности.
YpaHeLI_ 19.09.2020 15:17 # −1
guest8 19.09.2020 15:25 # −999
YpaHeLI_ 19.09.2020 15:20 # 0
> филлконсолеаутпутчарактер
> жетконсолефонтсизе
> жетларжестконсолевиндовсизе
Если бы WinAPI писали на 1С.
MAKAKA 19.09.2020 15:12 # 0
bormand 19.09.2020 15:35 # 0
Ну вот эту проверку таки стоит сэмулировать. А то получится как с некоторыми тулами от майкрософта, у которых stdout не редиректится (всё рисуется напрямую в сосноль).
MAKAKA 19.09.2020 16:03 # 0
алсо, можно прверить, что к тебе приаттачена консоль вообще.
bormand 19.09.2020 16:05 # 0
А на аттач плохо проверять, вдруг ты приаттачен, но один из потоков редиректнули?
MAKAKA 19.09.2020 16:09 # 0
а сам факт приаттачености конечно ни о чем не говорит. Да, у тебя есть консоль, но ты в нее не пишешь.
Точно так же как в прыще у тебя есть tty, но твой аутпут редиректунт
вроде бы так
bormand 19.09.2020 16:11 # 0
MAKAKA 19.09.2020 16:12 # 0
bormand 19.09.2020 16:12 # 0
MAKAKA 19.09.2020 16:16 # 0
Да и xtermа нет без иксов, где нить на севере. Из демона ты ничего не запустишь бо нет $DISPLAY
А на винде можешь создать консоль из сервиса, но так как сервис живет в своей сессии, то твою консоль никто не увидит кмк. но писать в нее ты можешь наверное
bormand 19.09.2020 16:21 # 0
Или пойти и нагло открыть нужную сосноль в /dev. Это даже для сервиса прокатит. Но х.з. как выбрать нужную. Да и висящий в ней процесс как-то надо заткнуть.
MAKAKA 19.09.2020 16:23 # 0
И уж точно ты не станешь там сешн лидером или как там его, чтоб тебя уведомили о закрытии tty
bormand 19.09.2020 16:26 # 0
> уведомили
read и write ошибку возвращают, когда pts'ка удалена. Так что всё норм.
MAKAKA 19.09.2020 16:30 # 0
>read ошибку возвращает,
а сигнал ты получаешь, когда tty закрывают?
Кстати, я погуглив
https://www.win.tue.nl/~aeb/linux/lk/lk-10.html
Getting a controlling tty
How does one get a controlling terminal? Nobody knows, this is a great mystery.
The System V approach is that the first tty opened by the process becomes its controlling tty.
The BSD approach is that one has to explicitly call
ioctl(fd, TIOCSCTTY, ...);
Linux tries to be compatible with both, as always, and this results in a very obscure complex of conditions.
ну и дальше расписывается как
прыщебляди соснули малость
bormand 19.09.2020 16:42 # 0
MAKAKA 19.09.2020 16:44 # 0
тогда это всё таки не совсем твоя tty.
Сешн лидер же должен получать сообщение о хенгапе, не?
bormand 19.09.2020 16:47 # 0
bormand 19.09.2020 16:16 # 0
MAKAKA 19.09.2020 16:21 # 0
FAR например умеет ресайзить окошко например. А в никсах терминал может быть какой угодно (да хоть железный!) и как бы ты хотел его ресайзить?
bormand 19.09.2020 16:23 # 0
Ну с другой стороны для юзера такой ресайз почти бесполезен. Наоборот даже мешаться будет.
MAKAKA 19.09.2020 16:32 # 0
В конце концов статус лайн тоже не все умеют: виртуальный терминал на консоли же не умеет
И так-то да, если мне путти начнет само ресайзица -- я охуею
guest8 19.09.2020 09:57 # −999
bormand 19.09.2020 12:20 # 0
А то может проще высрать пачку \n вместо очистки и не париться.
BelCodeMonkey 21.09.2020 16:48 # 0