LINUX.ORG.RU

Кратко про нейронные сети. Тестирование

 


0

1

Попросил переписать код на Ассемблере NASM alice.yandex.ru и deep.org

#include <stdio.h>
int main (void) {
int i, a;
/*Дерево*/
char  color_str[28][299] = {"*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n",
    "*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n",
    "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n",
    "+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n",
    "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n",
    "%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n",
    "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n",
    "*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n",
    "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*",
    "%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n",
    "@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n",
    "%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n",
    "#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n",
    "*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n",
    "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n",
    "##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n",
    "####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n",
    "#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n",
    "%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n",
    "**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n",
    "%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n",
    "#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n",
    "##**+#%**+++++=+####%%#======##+%*======\n",
    "%*+++===++++++===*###%*======*##+##++===\n",
    "***+++==+++++++==+#%%%#=====++++***+++++\n",
    "***+++++++++++++=+*##%#+++++++******++++\n",
    "***+++++++++++++++*%###++++++*******++++\n",
    "++++++++++++++***%#=%#*****+*********+++\n"    ,
};
for (a=0; a < 28; a++) {
i=0;
while((i <299) && color_str[a][i] != '\0' ) {
 
    /*Красим листья*/
    if(color_str[a][i] == '@')
    printf("\033[92m%c", color_str[a][i]);
    /*Сбрасываем цвет*/
        if(color_str[a][i] != '@')
    printf("\033[0m%c", color_str[a][i]);
                i++;
        }
    }
    return 0;
}

Переписали. Код запустить не удалось ни от одного, ни от другого. Алиса предложила вдобавок код на python, чтобы создать массив строк для Ассемблера. Но, конечно, советов разной ценности дали обе сети.

★

Последнее исправление: hobbit (всего исправлений: 6)
Ответ на: комментарий от AnonymUser

проблема тут не в редакторах или алисах
чтобы было как по заветам ильича: «любая кухарка должна уметь управлять нейросетью» - сперва нужен необходимый набор базовых знаний и навыков, а то ты даже с людьми не сможешь договориться, не то что с ии

madcore ★★★★★
()
Ответ на: комментарий от madcore

Интересно. Я, честно говоря, пока для себя применения ИИ не нашел.

  1. Технический перевод?! Можно обойтись translate.google
  2. Генерация цепочек команд для администрирования?! В общем есть справчоники, хотя мне 1 раз удачно посоветовала сеть.
  3. Правка кода или текста (опечаток)?! Тут пока вообще затрудняюсь что-то сказать.

Но вот что интересно, сейчас ехал и думал, у сети же есть натренированность, т.е. как бы прогрессия, но есть предел этой прогрессии, а значит, есть и регрессия или деградация сети. Вопрос, конечно, кто это определяет?! Видимо, пользователь, в большей степени.

P.S. Цикл мне 1146 символов насчитал.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от Xenius

Скорость вообще не важна.

P.S. Я создал тему для разгрузки, разговор поддержать.

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Правка кода или текста (опечаток)?! Тут пока вообще затрудняюсь что-то сказать.

Вот с этим неплохо. Ловит опечатки и ошибки, но может придумать несуществующие. Поэтому надо попросить составить список ошибок и исправлять самому руками только если уверен, что это действительно ошибка.

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

А я смотрю на качество компилятора. GCC генерирует в полтора раза лучший код, чем Clang, но сишный код переведённый через ИИ в ассемблер ожидаемо качественнее на порядок. Хотя, конечно, там тоже не всё гладко: как минимум от балды с запасом выставлен out_buf resb 40000, хотя у него есть точный размер.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от madcore

Ну не совсем с марса. Но да, надо более интересный бенчмарк делать, который будет пару секунд работать, чтоб уже и time разный был.

PS

Не вижу твой комментарий про попугаев. Вроде в игноре нет сообщений а я не вижу.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

В идеале всё делается одной единственной печатью на экран, но да, сам алгоритм раскраски тогда пропадает, мы же константу печатаем, которая не прилетает нам откуда-то. Если хочется при этом читаемость кода сохранить, то делать надо через define.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Сюда можно подбавить условий:

  1. Пару-тройку «@» покрасить красным - условно яблоки.
  2. Добавить немного жёлтых листьев рандомно. Процентов 20 от зеленых. И столько оранжевых. Будто осень.
AnonymUser ★
() автор топика
Ответ на: комментарий от peregrine

это всё лишено смысла
всё, что там важного - это количество сисколлов на объём передаваемых, и, возможно, кол-во эск-последовательностей в них(при выводе в файл или поток точно без разницы)
или, например, попробуй во всех случаях перенаправить вывод в stderr, там дефолтно нет буферизации

и, кстати, с чем ты сравниваешь?
если с тем, где compressed_tree, то приплюсуй туда время на его создание, ибо это уже совсем другая программа

madcore ★★★★★
()
Ответ на: комментарий от peregrine

тогда уж так

sed -i -E 's/(@+)/\\033[92m\1\\033[0m/g' shittree.c

ц:
#include <stdio.h>
int main () {
    /*Дерево*/
    char * color_str =
        "*#*=*#+:+#\033[92m@@\033[0m####*+#\033[92m@@@\033[0m%%+#\033[92m@@\033[0m%%%%%*+#%%*.\n"
        "*%##%#+#\033[92m@@@@\033[0m**\033[92m@\033[0m*%\033[92m@@\033[0m%#***%\033[92m@\033[0m%%\033[92m@@\033[0m#####\033[92m@@\033[0m%%\n"
        "+#%%%#%\033[92m@\033[0m%\033[92m@@\033[0m%\033[92m@\033[0m%%%#*#\033[92m@@\033[0m%%%%###%%%%+*##%%%%\n"
        "+#%%%#%\033[92m@\033[0m%\033[92m@@\033[0m%\033[92m@\033[0m%%%#*#\033[92m@@\033[0m%%%%###%%%%+*##%%%%\n"
        "%#####%\033[92m@@@\033[0m%\033[92m@\033[0m%%#+%\033[92m@\033[0m%%%###*%\033[92m@@@\033[0m%%%%**\033[92m@\033[0m%%%#\n"
        "%#####%\033[92m@@@\033[0m%\033[92m@\033[0m%%#+%\033[92m@\033[0m%%%###*%\033[92m@@@\033[0m%%%%**\033[92m@\033[0m%%%#\n"
        "*%%%\033[92m@\033[0m%%%#%%*%%%%*%\033[92m@\033[0m%\033[92m@\033[0m%%\033[92m@\033[0m%\033[92m@@@\033[0m##%%#*#%#++#\n"
        "*%%%\033[92m@\033[0m%%%#%%*%%%%*%\033[92m@\033[0m%\033[92m@\033[0m%%\033[92m@\033[0m%\033[92m@@@\033[0m##%%#*#%#++#\n"
        "%==%%\033[92m@\033[0m%#%\033[92m@@@\033[0m%*=*\033[92m@\033[0m%%%\033[92m@\033[0m##\033[92m@@\033[0m%#*\033[92m@\033[0m%%%\033[92m@\033[0m##\033[92m@@@\033[0m%*\n"
        "%==%%\033[92m@\033[0m%#%\033[92m@@@\033[0m%*=*\033[92m@\033[0m%%%\033[92m@\033[0m##\033[92m@@\033[0m%#*\033[92m@\033[0m%%%\033[92m@\033[0m##\033[92m@@@\033[0m%*\n"
        "\033[92m@@\033[0m#+*%\033[92m@@@@@\033[0m%%**#%##%%%\033[92m@@@@\033[0m%##%%#%\033[92m@\033[0m%#\033[92m@\033[0m%%\033[92m@\033[0m\n"
        "%\033[92m@\033[0m%*+##*#\033[92m@\033[0m%#%*#\033[92m@\033[0m%%%%%\033[92m@@@\033[0m*##+*%\033[92m@@\033[0m#%%%%##*\n"
        "#++#+*#\033[92m@\033[0m%\033[92m@\033[0m%++#%%%%%%%\033[92m@@\033[0m%=*%\033[92m@\033[0m#%#+#%\033[92m@@@@\033[0m%%\n"
        "*%%##**######%%#\033[92m@\033[0m%%%%%#%%##\033[92m@@\033[0m##%\033[92m@@@@\033[0m%##*\n"
        "##%\033[92m@@@\033[0m%+%%%%#%\033[92m@@@\033[0m%%\033[92m@@\033[0m%%%#%\033[92m@@\033[0m#%\033[92m@@@@@@@\033[0m%%#\n"
        "##%\033[92m@@@\033[0m%+%%%%#%\033[92m@@@\033[0m%%\033[92m@@\033[0m%%%#%\033[92m@@\033[0m#%\033[92m@@@@@@@\033[0m%%#\n"
        "####*==+%%%#\033[92m@@\033[0m#*\033[92m@@@@@@\033[0m%%\033[92m@@\033[0m%%+*##\033[92m@@\033[0m%#\033[92m@\033[0m#*#\n"
        "#%\033[92m@@\033[0m%%\033[92m@@\033[0m#%%*%\033[92m@@@\033[0m+#\033[92m@@\033[0m%%%%*#%%%\033[92m@@\033[0m#+%%*#%%%\n"
        "%%%%*#%%%#++#%\033[92m@\033[0m%\033[92m@@@@\033[0m%%%\033[92m@\033[0m%%\033[92m@\033[0m%--*\033[92m@\033[0m####%##%\n"
        "**#\033[92m@@\033[0m%**\033[92m@\033[0m%#+%%%*+#%#%\033[92m@@@@@@@@@\033[0m*=#*#%\033[92m@\033[0m##\033[92m@\033[0m\n"
        "%+*\033[92m@@\033[0m%##%\033[92m@\033[0m%+++*%%%%%%%\033[92m@\033[0m%*%\033[92m@@\033[0m#++%%\033[92m@\033[0m%*\033[92m@@\033[0m%*\n"
        "#####%%%\033[92m@\033[0m*++++++#####%%#++*\033[92m@@\033[0m%%\033[92m@\033[0m%*===*%%\n"
        "##**+#%**+++++=+####%%#======##+%*======\n"
        "%*+++===++++++===*###%*======*##+##++===\n"
        "***+++==+++++++==+#%%%#=====++++***+++++\n"
        "***+++++++++++++=+*##%#+++++++******++++\n"
        "***+++++++++++++++*%###++++++*******++++\n"
        "++++++++++++++***%#=%#*****+*********+++\n"
    ;

    fputs(color_str, stdout);
    
    return 0;
}

madcore ★★★★★
()
Ответ на: комментарий от peregrine

а вот компилятор считает, что надо заменить на fwrite, к тому же это более портабельно
и ты, конечно, провёл анализ, в каких ситуациях write будет быстрее, а в каких - нет?
а ещё, с позиции кого быстрее

madcore ★★★★★
()
Ответ на: комментарий от madcore

Тут большой разницы не будет. Но вообще мы пишем один массив по сути, а значит дополнительная буферизация, которой они и отличаются нам не поможет, а только навредит. Вот если бы мы кучу мелких данных выводили, то fwrite собрал бы их сначала в буфер, а потом дёрнул один раз дорогостоящий write для вывода этого буфера.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

Я вот думал-думал и понял, что интереснее было бы вот так, с анимацией осени:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (void) {
int i, a, b;
/*Дерево*/
char  color_str[1147] = "+++*********+*****#%=#%***++++++++++++++\n++++*******++++++###%*+++++++++++++++***\n++++******+++++++#%##*+=+++++++++++++***\n+++++***++++=====#%%%#+==+++++++==+++***\n===++##+##*======*%###*===++++++===+++*%\n======*%+##======#%%####+=+++++**%#+**##\n%%*===*%@%%@@*++#%%#####++++++*@%%%#####\n*%@@*%@%%++#@@%*%@%%%%%%%*+++%@%##%@@*+%\n@##@%#*#=*@@@@@@@@@%#%#+*%%%+#%@**%@@#**\n%##%####@*--%@%%@%%%@@@@%@%#++#%%%#*%%%%\n%%%#*%%+#@@%%%#*%%%%@@#+@@@%*%%#@@%%@@%#\n#*#@#%@@##*+%%@@%%@@@@@@*#@@#%%%+==*####\n#%%@@@@@@@%#@@%#%%%@@%%@@@%#%%%%+%@@@%##\n#%%@@@@@@@%#@@%#%%%@@%%@@@%#%%%%+%@@@%##\n*##%@@@@%##@@##%%#%%%%%@#%%######**##%%*\n%%@@@@%#+#%#@%*=%@@%%%%%%%#++%@%@#*+#++#\n*##%%%%#@@%*+##*@@@%%%%%@#*%#%@#*##+*%@%\n@%%@#%@%#%%##%@@@@%%%##%#**%%@@@@@%*+#@@\n*%@@@##@%%%@*#%@@##@%%%@*=*%@@@%#%@%%==%*\n%@@@##@%%%@*#%@@##@%%%@*=*%@@@%#%@%%==%\n#++#%#*#%%##@@@%@%%@%@%*%%%%*%%#%%%@%%%*\n#++#%#*#%%##@@@%@%%@%@%*%%%%*%%#%%%@%%%*\n#%%%@**%%%%@@@%*###%%%@%+#%%@%@@@%#####%\n#%%%@**%%%%@@@%*###%%%@%+#%%@%@@@%#####%\n%%%%##*+%%%%###%%%%@@#*#%%%@%@@%@%#%%%#+\n%%%%##*+%%%%###%%%%@@#*#%%%@%@@%@%#%%%#+\n%%@@#####@@%%@%***#%@@%*@**@@@@#+#%##%*\n.*%%#+*%%%%%@@#+%%@@@#+*####@@#+:+#*=*#*";
/*Для прогрессивного желтения листьев*/
b=0;

while (b  < 500) {
sleep(1);
system("clear");
printf("\n");
i=1147;

while(i--) {
	a = rand() % 1000;
	/*Добавим 1 яблоко или красный лист*/
	if(color_str[i] == '@' && i ==419) {
	printf("\033[91m%c", color_str[i]);
	continue;
	}
	if (a < b && i > 400) {
	printf("\033[93m%c", color_str[i]);
	continue;
	}
	/*Красим листья*/
	if(color_str[i] == '@')
	printf("\033[92m%c", color_str[i]);
	/*Сбрасываем цвет*/
	else
	printf("\033[0m%c", color_str[i]);

		}
		b = b + 100;
}
printf("\n Осень же ж ещё не наступила, но листья жёлтые уже. \n В сапогах резиновых иду я по полю, по меже...");
	return 0;
}


AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от peregrine

а теперь представь терминал на ком-порту или медленном ssh
с точки зрения программы, fwrite отработает мгновенно и спокойно продолжит работать, а на write она будет висеть и ждать передачи байтиков
с точки зрения юзера - отклик будет быстрее с write
с точки зрения системы - каждый write дёргает ведро, потому лучше кидать большими порциями

и, опять-таки, буферизация у fwrite-подобных функций работает по-разному, в зависимости от stdout, stderr, pipe итп, также они даже детектят конкретно терминал и включает строчную буферизацию именно под этот кейс
т.е., в обычной ситуации, система лучше вайб-кулхацера знает, какую политику буферизации сейчас применить

ещё, у всех [эмуляторов] терминалов есть своя скорость, свои буферы итп, так что однозначного везде результата ты можешь и не получить своими замерами

madcore ★★★★★
()
Ответ на: комментарий от AnonymUser

т.е., до тебя так и не дошло, что размер строковых констант указывать не нужно, также как и всё остальное ты в своей теме не читал?

ладно, пойду я, у вас тут своя атмосфера

madcore ★★★★★
()
Ответ на: комментарий от madcore

Понял. Спасибо. Возьму на будущее на заметку.
Это так всегда было?! Т.е. в C89?!

AnonymUser ★
() автор топика
Ответ на: комментарий от madcore

Ты имеешь в виду так?

const char  color_str[] 
AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от madcore

Так?!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (void) {
int i, a, b;
/*Дерево*/
const char   color_str[] = "*#*=*#+:+#@@####*+#@@@%%+#@@%%%%%*+#%%*.\n*%##%#+#@@@@**@*%@@%#***%@%%@@#####@@%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n+#%%%#%@%@@%@%%%#*#@@%%%%###%%%%+*##%%%%\n%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n%#####%@@@%@%%#+%@%%%###*%@@@%%%%**@%%%#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n*%%%@%%%#%%*%%%%*%@%@%%@%@@@##%%#*#%#++#\n%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%\n*%==%%@%#%@@@%*=*@%%%@##@@%#*@%%%@##@@@%*\n@@#+*%@@@@@%%**#%##%%%@@@@%##%%#%@%#@%%@\n%@%*+##*#@%#%*#@%%%%%@@@*##+*%@@#%%%%##*\n#++#+*#@%@%++#%%%%%%%@@%=*%@#%#+#%@@@@%%\n*%%##**######%%#@%%%%%#%%##@@##%@@@@%##*\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n##%@@@%+%%%%#%@@@%%@@%%%#%@@#%@@@@@@@%%#\n####*==+%%%#@@#*@@@@@@%%@@%%+*##@@%#@#*#\n#%@@%%@@#%%*%@@@+#@@%%%%*#%%%@@#+%%*#%%%\n%%%%*#%%%#++#%@%@@@@%%%@%%@%--*@####%##%\n**#@@%**@%#+%%%*+#%#%@@@@@@@@@*=#*#%@##@\n%+*@@%##%@%+++*%%%%%%%@%*%@@#++%%@%*@@%*\n#####%%%@*++++++#####%%#++*@@%%@%*===*%%\n##**+#%**+++++=+####%%#======##+%*======\n%*+++===++++++===*###%*======*##+##++===\n***+++==+++++++==+#%%%#=====++++***+++++\n***+++++++++++++=+*##%#+++++++******++++\n***+++++++++++++++*%###++++++*******++++\n++++++++++++++***%#=%#*****+*********+++\n";
/*Для прогрессивного желтения листьев*/
b=0;
while (b  < 500) {
sleep(1);
system("clear");
printf("\n");



for (i=0; color_str[i] != '\0'; i++ ) {

	a = rand() % 1000;
	/*Добавим 1 яблоко или красный лист*/
	if(color_str[i] == '@' && i ==419) {
	printf("\033[91m%c", color_str[i]);
	continue;
	}
	if (a < b && i < 800) {
	printf("\033[93m%c", color_str[i]);
	continue;
	}
	/*Красим листья*/
	if(color_str[i] == '@')
	printf("\033[92m%c", color_str[i]);
	/*Сбрасываем цвет*/
	else
	printf("\033[0m%c", color_str[i]);

		}
		b = b + 100;
}
printf("\nОсень же ж ещё не наступила, но листья жёлтые уже. \n В сапогах резиновых иду я по полю, по меже...");
	return 0;
}

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от madcore

терминал на ком-порту

Оно давно мертво

или медленном ssh

А эту проблему должен решать транспорт, т.е. сам ssh. Именно у него должна быть буферизация.

PS

Для игноририования терминалов и их скорости есть >/dev/null

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)

Ещё попросил обе сети найти пути на графе однонаправленном. Привел сам граф со связями. Только со второй попытки осилили.

 Сколько путей из a в f: 


a → b, a → c, a → d

b → d, b → e, b → f

c → d, c → e, c → f

d → e, d → f

e → f

f → (нет исходящих)

https://deepai.org/chat#be19bde4-e216-420a-8752-00a4bd333b04
https://alice.yandex.ru/?share=77357c70-66b3-a367-662e-afdce4e1959f
AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)

deepai.org попытался написать raycasting (считай, игру). Я только добаивл условие победы (C89):


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAP_WIDTH 20
#define MAP_HEIGHT 20

int map[MAP_HEIGHT][MAP_WIDTH] = {
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1},
    {1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1},
    {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1},
    {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,0,1},
    {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,0,1},
    {1,0,0,0,0	,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,0,1},
    {1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1},
    {1,0,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1},
    {1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1},
    {1,0,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,0,0,1},
    {1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1},
    {1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1},
    {1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};

double playerX = 1.5; // начальные координаты
double playerY = 1.5;
double angle = 0.0;   // направление взгляда (в радианах)

#define PI 3.14159265358979323846
#define FIELD_SIZE 10 // Размер области для отображения стены

void clear_screen() {
    printf("\033[2J");
    printf("\033[H");
}

// Функция для получения расстояния до стены прямо перед игроком
double cast_ray(double ray_angle) {
    double rayX = cos(ray_angle);
    double rayY = sin(ray_angle);
    double rayPosX = playerX;
    double rayPosY = playerY;

    while (1) {
        rayPosX += rayX * 0.05;
        rayPosY += rayY * 0.05;
        int mapX = (int)rayPosX;
        int mapY = (int)rayPosY;
        if (mapX < 0 || mapX >= MAP_WIDTH || mapY < 0 || mapY >= MAP_HEIGHT)
            return -1; // за границей
        if (map[mapY][mapX] == 1)
            return sqrt((rayPosX - playerX)*(rayPosX - playerX) + (rayPosY - playerY)*(rayPosY - playerY));
    }
}

// Функция для отображения карты и стены
int draw() {
    clear_screen();

    // Размер для отображения стены
    int wallLine[FIELD_SIZE];

    // Инициализация
    for(int x=0; x<FIELD_SIZE; x++) {
        wallLine[x] = 0; // 0 - ничего, 1 - стена
    }

    // Расчет расстояния до стены прямо перед игроком
    double dist = cast_ray(angle);
    int wallPosition = (int)(dist * 2); // масштабирование
    if (wallPosition >= FIELD_SIZE) wallPosition = FIELD_SIZE - 1;
    if (wallPosition < 0) wallPosition = 0;

    // Заполняем линию горизонтальной стены
    for(int x=0; x<FIELD_SIZE; x++) {
        wallLine[x] = (x == wallPosition) ? 1 : 0;
    }

    // Вывод карты слева
    for(int y=0; y<MAP_HEIGHT; y++) {
        for(int x=0; x<MAP_WIDTH; x++) {
            if ((int)playerX == x && (int)playerY == y) {
                printf("P");
            } else if (map[y][x] == 1) {
                printf("#");
            } else {
                printf(" ");

            }
           if (playerX > 7.0 && playerY > 8.9) {
         printf("  Вы прошли игру !\n");
         return 0;
	 }
        }

        printf("   "); // разделитель
        // Вывод горизонтальной линии справа
        for(int x=0; x<FIELD_SIZE; x++) {
            if (wallLine[x] == 1) {
                printf("=");
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
    printf("Положение: (%.1f, %.1f)  Направление: %.2f градусов\n", playerX, playerY, angle * 180 / PI);
    printf("Команды:\n");
    printf("  w - идти вперед\n");
    printf("  s - идти назад\n");
    printf("  a - повернуть налево\n");
    printf("  d - повернуть направо\n");
    printf("  q - выйти\n");
    printf("Введите команду и нажмите Enter: ");
}

int main() {
    char cmd;
    while (1) {
        draw();
        scanf(" %c", &cmd);
        if (cmd == 'q') break;

        if (cmd == 'w') {
            double newX = playerX + cos(angle) * 0.5;
            double newY = playerY + sin(angle) * 0.5;
            if (map[(int)newY][(int)newX] == 0) {
                playerX = newX;
                playerY = newY;
            }
        }
        else if (cmd == 's') {
            double newX = playerX - cos(angle) * 0.5;
            double newY = playerY - sin(angle) * 0.5;
            if (map[(int)newY][(int)newX] == 0) {
                playerX = newX;
                playerY = newY;
            }
        }
        else if (cmd == 'a') {
            angle -= PI / 12;
            if (angle < 0) angle += 2*PI;
        }
        else if (cmd == 'd') {
            angle += PI / 12;
            if (angle > 2*PI) angle -= 2*PI;
        }
    }
    return 0;
}

AnonymUser ★
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)

Нейронная сеть deepai.org сумела по описанию сделать полноценный 3D raycasting со стенами псевдографикой. Управление стрелками. Типа можно ходить по карте. Попросил зайдействовать библиотеку ncurses.

Компиляция и запуск:

gcc -o ray14 ray14.c -lncurses -ltinfo  -lm; ./ ray14

/*Модель 3D Raycasting на C с библиотекой ncurses. Написана нейронной сетью.
Стены с помощью символов
Компиляция и запуск gcc -o ray14 ray14.c -lncurses -ltinfo  -lm; ./ ray14
*/
#include <ncurses.h>
#include <math.h>
#include <stdlib.h>

#define MAP_WIDTH 16
#define MAP_HEIGHT 16
#define FOV (M_PI / 3.0) // 60 градусов
#define MAX_DEPTH 16

// Карта: 0 - пусто, 1 - стена
int worldMap[MAP_HEIGHT][MAP_WIDTH] = {
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1},
    {1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1},
    {1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1},
    {1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1},
    {1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};

double playerX = 3.0, playerY = 3.0; // Начальные координаты игрока
double playerAngle = 0.0;

void draw(int width, int height) {
    for (int x = 0; x < width; x++) {
        // Вычисляем угол для каждого луча
        double rayAngle = (playerAngle - FOV / 2.0) + ((double)x / (double)width) * FOV;
        double distanceToWall = 0;
        int hit = 0;

        double eyeX = cos(rayAngle);
        double eyeY = sin(rayAngle);

        while (!hit && distanceToWall < MAX_DEPTH) {
            distanceToWall += 0.1;
            int testX = (int)(playerX + eyeX * distanceToWall);
            int testY = (int)(playerY + eyeY * distanceToWall);

            // Проверка выхода за границы
            if (testX < 0 || testX >= MAP_WIDTH || testY < 0 || testY >= MAP_HEIGHT) {
                hit = 1;
                distanceToWall = MAX_DEPTH;
            } else {
                if (worldMap[testY][testX] == 1) {
                    hit = 1;
                }
            }
        }

        // Рассчитаем высоту стен
        int ceiling = (int)((double)(height / 2.0) - height / distanceToWall);
        int floor = height - ceiling;

        for (int y = 0; y < height; y++) {
            if (y < ceiling) {
                mvaddch(y, x, ' ');
            } else if (y > ceiling && y <= floor) {
                // Можно добавить тень
                if (distanceToWall <= MAX_DEPTH / 4.0) {
                    mvaddch(y, x, '#'); // Ближе - темнее
                } else if (distanceToWall < MAX_DEPTH / 2.0) {
                    mvaddch(y, x, '+');
                } else {
                    mvaddch(y, x, '.');
                }
            } else {
                mvaddch(y, x, ' ');
            }
        }
    }
    refresh();
}

int main() {
    initscr();
    noecho();
    curs_set(FALSE);
    keypad(stdscr, TRUE);
    nodelay(stdscr, TRUE); // Не блокировать getch

    int width, height;
    getmaxyx(stdscr, height, width);

    while (1) {
        // Обработка ввода
        int ch = getch();
        if (ch == 'q') break; // Выход
        if (ch == KEY_UP) {
            // Вперёд
            double newX = playerX + cos(playerAngle) * 0.1;
            double newY = playerY + sin(playerAngle) * 0.1;
            if (worldMap[(int)newY][(int)newX] == 0) {
                playerX = newX;
                playerY = newY;
            }
        }
        if (ch == KEY_DOWN) {
            // Назад
            double newX = playerX - cos(playerAngle) * 0.1;
            double newY = playerY - sin(playerAngle) * 0.1;
            if (worldMap[(int)newY][(int)newX] == 0) {
                playerX = newX;
                playerY = newY;
            }
        }
        if (ch == KEY_LEFT) {
            playerAngle -= 0.1;
        }
        if (ch == KEY_RIGHT) {
            playerAngle += 0.1;
        }

        draw(width, height);
    }

    endwin();
    return 0;
}

AnonymUser ★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария