Necromancer IT
30 subscribers
196 photos
1 video
38 files
18 links
Библиотека из набросков кода разных тематик.

Админ: @KostRs

Сайт-визитка Palma - https://palmaluv.github.io/palma.github.io

Чат - https://t.me/+U8YZeTKdpnKxEG8t
Download Telegram
#include <iostream>

using namespace std;

int main() {
setlocale(LC_ALL,"Russian");
system("chcp 1251"); // настраиваем кодировку консоли, она не хотела нормально выводить русский

int str_len = 1000, space = 0, num = 0, spacecord[40], bufL = 0, end = 0;
char* str = new char[str_len];

std::cout << "Введите предложение: " << std::endl;
std::cin.getline(str, str_len);

int lenW = strlen(str);
char *bufer = new char[str_len];

for (int i = 0; i < lenW; i++) {

if (str[i] == ' ') {
spacecord[space] = i;
space++;

if (space == 1) {
end = i;
}
}
}

int wordend = lenW;

for (int i = space; i > 0; i--) {
int wordbegin = spacecord[i - 1];

for (int j = 0; j < lenW; j++) {

if (wordend > j && j >= wordbegin) {
bufer[bufL] = str[j];
bufL++;
}
}

wordend = spacecord[i-1];
}

bufer[bufL] = ' ';
bufL++;

for (int i = 0; i <= end; i++) {
bufer[bufL] = str[i];
bufL++;
}

cout << "\n";

for (int i = 1; i < lenW + 1; i++) {
cout << bufer[i];
}

return 0;
}



Добрый вечер, у меня есть код и я давно не появлялся, сейчас мы его разберем. Этот код переставляет слова в обратном порядке. Если вкратце мы находим пробелы, имеем 2 буквенных массива, и благодаря бегункам которые определяют начало и конец слова мы копируем каждое слово, вставляем его для конечного результата и ставим пробел по некоторым причинам. А теперь поконкретнее:
Подрубаем локализацию и основную библиотеку, создаем переменные для определения максимального размера предложения и максимального количества пробелов. По желанию можно хоть 10к, зависит от оперативки и там и там поставить(spacecord, str_len(Учим инглиш)). Далее у нас идет переменная которая является счетчиком количества пробелов(num), создаем переменную bufL, для чего скажу потом. После чего создаем динамический массив с максимальной длинной которую мы задали.
Потом просим человека ввести предложение и даем такую возможность, при помощи getline пихаем данные в массив(для более детальной инфы об этой штуке гуглим справочники), находим длину массива при помощи str_len и помещаем эту инфу в переменную, создаем буфер в котором мы получим конечный результат. Дальше веселее.
А дальше у нас идет цикл который определяет координаты пробелов. Мы помещаем значение "i" благодаря которому мы перерываем весь массив в ячейку массива с кордами и идем от 0 до последнего пробела, попутно у нас щелкает счетчик, потом это пригодится.
Итак один из трех циклов позади, перед вторым мы создаем переменную которая будет кордами конца предложения и будем использовать ее в цикле. Точнее в двух. Итак, что же этот крокодил из себя представляет. Тут мы определяем слово благодаря пробелам, находим начало слова, просто благодаря тому что берем последний пробел, кстати цикл идет на уменьшение, тоесть мы берем пробелы с конца. Переменная wordbegin - логично что начало слова. Потом у нас идет второй цикл. В нем мы каждый раз будем проверять относится ли элемент того что ввел пользователем тому слову которое мы ищем, напоминаю, постоянно проверяем с конца. После нахождения соответствий пихаем слово в наш буфер, проверка номера элементов происходит при помощи bufL, которую мы каждый раз увеличиваем и таким образом все вводится правильно.
Далее мы ставим пробел в конце нашего буфера, ведь никто не ставит пробел в конце предложения(Это наш маленький секрет) и увеличиваем bufL на 1.
Предпоследним циклом мы вставляем последнее слово. И тут нам пригодилась переменная end. Мы просто берем отчет от 0 до пробела и вставляем это в конец нашего массива.
В самом конце просто выводим посимвольно, используя длину строки. Если не использовать то может добавлять и раскидывать символы.

Можно еще выделиться умом и сообразительностью и вместо вывода пихнуть функцию. Например:

print(lenW, bufer);

Тогда сверху прописываем:

char print(int lenW, char* bufer) {

cout << "\n";

for (int i = 1; i < lenW + 1; i++) {
cout << bufer[i];
}
return 0;
}
На этом пожалуй все. Я достаточно долго не мог вспомнить как работает этот код, потому что делал его давно. Но вроде бы получилось нормально. Всего всем хорошего и фкуснохо кофя)
Привет спустя долгое время. Мне было немного неловко начать писать этот пост спустя столь долгое время. Благодаря изучению того что должно быть интересно, но не интересно в вузе, куче бессмысленных работ в WindowsForms, изучению C++/C# с основ до ООП я и пропал настолько. А самое главное - игрушки, если не смотреть на время могут забрать все ваше время к чертикам. В общем о чем я. В целях интереса я нарисовал параболу в консоли благодаря SetPixel и соответственно библиотеке винды. А так же сделал из сего рисования поток в винде. Тоесть выполнение скрипта не считалось задачей вижуалки, скрипт скорее работал как плагин к винде. Передаются в функцию собственно корды, нужно захватить объект рисования, тобишь окно и выбрать цвет пикселей. Меняя значения x и y можно повернуть график и прибавляя числа сместить его. Вот код проги:
#include <iostream>
#include <thread>
#include <windows.h>

using namespace std;

void func() {
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
int a = 1;
double y;
for (double x = -500; x < 500; x = x + 0.001) {
if (a * pow(x, 3) > 0) {
y = a * pow(x, 3);
SetPixel(hdc, sqrt(a * pow(x, 3)), x + 200, RGB(255, 0, 0));
}
else {
SetPixel(hdc, sqrt(abs(a * pow(x, 3))), x + 200, RGB(0, 255, 0));
y = a * pow(x, 3);
}
if (x == 499) {
cin.get();
}
}
}

int main () {
setlocale(LC_ALL, "ru");

thread thread_func(func);
thread_func.join();
cin.ignore();
return 0;
}
Доброй ночи. Продолжу тему с потоками. В следующем коде я разбил один поток на 2 подпотока внутри. К сожалению реализовать все это таким образом чтобы внутренние потоки вызывались единожды и использовались на протяжении всего кода я не имею возможности. Или понятия. В случае нахождения выхода именно из данной ситуации я обязательно это опубликую. Итак. Лесгоу к расшифровке.

Как и для этого я использую библиотеку винды для рисования и использовал почти весь код с предыдущего поста. Я все так же в мейне вызываю лишь один поток. Но: мой consumer вызывает два других потока в if-else. Для реализации всего этого я создаю новый поток в if и else и они мне вычисляют корды и рисуют график. При этом использую ref для передачи аргумента. Я пробовал передать туда еще что-то но почему-то эта функция не любит больше одного аргумента. Причина тоже неизвестна но при развитии в этом направлении, думаю найду решения. А в данный момент я просто сделал a и y глобальными. Функция join делает так что все потоки блокируются до завершения выбранного потока. Тоесть consumer не работает до тех пор пока этот поток не закончится. Помимо этого можно еще заблокиовать остальные потоки мьютексами но я решил сделать и то и то. Мьютексы как я уже сказал блокируют выполнение остальных потоков до тех пор пока вы сами не дадите остальным потокам право работать. Тоесть мьютекс есть закрывающийся и открывающийся. Как обычно перед окончанием врубается стоп кран чтобы график не стерся. Хотя я сделал его малым для быстрейшего завершения работы и его не задевает вовсе но давайте все же оставим)
Итак вот сам код, а я по сути уже и закончил.
#include <iostream>
#include <thread>
#include <mutex>
#include <windows.h>

std::mutex f_mutex;

HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
int a = 1;

using namespace std;

void func1(double x) {
f_mutex.lock();
double y;
y = a * pow(x, 3);
SetPixel(hdc, sqrt(a * pow(x, 3)), x + 200, RGB(255, 0, 0));
y = 0;
f_mutex.unlock();
}

void func2(double x) {
f_mutex.lock();
double y;
y = a * pow(x, 3);
SetPixel(hdc, sqrt(abs(a * pow(x, 3))), x + 200, RGB(0, 255, 0));
y = 0;
f_mutex.unlock();
}

void consumer() {
for (double x = -50; x < 50; x = x + 0.001) {
if (a * pow(x, 3) > 0) {
std::thread f(func1, std::ref(x));
f.join();
}
else {
std::thread f2(func2, std::ref(x));
f2.join();
}
if (x == 499) {
cin.get();
}
}

}

int main() {
std::thread create(consumer);
create.join();
return 0;
}
Necromancer IT
Доброй ночи. Продолжу тему с потоками. В следующем коде я разбил один поток на 2 подпотока внутри. К сожалению реализовать все это таким образом чтобы внутренние потоки вызывались единожды и использовались на протяжении всего кода я не имею возможности. Или…
Насчет слов что нельзя передавать параметры. Скажу сразу. Я дурачок и параметры передаются через запятую после вызова потока. Тоесть std::thread f(func1, x, и далее. ref там вовсе не нужен);
Я не знал об этом ведь на каких-то форумах информации не было вовсе и на одном была информация что там передаются по-другому аргументы самого потока и мне показалось что по-другому сделать возможности нет. Спасибо SimpleCode. Кто не смотрел - советую
Добрый вечер. Решил все же залить чтото стоящее из того что написал и сделать разбор. В этот раз разбор будет в коментах кода. Вкратце - змейка в консоли личного приготовления. Планирую оптимизацию и улучшение кода проекта Со временем. Инновации так же разберу. Вот код

#include <iostream>
#include <windows.h> // Библиотека винды
#include <conio.h> // Символьная библиотека для kbhit

enum move_sides { // Более простое определение направления движения
MOVE_UP,
MOVE_DOWN,
MOVE_RIGHT,
MOVE_LEFT,
MOVE_STOP
} direction;

const int map_size = 20; // Эта строка и дальше глобальные переменные использующиеся во всех функциях

int head[1][2];
int body[map_size * map_size][2];
bool game_over = false;
int fruit_cord[1][2];
int lenth_snake;

void fruit_generation() { // Генерация фрукта при помощи рандомайзера и повторная попытка генерации после совпадения с телом или головой
again:
fruit_cord[0][0] = rand() % map_size + 1;
fruit_cord[0][1] = rand() % map_size + 1;
for (int i = 0; i < lenth_snake; i++) {
if (fruit_cord[0][0] == body[i][0] && fruit_cord[0][1] == body[i][1] fruit_cord[0][0] == head[i][0] && fruit_cord[0][1] == head[i][1]) {
goto again;
}
}
}

void preset() { // Сбросил сюда начальные параметры для удобства и их инициализацию
fruit_generation();
head[0][0] = map_size / 2;
head[0][1] = head[0][0];
direction = MOVE_STOP;
lenth_snake = 0;
}

void input() { // kbhit - проверка факта нажатия клавиши getch - берем символ который нажали и при помощи кейсов меняем сторону движения(условно)
if (_kbhit()) {
switch (_getch()) {
case 'w':
direction = MOVE_UP;
break;

case 's':
direction = MOVE_DOWN;
break;

case 'a':
direction = MOVE_LEFT;
break;

case 'd':
direction = MOVE_RIGHT;
break;
}
}
}

void logic() {
bool ismoved = false;
int iteration = lenth_snake;

if (head[0][0] == fruit_cord[0][0] && head[0][1] == fruit_cord[0][1]) { //Если съеден фрукт(корды головы == корды фрукта)
fruit_generation();
if (lenth_snake == 0) {
body[lenth_snake][0] = head[0][0]; body[lenth_snake][1] = head[0][1]; // Если элемент первый то присваиваем корды головы
}
else {
body[lenth_snake][0] = body[lenth_snake - 1][0]; body[lenth_snake][1] = body[lenth_snake - 1][1]; // Если не первый присваиваем корды последнего элемента
}
ismoved = true;
lenth_snake++;
}

if (ismoved == true) {
iteration--;
}

for (int i = iteration; i >= 0; i--) { // Логика движения
if (lenth_snake >= 1 && i == 0) {
body[0][0] = head[0][0]; body[0][1] = head[0][1];
}
if (i > 0) {
body[i][0] = body[i - 1][0]; body[i][1] = body[i - 1][1];
}
}

switch (direction) // Фактическая смена кордов головы для передвижения
{
case MOVE_UP:
head[0][1]--;
break;
case MOVE_DOWN:
head[0][1]++;
break;
case MOVE_RIGHT:
head[0][0]++;
break;
case MOVE_LEFT:
head[0][0]--;
break;
}
for (int i = iteration; i >= 0; i--) { // Проверка не врезалась ли голова в тело
if (body[i][0] == head[0][0] && body[i][1] == head[0][1]) {
game_over = true;
}
}
if (head[0][0] > map_size head[0][0] < 0 head[0][1] > map_size head[0][1] < 0) { // Проверка не врезалась ли голова в стену
game_over = true;
}
}

void drаw() { // Расстановка символов если совпали корды головы то голова, если корды тела то тело, если ничего то пробел
for (int i = 0; i < map_size + 2; i++) {
for (int j = 0; j < map_size + 2; j++) {
3
if (j == 0 i == 0 j == map_size + 1 i == map_size + 1) {
std::cout << "#";
}
else if (j == head[0][0] && i == head[0][1]) {
std::cout << "@";
}
else if (j == fruit_cord[0][0] && i == fruit_cord[0][1]) {
std::cout << "F";
}
else {
bool isBody = false;
for (int k = 0; k < lenth_snake; k++) {
if (body[k][0] == j && body[k][1] == i) {
std::cout << "o";
isBody = true;
}
}
if (isBody == false) {
std::cout << " ";
}
}
}
std::cout << std::endl;
}
if (direction == MOVE_LEFT direction == MOVE_RIGHT) { // Этот иф и следующий более плавное движение(у консоли ячейки не квадратный)
Sleep(100);
}
else {
Sleep(200);
}
system("cls");
}

int main() { // Ставим преднастройки и гоняем функции по кругу
preset();
while (game_over == false) {
input();
logic();
drаw();
}
std::cout << "- GAME OVER -"; // Если проиграл
return 0;
}

Помимо этого для более удобного чтения дам ссылку на гит репозитория, кому будет интересно
PS: Репозиторием буду заниматься не только я

https://github.com/PalmaLuv/SnakeGame

Спасибо за внимание
2
Доброго времени суток 🙃

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

Кратко о проекте : это конвертор изображения в символы на языке C#.

И вот сама ссылка на него:
https://github.com/PalmaLuv/ASCII-Image-art

Спасибо за то что уделил мне минутку , с уважением Пальма 😊
5
Добрый вечер. Хочу поделиться старым кодом по воздвиганию сервера на с++. В скором времени подготовлю сервер-клиент проектик. Palma имеет у себя код сервер-клиент на c#. Дальше идет код с тоннами коментов. Вставив в вижуалку проще будет понять. В скором времени сделаю сервер-клиент как у Palma на с++ с передачей данных и соответствующими действиями на стороне клиента. Вот собственно и сам код следующим постом:
#include <iostream>
#include <winsock2.h> // тот самый носок
#include <iostream>
#include <cstdlib>
#pragma comment (lib, "ws2_32.lib") // надо загуглить
#pragma warning(disable: 4996)

int main() {
WSAData wsadata; //подрубаем структуру носка
WORD DLLVersion = MAKEWORD(2, 1); // Запрашивание второй версии носка
//WSAStartup(DLLVersion, &wsadata); // Подруб структуры и версии носка
if (WSAStartup(DLLVersion, &wsadata) != 0) { // чек подключен ли носок
std::cout << "Error of setup sock" << std::endl;
exit(1);
}
SOCKADDR_IN addr; // Адрес носка
addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Хранит айпишник сети
addr.sin_port = htons(1111); // подключаемся к определенному порту компа для передачи данных, главное чтобы он не был занят
addr.sin_family = AF_INET; // семейство протоколов инета
SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); // создание сокета, что такое сокет можно загуглить. это слово еще используется в характеристиках процов
bind(sListen, (SOCKADDR*)&addr, sizeof(addr));// привязка адреса к сокету
listen(sListen, SOMAXCONN);// Прослушка порта в ожидании подключения клиента
SOCKET newConnection;//Сокет для удержания связи с клиентом
int InaddrSize = sizeof(&addr);
newConnection = accept(sListen, (SOCKADDR*)&addr, &InaddrSize); // разрешение соединения с клиентом
// addr можно использовать для доступа к серверу по айпи
if (newConnection == 0) { // Проверка соединения
std::cout << "Error of connection" << std::endl;
}
else {
std::cout << "Connection of client successful" << std::endl;
}
char m[256] = "Server sent message to client";
send(newConnection, m, sizeof(m), NULL);// отправка переменной с данными
system("pause");
return 0;
}
Доброго времени суток , уверен что тут есть люди использующие Steam и знающие про SteamGift.com
Так вот , у меня есть для вас приложение написанное на Python
его суть что оно вместо вас учувствует в раздачах

вся инструкция на репозитории GitHub

https://github.com/PalmaLuv/SteamGiftBot

Спасибо за внимание , с уважением Palma
2
Прувет. Продолжил заниматься фронтендом и учитывая то что занимался им не так долго все вышло сносно. Прикреплю скриншот примера, рарник и ссылку на GitHub. Сайт простенький, будет продолжать дорабатываться. Хочу сделать поддержку распространенных расширений и выдвигающееся контекстное меню. А вот и сам скрин и рарник. Так же следующей фоткой будет jpg из фотошопа по которому делал
1
mnlist_website.rar
2.2 MB
Рарник
1
4905662.jpg
281.7 KB
Пример
1
Так как что-то актива тут нет, буду разбавлять вас чем-то интересным 🤔
1
This media is not supported in your browser
VIEW IN TELEGRAM
Уже давно я начал делать очень интересный по моим меркам скрипт, он на данный момент написан на Python версии 3.9 - 3.9.6

Так вот что он делает? - Он автоматизирует наши действия на SteamGift (Обладатели стима надеюсь знают о данном сайте). То есть мы логинимся на сайте, и передаём куки PHPSESSID по которым он парсит сайт и выполняет определённые действия🤖. Под определёнными действиями имею ввиду принятие участия в раздачах.

И вот сама ссылка на открытый код : SteamGiftBot

Спасибо за твоё внимание ❤️
2