- 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 строк.
> return 0;}
Какая экономия )))
Ну раз уж на венду завязался, поюзай виндовые апишки. Там и очистка экрана и перемещение курсора есть и цвета. Всё лучше, чем процесс поднимать на каждый фрейм.
но лучше конечно сделать это через ConsoleApi на винде и через ncruses напрямую на Linux: последнее будет совместимо с любым униксом
Правда я вот не уверен про переносимость
<conio.h> азаза
а в досе был cls?
З.Ы. Но в старом конио и clrscr() был. Просрали все полимеры.
а туда он из CP/M небось?
Кстати, почему в паскале conio назывался crt?
а почему она не умеет сигналы? а почему winsock отличается в некоторых местах от berkely sockets?
на то и щука, чтоб карась не скучал
Потому что винду создали анскильные менеджеры для ещё более анскильных юзверей, а линукс — программисты для чуть более продвинутых юзеров и других программистов
DOS был уже куплен -- его никто не делал изначально, а сделан он был на основе cp/m (ну в стилистике её во всяк случае).
Windows NT делалось под сильным влияниекм VMS (Дейв Калтер бывший VMSовец).
С IBM они делали OS/2, но та была просрана (потому что IBM всё просирает).
А Unix, кмк, в ту пору на фоне unix wars не выглядел привлекательно, и не пах деньгами (В отличие от VMS) отсюда и вот.
Про «Unix»: мелкомягкие делали платный юниксоподобный «Xenix» (ты даже где-то писал, что в нём не было виртуальной памяти, что с позиции нашего времени звучит как очередная порнуха на порнхабе).
В винде ты просто отдашь этот буфер в винапишную функцию и она его нарисует.
Кстати, с десятки винда поддерживает стандартные ANSI коды, так что теперь можно даже винапишными функциями не заморачиваться.
А как же Сёма?
Обновись, перестанет.
Они вроде в какой-то версии изкоробки включили. А потом задумались над совместимостью и теперь надо явно звать апишку для включения.
Не то чтобы ее сложно было позвать. Один фиг надо тест на терминал делать, даже в прыщах.
И тут мы возвращаемся к тому, о чём я уже говорил…
> над совместимостью
А что там с совместимостью? Кто-то случайно введёт «\x1b[30;1m» и получит багор?
в какой из восьми используемых версий?:)
Ну ncurses, как и любая Linux программа с цветным выводом и передает эти цвета уже буфер вместе с управляющими кодами в TTY.
В винде же, как я нагуглил, сначала переключают консоль в нужный цветовой режим, а потом выводят через printf\cout.
https://docs.microsoft.com/en-us/windows/console/setconsoletextattribute
https://coderoad.ru/9262270/Цветной-консольный-вывод-с-C-в-Windows
То есть подходы совершенно разные. И в винде совершенно другие абстракции.
Можно, конечно, сделать функцию которая на основе этих управляющих кодов TTY будет переключать виндовую консоль в разные режимы и выводить, и будет совместимость ncurses с виндой.
То есть тоже подставляет туда коды.
Странно, противоречит примерам со второй ссылки.
Хотя никакого буфера туда не надо передавать.
Значит меняется текст непосредственно абстракцией консоли.
Сука, зачем они названия функций то переводят...
То бишь та же самая ncurses, которая тоже позволяет рассматривать вывод как двумерное полотно.
Тогда в ncurses и отпадает нужда. Разве что только если нужна кроссплатформенность.
Структура курд
да
Вертикальная координата или значение строки. Единицы зависят от вызова функции.
филлконсолеаутпутаттрибуте
филлконсолеаутпутчарактер
жетконсолефонтсизе
жетларжестконсолевиндовсизе
Только полный и качественный перевод.
З.Ы. Хотя вместо "слева" должны быть "оставленные" для полной аутентичности.
> филлконсолеаутпутчарактер
> жетконсолефонтсизе
> жетларжестконсолевиндовсизе
Если бы WinAPI писали на 1С.
Ну вот эту проверку таки стоит сэмулировать. А то получится как с некоторыми тулами от майкрософта, у которых stdout не редиректится (всё рисуется напрямую в сосноль).
алсо, можно прверить, что к тебе приаттачена консоль вообще.
А на аттач плохо проверять, вдруг ты приаттачен, но один из потоков редиректнули?
а сам факт приаттачености конечно ни о чем не говорит. Да, у тебя есть консоль, но ты в нее не пишешь.
Точно так же как в прыще у тебя есть tty, но твой аутпут редиректунт
вроде бы так
Да и xtermа нет без иксов, где нить на севере. Из демона ты ничего не запустишь бо нет $DISPLAY
А на винде можешь создать консоль из сервиса, но так как сервис живет в своей сессии, то твою консоль никто не увидит кмк. но писать в нее ты можешь наверное
Или пойти и нагло открыть нужную сосноль в /dev. Это даже для сервиса прокатит. Но х.з. как выбрать нужную. Да и висящий в ней процесс как-то надо заткнуть.
И уж точно ты не станешь там сешн лидером или как там его, чтоб тебя уведомили о закрытии tty
> уведомили
read и write ошибку возвращают, когда pts'ка удалена. Так что всё норм.
>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.
ну и дальше расписывается как
прыщебляди соснули малость
тогда это всё таки не совсем твоя tty.
Сешн лидер же должен получать сообщение о хенгапе, не?
FAR например умеет ресайзить окошко например. А в никсах терминал может быть какой угодно (да хоть железный!) и как бы ты хотел его ресайзить?
Ну с другой стороны для юзера такой ресайз почти бесполезен. Наоборот даже мешаться будет.
В конце концов статус лайн тоже не все умеют: виртуальный терминал на консоли же не умеет
И так-то да, если мне путти начнет само ресайзица -- я охуею
А то может проще высрать пачку \n вместо очистки и не париться.