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

Interpreter do gier tekstowych. C++

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

92,545 zapytań

141,387 odpowiedzi

319,503 komentarzy

61,930 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...