[LINUX] [Langage C] Ma locomotive est trop lente ~ J'ai fait une commande sl ~

【Aperçu】

J'ai fait une commande sl qui peut déplacer la locomotive dans le terminal. Cependant, les options ne sont pas implémentées. De plus, ma locomotive est plus lente que la locomotive d'origine (elle est plus lente que celle d'origine après sa création, mais je me demande si c'est plus intéressant ...). Le titre est un hommage à cet article → Mon ls est trop tard

Je n'ai pas du tout regardé le code de la famille principale, mais je l'ai créé en regardant à plusieurs reprises le résultat de l'exécution de la famille principale. (Je ne sais pas si le code original est sur le net) [Ajout] fujitanozomu a commenté et c'était sur le GitHub ci-dessous.   https://github.com/mtoyoda/sl

[Préparation]

Vous aurez besoin de curses.h lorsque vous exécuterez le code. Je me suis référé au site suivant pour la méthode d'installation. Linux Error: curses.h: No such file or directory Problem Solution

【environnement】

[vagrant@vagrant-centos65 sl_command]$ cat /etc/centos-release 
CentOS release 6.5 (Final)

【code】

Lors de la compilation de gcc -o sl sl.c -l curses

sl.c


#include <stdio.h>
#include <curses.h>
#include <string.h>

void printSL();

int main(int argc, char *argv[])
{
	//Initialisation
	initscr();
	//Ne pas afficher le curseur
	curs_set(0);
	//Ne pas afficher les caractères saisis
	noecho();
	//N'utilisez pas de tampon
	cbreak();
	//Sortie de locomotive
	printSL();
	//Contrôle terminal terminal
	endwin();
	return 0;
}

void printSL()
{
	int count = 1;
	int slScrInCol = 0, slScrOutCol = 0;
	int lineNum = 0;
	int colNum = 0;

	//Obtenez la taille actuelle de l'écran
	// curses.LIGNES définies par h,Avec COLS, même si vous modifiez la taille du terminal
	//Obtenez la taille d'écran actuelle, car ce sera la taille d'écran initiale
	//colNum n'est pas nécessaire et ne sera plus utilisé
	getmaxyx(stdscr, lineNum, colNum);
	//Pour afficher la locomotive au centre de l'écran
	lineNum /= 4;
	char str[24][1000] = {'0'};


	int maxLen = strlen("  \\_/      \\__/  \\__/  \\__/  \\__/      \\_/               \\_/   \\_/    \\_/   \\_/");
	//Le numéro magique 6 est pour un ajustement fin
	while(COLS + maxLen + 6 - slScrInCol != 0) {
		strncpy(str[0], "                        (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O", slScrInCol);
		strncpy(str[1], "                   (@@@)", slScrInCol);
		strncpy(str[2], "               (    )", slScrInCol);
		strncpy(str[3], "            (@@@@)", slScrInCol);
		strncpy(str[4], "          (   )", slScrInCol);

		strncpy(str[5], "                        (@@) (  ) ( )  ()  (@)    @@    @     O     @     O      @", slScrInCol);
		strncpy(str[6], "                   (   )", slScrInCol);
		strncpy(str[7], "               (@@@@)", slScrInCol);
		strncpy(str[8], "            (    )", slScrInCol);
		strncpy(str[9], "          (@@@)", slScrInCol);

		//Sortie de fumée de cheminée
		//La fumée s'affiche plus lentement que les roues car la fumée et les roues se déplacent à des vitesses différentes
		if (count <= 4) {
			mvprintw(lineNum,   COLS-slScrInCol, str[0]);
			mvprintw(lineNum+1 ,COLS-slScrInCol, str[1]);
			mvprintw(lineNum+2 ,COLS-slScrInCol, str[2]);
			mvprintw(lineNum+3 ,COLS-slScrInCol, str[3]);
			mvprintw(lineNum+4 ,COLS-slScrInCol, "");
			mvprintw(lineNum+5 ,COLS-slScrInCol, str[4]);
		} else {
			mvprintw(lineNum,   COLS-slScrInCol, str[5]);
			mvprintw(lineNum+1 ,COLS-slScrInCol, str[6]);
			mvprintw(lineNum+2 ,COLS-slScrInCol, str[7]);
			mvprintw(lineNum+3 ,COLS-slScrInCol, str[8]);
			mvprintw(lineNum+4 ,COLS-slScrInCol, "");
			mvprintw(lineNum+5 ,COLS-slScrInCol, str[9]);
		}

		strncpy(str[10], "      ====        ________                ___________", slScrInCol);
		strncpy(str[11], "  _D _|  |_______/        \\__I_I_____===__|_________|", slScrInCol);
		strncpy(str[12], "   |(_)---  |   H\\________/ |   |        =|___ ___|      _________________", slScrInCol);
		strncpy(str[13], "   /     |  |   H  |  |     |   |         ||_| |_||     _|                \\_____A", slScrInCol);
		strncpy(str[14], "  |      |  |   H  |__--------------------| [___] |   =|                        |", slScrInCol);
		strncpy(str[15], "  | ________|___H__/__|_____/[][]~\\_______|       |   -|                        |", slScrInCol);
		strncpy(str[16], "  |/ |   |-----------i_____I [][] []  D   |=======|____|________________________|_", slScrInCol);

		//Sortie au dessus des roues
		mvprintw(lineNum+6 , COLS-slScrInCol, str[10]);
		mvprintw(lineNum+7 , COLS-slScrInCol, str[11]);
		mvprintw(lineNum+8 , COLS-slScrInCol, str[12]);
		mvprintw(lineNum+9 , COLS-slScrInCol, str[13]);
		mvprintw(lineNum+10, COLS-slScrInCol, str[14]);
		mvprintw(lineNum+11, COLS-slScrInCol, str[16]);
		mvprintw(lineNum+12, COLS-slScrInCol, str[10]);


		strncpy(str[17], "__/ =| o |=-O=====O=====O=====O\\  ____Y___________|__|__________________________|_", slScrInCol);
		strncpy(str[18], " |/-=|___|=    ||    ||    ||    |_____/\\___/          |_D__D__D_|  |_D__D__D_|", slScrInCol);
		strncpy(str[19], "  \\_/      \\__/  \\__/  \\__/  \\__/      \\_/               \\_/   \\_/    \\_/   \\_/", slScrInCol);
		strncpy(str[20], "__/ =| o |=-~~\\  /~~\\  /~~\\  /~~\\ ____Y___________|__|__________________________|_", slScrInCol);
		strncpy(str[21], " |/-=|___|=O=====O=====O=====O   |_____/\\___/          |_D__D__D_|  |_D__D__D_|", slScrInCol);
		strncpy(str[22], "  \\_/      \\_O=====O=====O=====O/      \\_/               \\_/   \\_/    \\_/   \\_/", slScrInCol);
		strncpy(str[23], " |/-=|___|=   O=====O=====O=====O|_____/\\___/          |_D__D__D_|  |_D__D__D_|", slScrInCol);


		//Sortie de la partie roue
		if (count % 4 == 1) {
			mvprintw(lineNum+13, COLS-slScrInCol, str[17]);
			mvprintw(lineNum+14, COLS-slScrInCol, str[18]);
			mvprintw(lineNum+15, COLS-slScrInCol, str[19]);			
		} else if (count % 4 == 2) {
			mvprintw(lineNum+13, COLS-slScrInCol, str[20]);
			mvprintw(lineNum+14, COLS-slScrInCol, str[21]);
			mvprintw(lineNum+15, COLS-slScrInCol, str[19]);
		} else if (count % 4 == 3) {
			mvprintw(lineNum+13, COLS-slScrInCol, str[20]);
			mvprintw(lineNum+14, COLS-slScrInCol, str[18]);
			mvprintw(lineNum+15, COLS-slScrInCol, str[22]);
		} else {
			mvprintw(lineNum+13, COLS-slScrInCol, str[20]);
			mvprintw(lineNum+14, COLS-slScrInCol, str[23]);
			mvprintw(lineNum+15, COLS-slScrInCol, str[19]);
		}

		//Pour éviter d'augmenter le nombre de comptages
		if (count / 8 == 1) {
			count = 1;
		} else {
			count++;
		}

		//Sortie écran lorsque la tête de la locomotive sort du côté gauche de l'écran
		if (COLS - slScrInCol <= 0) {
			if (count <= 4) {
				mvprintw(lineNum,   0, &str[0][slScrOutCol]);
				mvprintw(lineNum+1 ,0, &str[1][slScrOutCol]);
				mvprintw(lineNum+2 ,0, &str[2][slScrOutCol]);
				mvprintw(lineNum+3 ,0, &str[3][slScrOutCol]);
				mvprintw(lineNum+4 ,0, "");
				mvprintw(lineNum+5 ,0, &str[4][slScrOutCol]);
			} else {
				mvprintw(lineNum,   0, &str[5][slScrOutCol]);
				mvprintw(lineNum+1 ,0, &str[6][slScrOutCol]);
				mvprintw(lineNum+2 ,0, &str[7][slScrOutCol]);
				mvprintw(lineNum+3 ,0, &str[8][slScrOutCol]);
				mvprintw(lineNum+4 ,0, "");
				mvprintw(lineNum+5 ,0, &str[9][slScrOutCol]);
			}

			mvprintw(lineNum+6 , 0, &str[10][slScrOutCol]);
			mvprintw(lineNum+7 , 0, &str[11][slScrOutCol]);
			mvprintw(lineNum+8 , 0, &str[12][slScrOutCol]);
			mvprintw(lineNum+9 , 0, &str[13][slScrOutCol]);
			mvprintw(lineNum+10, 0, &str[14][slScrOutCol]);
			mvprintw(lineNum+11, 0, &str[16][slScrOutCol]);
			mvprintw(lineNum+12, 0, &str[10][slScrOutCol]);

			if (count % 4 == 1) {
				mvprintw(lineNum+13, 0, &str[17][slScrOutCol]);
				mvprintw(lineNum+14, 0, &str[18][slScrOutCol]);
				mvprintw(lineNum+15, 0, &str[19][slScrOutCol]);			
			} else if (count % 4 == 2) {
				mvprintw(lineNum+13, 0, &str[20][slScrOutCol]);
				mvprintw(lineNum+14, 0, &str[21][slScrOutCol]);
				mvprintw(lineNum+15, 0, &str[19][slScrOutCol]);
			} else if (count % 4 == 3) {
				mvprintw(lineNum+13, 0, &str[20][slScrOutCol]);
				mvprintw(lineNum+14, 0, &str[18][slScrOutCol]);
				mvprintw(lineNum+15, 0, &str[22][slScrOutCol]);
			} else {
				mvprintw(lineNum+13, 0, &str[20][slScrOutCol]);
				mvprintw(lineNum+14, 0, &str[23][slScrOutCol]);
				mvprintw(lineNum+15, 0, &str[19][slScrOutCol]);
			}
			slScrOutCol++;
		}

		slScrInCol++;
		//Attendez 60 millisecondes
		usleep(6 * 10000);
		refresh();
		clear();
	}
}

【Résultat de l'exécution】

[Ma locomotive]

my_sl.gif

[Locomotive d'origine]

org_sl.gif

[Site de référence]

J'ai écrit un disjoncteur de bloc trop simple en langage C Super-explication des fonctions fréquemment utilisées

Recommended Posts

[Langage C] Ma locomotive est trop lente ~ J'ai fait une commande sl ~
J'ai fait ma propre langue. (1)
J'ai fait ma propre langue (2)
J'ai créé un site d'apprentissage C ++
J'ai fait une commande lo qui est plus utile que ls
J'ai fait un module en langage C qui filtre les images chargées par Python
J'ai fait un simple lecteur RSS ~ Edition C ~
J'ai fait une commande pour attendre que Django démarre jusqu'à ce que la base de données soit prête
J'ai fait une commande pour marquer le clip de la table
〇✕ J'ai fait un jeu
J'ai fait une commande pour générer un commentaire pour une table dans Django
J'ai fait une caméra de surveillance avec Raspberry PI pour la première fois.
Quand j'ai créé un Discord Bot, mes camarades de classe ont détruit mon ordinateur
J'ai fait un script pour dire bonjour à mon Koshien
Tri de tas fait en langage C
Le verrouillage de Pipenv est trop lent
J'ai fait un texte Python
J'ai fait ma propre AML
Fait une commande pour FizzBuzz
J'ai fait un robot discord
[Langage C] [Linux] Essayez de créer une simple commande Linux * Ajoutez simplement! !!
Le go-template est-il parfait pour le tuling? J'ai créé un système de traitement brainf * ck
Python> J'ai créé un code de test pour mon propre fichier externe
J'ai fait une commande pour afficher un calendrier coloré dans le terminal