to taki engine_asci_graficzny przerobiony. Prymityw bez udziwniań. Może się komuś przyda, bo sam szukam właśnie takich rozwiązań a przykłady które znajduję często są mało jeszcze dla mnie czytelne. Proszę o konstruktywną krytykę i odpowiedź na pytanie: jak wyłączyć migający kursor??(znaki '*'i '#' są w takiej postaci w obrazek[] żeby było bardziej czytelne...)
#include <iostream>
#include <conio.h>
#include "ddtconsole.h"
int main()
{
enum { nowalina = 1, powtorz = 2, gotoxy_ = 3, kolor = 4, fill = 5, obiekt_ = 6 };
int obrazek[] = { 4, 1,
2, 80, 'A',
1,
4, 10,
3, 10, 10,
'O',
4, 8,
5, 12, 10, 68, 20, 176,
4, 10,
6, 1, 13, 13,
4, 12,
6, 3, 60, 3,
5, 20, 5, 20, 22, 48,
49,
4, 4,
6, 0, 14, 12,
4, 5,
6, 1, 16, 18
}
;
int obiekt[ 4 ][ 103 ] = {
{ 5, 3, 201, 205, 205, 205, 187,
186, 256, 256, 256, 186,
200, 205, 205, 205, 188 },
{ 6, 6, 201, 205, 205, 205, 205, 187,
186, 256, 256, 256, 'A', 186,
186, 256, 256, 'A', 256, 186,
186, 256, 'A', 256, 256, 186,
186, 'A', 256, 256, 256, 186,
200, 205, 205, 205, 205, 188 },
{ 3, 3, 'a', 'b', 'c',
201, 201, 201,
201, 201, 201 },
{ 5, 7, 219, 219, 219, 219, 219, 219, 0, 0, 0, 219, 219, 0, 0, 0, 219, 219, 0, 0, 0, 219, 219, 0, 0, 0, 219, 219, 0, 0, 0, 219, 219, 219, 219, 219, 219 }
};
int ilosc_powtorzen = 0;
int znak = 0;
using namespace ddt::console;
using std::cout;
for( int p = 0; p < 51; ++p )
{
znak = obrazek[ p ];
int licznik = 2;
switch( znak )
{
case nowalina:
cout << "\n";
break;
case powtorz:
for( int q = 0; q < obrazek[( p + 1 ) ]; ++q )
cout << char( obrazek[( p + 2 ) ] );
p += 2;
break;
case gotoxy_:
int x;
int y;
p++;
x = obrazek[ p ];
p++;
y = obrazek[ p ];
gotoxy( x, y );
break;
case kolor:
p++;
textcolor( obrazek[ p ] );
break;
case fill:
int x1, x2, y1, y2;
p++; x1 = obrazek[ p ]; p++; y1 = obrazek[ p ]; p++; x2 = obrazek[ p ]; p++; y2 = obrazek[ p ];
gotoxy( x1, y1 );
p++;
int ny;
ny = y1;
int nx;
nx = x1;
for( int n = 0; n <=( y2 - y1 ); ++n )
{
for( int m = 0; m <=( x2 - x1 ); m++ )
cout << char( obrazek[ p ] );
ny++;
gotoxy( nx, ny );
}
break;
case obiekt_:
p++;
int nr_obiektu;
nr_obiektu = obrazek[ p ];
p++;
int poz_o_x = obrazek[ p ];
p++;
int poz_o_y = obrazek[ p ];
int mx = poz_o_x;
int my = poz_o_y;
gotoxy( mx, my );
int ob_x = obiekt[ nr_obiektu ][ 0 ];
int ob_y = obiekt[ nr_obiektu ][ 1 ];
for( int y = 0; y < ob_y; ++y )
{
gotoxy( mx, my + y );
for( int x = licznik; x < ob_x + licznik; ++x )
if( obiekt[ nr_obiektu ][ x ] == 256 )
gotoxy( wherex() + 1, my + y );
else
cout << char( obiekt[ nr_obiektu ][ x ] );
licznik += ob_x;
}
break;
}
if( znak != 0 && znak > 6 ) cout << char( obrazek[ p ] );
if( znak == 0 ) cout << char( 0 );
}
getch();
return( 0 );
}
}
z tym rysowaniem kółek i kresek skośnych to sobie chyba odpuszczę.
dodałem 5-fill w sumie sprawa jeszcze bardziej uproszczona.
ps problem który miał wyświetlić *T*I* można w sumie zrobić jedynie z case 5. resztę wywalić i kod jeszcze bardziej uproszczony niż z tymi dwoma tabelkami.
case 6- wyświetla gotowe z drugiej tablicy "obiekty" używając 256 zamiast 0 można wyświetlić "przeźroczysty obiekt".
(procedura ma posłużyć mi jako przyszła funkcja "malowania" grafiki kalkulatora do ćwiczenia z funkcji).