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

Interpreter do gier tekstowych. C++

VPS Starter Arubacloud
0 głosów
221 wizyt
pytanie zadane 17 października 2017 w C i C++ przez TomaszA2 Obywatel (1,720 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 2017 przez Knayder Nałogowiec (37,640 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 2017 przez TomaszA2 Obywatel (1,720 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 2017 przez Knayder Nałogowiec (37,640 p.)
Nikt nie zaczyna od Mount everest, tylko od mniejszych gór.
komentarz 17 października 2017 przez TomaszA2 Obywatel (1,720 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 2017 przez Huberti Gaduła (4,500 p.)
edycja 17 października 2017 przez Huberti
Lepsza jest konstrukcja if(...);, else if (...); jeżeli tylko jeden warunek ma być prawdą.

#include <iostream> wystarczy raz
komentarz 17 października 2017 przez adrian17 Ekspert (344,100 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 2017 przez niezalogowany

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 840 wizyt
pytanie zadane 12 września 2015 w Nasze projekty przez Radfler VIP (101,030 p.)
0 głosów
1 odpowiedź 150 wizyt
pytanie zadane 4 czerwca 2016 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
+1 głos
1 odpowiedź 157 wizyt
pytanie zadane 20 kwietnia 2016 w C i C++ przez polewa Nowicjusz (230 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...