• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Interpreter do gier tekstowych. C++

Ultraszybki serwer VPS NVMe START
0 głosów
101 wizyt
pytanie zadane 17 października w C i C++ przez TomaszA2 Obywatel (1,380 p.)

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)

komentarz 17 października przez Knayder Nałogowiec (28,170 p.)
Pisanie własnego języka, to skomplikowana sprawa, a patrząc na twój kod, myślę że nie podołasz.
komentarz 17 października przez TomaszA2 Obywatel (1,380 p.)
Gdybym poddawał się za każdym razem gdy myślę że nie podołam, już dawno rzuciłbym programowanie. Bardzo proszę o pomoc. (teoretyczną, jak już będę wiedział jak to ma działać, oraz co jest do poprawy i w jaki sposób to sam napiszę odpowiedni kod, chociaż prostymi przykładami też nie pogardzę, ponieważ z nich najłatwiej jest mi się uczyć)

Poza tym, nie wiem czy nazwałbym to własnym językiem, a przynajmniej jeszcze nie. (mam nadzieję że uda mi się to z wami osiągnąć, może nie w najbliższym czasie, ale jednak)
komentarz 17 października przez Knayder Nałogowiec (28,170 p.)
Nikt nie zaczyna od Mount everest, tylko od mniejszych gór.
komentarz 17 października przez TomaszA2 Obywatel (1,380 p.)
Zauważ iż nie rozprawiamy o górach lecz o kodzie źródłowym. Moglibyśmy przejść od razu do części kiedy mi pomagacie? Tak czy siak będę to robił, od was zależy tylko jak długo i ile razy będę musiał napisać kod programu od nowa. Albo raczej czy w ogóle wpadnę na rozwiązanie takiego problemu. W internecie pustka, a nawet jeśli jest już coś to praktycznie zawsze jest to dziwnie napisany interpreter języka BrainF.
komentarz 17 października przez Huberti Użytkownik (940 p.)
edycja 17 października przez Huberti
Lepsza jest konstrukcja if(...);, else if (...); jeżeli tylko jeden warunek ma być prawdą.

#include <iostream> wystarczy raz
komentarz 17 października przez adrian17 VIP (107,300 p.)

Moglibyśmy przejść od razu do części kiedy mi pomagacie?

Chodzi o to, że żeby "pomóc", musielibyśmy zacytować połowę książki o projektowaniu języków / pisaniu interpreterów.

W internecie pustka

Um, tego jest mnóstwo. Tu na przykład 14-częściowa seria o pisaniu prostego interpretera https://ruslanspivak.com/lsbasi-part1/

1 odpowiedź

0 głosów
odpowiedź 17 października przez shead VIP (141,060 p.)

Czyli robisz coś na kształt własnego języka programowania? No to: flex + bison / yacc

  1. https://github.com/westes/flex
  2. https://www.gnu.org/software/bison/

Podobne pytania

+5 głosów
3 odpowiedzi 357 wizyt
pytanie zadane 12 września 2015 w Nasze projekty przez Radfler Szeryf (94,380 p.)
0 głosów
1 odpowiedź 68 wizyt
pytanie zadane 4 czerwca 2016 w C i C++ przez C☺ndzi Stary wyjadacz (10,930 p.)
+1 głos
1 odpowiedź 85 wizyt
pytanie zadane 20 kwietnia 2016 w C i C++ przez polewa Nowicjusz (230 p.)

41,475 zapytań

80,496 odpowiedzi

159,285 komentarzy

19,795 pasjonatów

Przeglądających: 305
Pasjonatów: 25 Gości: 280

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...