Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [C++] Tekstitiedoston käyttö karttana

Sivun loppuun

Syntty [18.06.2009 01:15:07]

#

Eli, miten tehdä karttasysteemi joka lataa kartan tekstitiedostosta? Ja miten voi etsiä sen kansion mihin peli on luotu? Jos olen tehnyt tekstitiedoston jossa on nollia ja ykkösiä ja minun pitäisi saada se ladattua peliin niin miten tekisin sen?

Grandi [18.06.2009 03:00:59]

#

No joo, tässä on kuvaustasi vastaava, staattinen kartanlataaja. Annoin taulukon tietotyypiksi bool, koska 1:stä ja 0:aa varten on kai turha käyttää muuta.

Karttatiedosto sisältää siis niitä ykkösiä ja nollia. Yhdellä rivillä on aina kartan leveyden verran tavaraa.

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

#define LEVEYS  20   // koko
#define KORKEUS 10
#define POLKU   "map.txt"  // Polku ladattavaan karttafiluun

int main (void)
{
	bool Kartta[LEVEYS][KORKEUS];

	ifstream File (POLKU);
	if (!File.is_open())
	{
		cout << "Karttaa ei voi ladata!\n";
		return 0;
	}

	int y = 0;
	while (!File.eof())
	{
		string Line;
		getline (File, Line);

		for (int i=0; i<LEVEYS; i++)
		{
			if (Line[i] == '0' || Line[i] == '1')
				Kartta [i][y] = (Line[i] == '1');
		}
		y++;
	}
	File.close();

	for (int y=0; y<KORKEUS; y++)
	{
		for (int x=0; x<LEVEYS; x++)
		{
			if (Kartta[x][y])
				cout << '#';
			else
				cout << ' ';
		}
		cout << endl;
	}
}

Ruma esimerkkikartta kokoa 20*10:

00000001000000000000
00000111110000000000
01000001100011100000
01001000000111000000
01100111100000000000
00100000100001100000
00110100100000111000
00001000000111111000
01100000100000000000
00100000000000000000

Syntty [18.06.2009 17:51:57]

#

En saa jostain syystä tätä toimimaan pdcursesin kanssa :/ Kiitos kuitenkin koska enköhän saa sen kuitenkin toimimaan!

jokupoika [21.06.2009 12:01:07]

#

noi stream jutut pitää ainakin tehdä ei-curses tilassa, muuten ne ei toimi...ja piirtäminen sitten vaikka addch:lla tai vastaavalla curses-tilassa

Syntty [01.07.2009 02:42:23]

#

Voi perskuta kun ei minulla leikkaa että miten tämän saa cursesilla toimimaan... Voikos joku kiltti auttaa?

Metabolix [01.07.2009 08:53:09]

#

Vaihdat annetun esimerkin merkkejä tulostaviin cout-kohtiin mvaddch-funktion sopivilla parametreilla, sillä saat piirrettyä sopivan merkin kohtaan (x, y). Silmukan lopussa olevan endl-rivin voit poistaa kokonaan. Lisäksi pitää tietenkin olla normaalit curses-alustukset ja lopetukset yms.

Tiedostoilla ja cursesilla ei ole mitään tekemistä keskenään eivätkä ne häiritse toisiaan, eli jokupoika neuvoi tässä suhteessa väärin.

Syntty [01.07.2009 13:49:40]

#

Jaa no... Saattaa olla ettei toiminut kun tein noin kuin jokupoika neuvoi :) Kokeilen uudestaan!


Edit. Miten muuten C++:lla voi etsiä polun mihin ohjelma on asennettu? Eli samalla tavalla kuin VB:ssä App.Path.

koo [01.07.2009 15:47:01]

#

Syntty kirjoitti:

Miten muuten C++:lla voi etsiä polun mihin ohjelma on asennettu? Eli samalla tavalla kuin VB:ssä App.Path.

Ajettavan ohjelman nimeä voi metsästää main-funktion argumentista args[0]. Se voi sisältää ohjelman nimen ja koko polunkin. Takeita tästä ei ole, sillä ohjelmaahan voidaan ajaa sulautettuna ohjelmistona vaikka ompelukoneessa, jossa ei ole edes tiedostojärjestelmää.

Windowsissa exen nimi polkuineen voi selvitä vaikka seuraavalla funktiolla:

#include <windows.h>
#include <string>
#include <vector>

typedef std::basic_string<TCHAR> tstring;

tstring get_module_file_name(HMODULE hmodule = 0) {
  int const blen = 1000;
  std::vector<TCHAR> buf(blen);
  DWORD len;
  for (;;) {
    len = GetModuleFileName(hmodule, &buf[0], buf.size());
    if (len < buf.size()) break;
    buf.resize(buf.size() + blen);
  }
  if (len == 0) throw GetLastError();
  return tstring(&buf[0], len);
}

jokupoika [05.07.2009 18:25:18]

#

lainaus:

Jaa no... Saattaa olla ettei toiminut kun tein noin kuin jokupoika neuvoi :) Kokeilen uudestaan!

Kyllä pitäis toimia ilman mitään hämminkiä.
En osannut cursesilla kirjottaa tiedostoon niin otin curses tilan pois ja tein normaalisti. Varmaan purkkaratkasu monen mielestä mutta kyllä se toimii


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta