Piszę sobie interpreter do tworzenia prostych gier tekstowych (jest sobie plik, program czyta i wykonuje go w konsoli) i nagle myślę sobie że przecież nie mam zielonego pojęcia jak napisać pętlę, ify oraz obsługę zmiennych. Mógłby mi ktoś to wytłumaczyć w prostych słowach? W internecie nic nie znalazłem a szukałem sporo.
Jakby ktoś chciał kod (mam obawy że nieunikniona jest spora zmiana podstaw kodu) to jest poniżej.
#include <stdio.h>
#include <cstdarg>
#include <stdlib.h>
#include <cstdlib>
#include <math.h>
#include <windows.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <sstream>
#include <iostream>
HANDLE kolor;
std::fstream plik;
std::string tekst;
int wylacznik_ef1=1;
int znaki;
int licznik=0;
class func{
public:
bool st(std::string word, std::string tekst){
int wynik=true;
for(int c=0; c!=word.length();c++) if(tekst[c]!=word[c]) wynik=false;
return wynik;
}
};
int pisz()
{
znaki=tekst.size();
char tabznak[znaki];
std::string znak;
for(int a=0; a!=znaki; a++) //pojedyncze litery alfabetu tylko do petli for i while
{
tabznak[a] = tekst[a];
}
for(int b=0; b!=znaki; b++)
{
znak=tabznak[b];
if( tekst[b]=='`' && tekst[b+1] =='c')
{
if(tekst[b+2]=='0') SetConsoleTextAttribute( kolor, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN ); // if coś=znak/char ZAWSZE 'ZNAK/CHAR'
if(tekst[b+2]=='1') SetConsoleTextAttribute( kolor, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY );
if(tekst[b+2]=='2') SetConsoleTextAttribute( kolor, FOREGROUND_RED);
if(tekst[b+2]=='3') SetConsoleTextAttribute( kolor, FOREGROUND_RED | FOREGROUND_INTENSITY );
if(tekst[b+2]=='4') SetConsoleTextAttribute( kolor, FOREGROUND_BLUE);
if(tekst[b+2]=='5') SetConsoleTextAttribute( kolor, FOREGROUND_BLUE| FOREGROUND_INTENSITY );
if(tekst[b+2]=='6') SetConsoleTextAttribute( kolor, FOREGROUND_GREEN );
if(tekst[b+2]=='7') SetConsoleTextAttribute( kolor, FOREGROUND_GREEN| FOREGROUND_INTENSITY );
if(tekst[b+2]=='8') SetConsoleTextAttribute( kolor, FOREGROUND_RED | FOREGROUND_BLUE );
if(tekst[b+2]=='9') SetConsoleTextAttribute( kolor, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
if(tekst[b+2]=='A') SetConsoleTextAttribute( kolor, FOREGROUND_BLUE| FOREGROUND_GREEN);
if(tekst[b+2]=='B') SetConsoleTextAttribute( kolor, FOREGROUND_BLUE| FOREGROUND_GREEN | FOREGROUND_INTENSITY);
if(tekst[b+2]=='C') SetConsoleTextAttribute( kolor, FOREGROUND_RED | FOREGROUND_GREEN);
if(tekst[b+2]=='D') SetConsoleTextAttribute( kolor, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
if(tekst[b+2]=='E') system("color F0");
if(tekst[b+2]=='F') system("color 07");
b=b+2;
wylacznik_ef1=0;
}
if( tekst[b]=='`' && tekst[b+1] =='n')
{
std::cout << "\n";
b=b+1;
wylacznik_ef1=0; //Nie wypisuj na ekranie
}
if(wylacznik_ef1==1)
{
std::cout << znak;
}
wylacznik_ef1=1;
}
}
int konwZmienna2;
int atoi2(std::string konwZmienna)
{
konwZmienna2=atoi(konwZmienna.c_str());
return konwZmienna2;
}
int main()
{
func funkcje;
std::cout << "STARTING..." << std::endl;
Sleep(100);
system("cls");
int wynikowe_sleep;
kolor= GetStdHandle( STD_OUTPUT_HANDLE );
setlocale( LC_ALL, "" );
bool wylacznik = false;
plik.open( "plik.txt", std::ios::in );
getline( plik, tekst );
while(wylacznik == false)
{
if(funkcje.st("write", tekst))
{
getline(plik, tekst);
pisz();
std::cout << "\n";
getline(plik, tekst);
}
if(funkcje.st("sleep", tekst))
{
tekst.erase(0, 6); //kasuje znaki od 0 do 6
wynikowe_sleep = atoi2(tekst);
Sleep(wynikowe_sleep*10); //1/1000*10 sekundy
getline(plik, tekst);
}
if(tekst=="cls")
{
system("cls");
getline(plik, tekst);
}
if(tekst=="endg")
{
wylacznik=true;
getch();
}
if(tekst=="endng")
{
wylacznik=true;
}
}
system("color 07");
plik.close();
return 0;
}
Jestem również otwarty na krytykę która pozwoli mi ulepszyć kod. (na pewno wiem że mam w nim bałagan)