Problem ze wskaźnikami

0

Witam.
Wreszcie wziąłem się za wskaźniki, próbóję napisać coś "w podobie" do gry, po prostu wpisując klasyczne "wsad" i zatwierzając enterem możemy się poruszać po tablicy 10 x 10. Chciałbym prosić o sprawdzenie czy nie ma w kodzie jakichś większych błędów, co można jeszcze poprawić. Chętnie popracowałbym nad jakimś roguelike :D
Pozdrawiam.

 
#include <stdio.h>
#define WIERSZE 10
#define KOLUMNY 10

void wys_plansza(char [][KOLUMNY]);
void zczytaj(int *, int *);
int pobierz_pierwszy(void);

int main(void){
	char plansza [WIERSZE][KOLUMNY]= {
			{'o','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'},
			{'x','x','x','x','x','x','x','x','x','x'}
	};
	int x, y;
	x = 0; //wysokość
	y = 0; //szerokość
	wys_plansza (plansza);
	while (1){
		plansza[x][y] = 'x';
		zczytaj(&x, &y);
		plansza[x][y] = 'o';
		wys_plansza (plansza);
	}
	return 0;
}

wys_plansza(char plansza[][KOLUMNY]){
	int x, y;
	for (x = 0; x < WIERSZE; x++) {
		for (y = 0; y < KOLUMNY; y++){
			putchar(plansza[x][y]);
		}
		putchar('\n');
	}
}

zczytaj(int *x, int *y){
	char ruch;
	int p = 0;
	while (p == 0){
		printf("%c ", '$');
		ruch = pobierz_pierwszy();
		switch (ruch) {
		case 'd':
			if (*y < (KOLUMNY - 1)){
				(*y)++;
				p = 1;
				break;
			}
			else if (*y == (KOLUMNY - 1)){
				*y = 0;
				p = 1;
				break;
			}
			else{
				break;
			}
		case 'a':
			if(*y > 0){
				(*y)--;
				p = 1;
				break;
			}
			else if(*y == 0){
				*y = (KOLUMNY - 1);
				p = 1;
				break;
			}
			else{
				break;
			}
		case 'w':
			if (*x > 0){
				(*x)--;
				p = 1;
				break;
			}
			else if(*x == 0){
				*x = (WIERSZE - 1);
				p = 1;
				break;
			}
			else{
				break;
			}
		case 's':
			if(*x < (WIERSZE - 1)){
				(*x)++;
				p = 1;
				break;
			}
			else if(*x == (WIERSZE - 1)){
				*x = 0;
				p = 1;
				break;
			}
			else{
				break;
			}
		default:
			printf("To nie jest prawidłowa wartość!\n");
		}
	}
}

int pobierz_pierwszy(void){
	int ch;
	ch = getchar();
	while (getchar() != '\n'){
		continue;
	}
	return ch;
}
0

Podbiajam, może komuś sie bedzie chciało to sprawdzić ;)

0

po co ta pętla while w ogóle jest w funkcji pobierz_pierwszy przecież jak pobierasz getcharem to musisz wcisnąć enter żeby wczytać znak z klawiatury. wystarczy ,że napiszesz
return getchar();

0

@robcio Gdy klikasz enter w buforze zostaje jeszcze znak nowej linii. while pozwala pominąć wszystkie znaki PO pierwszym, łącznie ze znakiem nowej linii. Np. "wartość" zostanie potraktowane jak 'w'. Z resztą, w miejsce wywołania pobierz_pierwszy() wstaw getchar() i zobacz co sie stanie.

0

@GazowanySmalec to nie jest C-string, do zmiennej "char ch" zostaje przypisany 1 znak, nie tworzy się dodatkowego miejsca

int main(int argc, char *argv[])
{
    cout << "Podaj char: ";
    char ch = getchar();

    cout << "Podales :" << ch << ", ma znakow: " << sizeof(ch) << "\n";
    return 0;
}

za każdym razem wyświetla tylko to, co chcę, czyli 1znak. Oczywiście jak nic nie piszesz i klikniesz w puste miejsce enter, to pojawi się w ch znak nowej linii

dodanie znacznika <code class="c"> - fp

0

Nie musisz stosować całości, wystarczy że załapiesz jak są wykonane kilka prostych tryków:

#include <stdio.h>
#include <windows.h>

#define WIERSZE 10
#define KOLUMNY 10

void setinputmode()
  {
   HANDLE std;
   DWORD mode;
   std=GetStdHandle(STD_INPUT_HANDLE);
   GetConsoleMode(std,&mode);
   SetConsoleMode(std,mode&(~(ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT)));
  }
  
void fill(char Plansza[])
  {
   int x,y,i;
   for(y=0,i=0;y<WIERSZE;++y,Plansza[i++]='\n')
     {
      for(x=0;x<KOLUMNY;++x) Plansza[i++]='x';
     }
   Plansza[i++]='\0';
   Plansza[0]='o';
  }

void resetpos()
  {
   COORD pos={0,0};
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
  }

int readinput(int pos)
  {
   int y,x;
   y=pos/(KOLUMNY+1);
   x=pos-(KOLUMNY+1)*y;
   switch(getchar())
     {
      case 'a': x=(x+KOLUMNY-1)%KOLUMNY; break;
      case 'd': x=(x+1)%KOLUMNY; break;
      case 'w': y=(y+KOLUMNY-1)%KOLUMNY; break;
      case 's': y=(y+1)%KOLUMNY; break;
     }   
   return y*(KOLUMNY+1)+x;
  }
  
int main()
  {
   char Plansza[(WIERSZE+1)*(KOLUMNY+1)];
   int pos=0;
   setinputmode();
   fill(Plansza);
   for(;;)
     {
      resetpos();
      puts(Plansza);
      Plansza[pos]='x';
      pos=readinput(pos);
      Plansza[pos]='o';
     }
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1