Just nu i M3-nätverket
Gå till innehåll

C++, ruta[y][x] = "0" Problem


Jimmie Pettersson

Rekommendera Poster

Jimmie Pettersson

Jag håller på med en programmeringsuppgift i programmering B(c++) och jag har stött på lite problem.

 

 

#include <iostream.h>


void main(void)
{
 int x=0, y=0, xg=0, yg=0, steg=0;
 char * ruta[8][8] = { {" "," "," "," "," "," "," "," "} , {" "," "," "," "," "," "," "," "} , {" "," "," "," "," "," "," "," "} , {" "," "," "," "," "," "," "," "} , {" "," "," "," "," "," "," "," "} , {" "," "," "," "," "," "," "," "} , {" "," "," "," "," "," "," "," "} , {" "," "," "," "," "," "," "," "} };


 //Själva programmet
 while(steg<7)
  {

  //Nollställer variabeln ruta så att alla innehåller tre mellanslag
  for(int a=0,b=0;a<=64;a=a+1)
	{
	 if(a%8==0 && a!=0)
	  {
		b=b+1;
	  }
	 ruta[b][a-8*b] = " ";
	}


  //ställer in vilken ruta spelaren står på
  ruta[y][x] = "S";


  //skriver ut information om hur spelaren ska gå till väga
  cout << "   S är rutan du står på och 0 är rutor du kan gå till." << endl;
  cout << "   X är i horisontalled och Y är i vertikalled." << endl << endl;


  //Kontroll om steg är giltigt och insättning i ruta
  if((x+1)<=7 && (y-2)>=0)
	ruta[y-2][x+1] = "0";

  if((x+1)<=7 && (y+2)<=7)
	ruta[y+2][x+1] = "0";

  if((x+2)<=7 && (y+1)<=7)
	ruta[y+1][x+2] = "0";

  if((x+2)<=7 && (y-1)>=0)
	ruta[y-1][x+2] = "0";

  if((x-1)>=0 && (y+2)<=7)
	ruta[y+2][x-1] = "0";

  if((x-1)>=0 && (y-2)>=0)
	ruta[y-2][x-1] = "0";

  if((x-2)>=0 && (y+1)<=7)
	ruta[y+1][x-2] = "0";

  if((x-2)>=0 && (y-1)>=0)
	ruta[y-1][x-2] = "0";


  //Skriver föregående position till ruta
  if(steg != 0)
	ruta[yg][xg] = "F";


  //Utskrivt av spelplan och positioner
  cout << "     0    1   2   3   4   5   6   7  " << endl;
  cout << "    ---------------------------------" << endl;
  for(int i=0;i<=7;i=i+1)
	{
	cout << "    |" << " " << ruta[i][0] << " " << "|" << " " << ruta[i][1] << " " << "|" << " " << ruta[i][2] << " " << "|" <<" " <<  ruta[i][3] << " " << "|" << " " <<  ruta[i][4] << " " << "|" << " " <<  ruta[i][5] << " " << "|" << " " << ruta[i][6] << " " << "|" << " " << ruta[i][7] << " " << "| " << i << endl;
	cout << "    ---------------------------------" << endl;
	}


  //Sparar gammal position:
  xg = x;
  yg = y;


  //Förfrågan efter förflyttning
  cout << "   Ange ny punkt. X-led(bredd) mellanslag Y-led(höjd): ";
  cin >> x >> y;


  while((int)ruta[y][x]<610 || (int)ruta[y][x]>620)
	{
	cout << (int)ruta[y][x];
	cout << "   Förflyttning ej tillåten. Prova igen: ";
	cin >> x >> y;
	}


  //Ökar på steg med ett.
  steg = steg + 1;


  //Börjar om från början så länge steg är mindre än sju
 }


 cout << endl << endl << "   Du har nu gått 10 steg på svarta rutor och 21 steg totalt. Programmet avslutas!";


}

 

Det jag behöver kolla är om ruta[y][x] innehåller en nolla. Just nu gör jag en (int) men det verkar bli olika värden hela tiden på en nolla. Har provat en massa olika sätt men det blir fel hela tiden. Några tips?

 

Jag skulle också behöva veta vilket bibliotek och hur anropet ser ut för att göra en clear screen. Jag kommer inte riktigt ihåg hur man gör. Jag har hållt på med för mycket asp på sista tiden.

 

MVH Jimmie Pettersson

Länk till kommentar
Dela på andra webbplatser

Det finns inget standardbibliotek för att göra en clear screen av utskriftsfönstret, utan det beror på vilken utvecklingsmiljö du använder samt vilket operativsystem?

 

-

 

Det ser ut som du blandat ihop integervärden för en char med själva tecknet.

 

char rutan = '0'; //lagrar tecknet 0 i rutan

 

char rutan = 0; // lagrar asciivärdet 0 i rutan - förmodligen inte vad du vill

 

cout << (int)rutan; // skriver ut asciivärdet (normalt) för det tecken som är lagrat i rutan - förmodligen inte heller vad du vill

 

cout << rutan; // skriver ut tecknet som lagrats i rutan

 

if (rutan == '0'); // kollar om rutan innehåller tecknet 0

 

if (rutan == 0); // kollar om rutans asciivärde är 0, förmodligen inte vad du vill göra

 

while((int)ruta[y][x]<610 || (int)ruta[y][x]>620)

Den här förstår jag inte alls - vad är det du vill kolla? Om värdet i ruta är mindre än 610 eller större än 620? Ruta är juh en char å det du jämför är asciivärden, å dessa slutar juh vid 255 som är högsta talet som går att lagra i en char (som är 8 bitar stor, oftast - visst, vi kan prata unicode iofs ;)

 

-

 

Tycker du ska använda fler nästlade for-loopar btw, utskrift av spelplan samt initiering av ruta-matrisen verkar lite oöverskådlig - pröva istället:

 

for(int i = 0; i < 8; i++) {

for(int j = 0; j < 8; j++) {

do something with ruta[j];

} }

 

Åså initierar du matrisen ruta två gånger, dels vid deklarationen och sedan vid funktionen som nollställer rutan. Det räcker med en gång, föreslår att du stryker initieringen vid deklarationen, eftersom den tar så'n himla plats och ser läskig ut:

char * ruta[8][8];)

 

--

.Wey

 

..I’m the king of all time, nothing is impossible in my all powerful mind.

[inlägget ändrat 2002-12-01 17:31:56 av Weyland]

Länk till kommentar
Dela på andra webbplatser

Jimmie Pettersson

Jag sitter för övrigt på Borland C++ 4.52 från 91 =) tror jag och i en windows 98 miljö.

 

Tacksam för bådas hjälp. Ni har fått en poäng var. Tack!

 

Jag var visst lite trött =)

 

Ska fixa till koden. Jag är också väldigt tacksam för de snabba svaren.

 

MVH Jimmie Pettersson

[inlägget ändrat 2002-12-01 18:13:10 av Jimmie Pettersson]

Länk till kommentar
Dela på andra webbplatser

Ok, i borland lär du kunna köra in conio.h å få tillgång till clrscr();

vad jag minns.

 

--

.Wey

 

..I’m the king of all time, nothing is impossible in my all powerful mind.

 

Länk till kommentar
Dela på andra webbplatser

Jimmie Pettersson

Så här ser det ut efter förbättringarna.

 

#include <iostream.h>


void main(void)
{
int x=0, y=0, xg=0, yg=0, steg=0;
char ruta[8][8];


//Själva programmet
while(steg<7)
 {

 //Nollställer variabeln ruta så att alla innehåller tre mellanslag
 for(int a=0;a<8;a++)
{
 for(int b=0;b<8;b++)
 {
 ruta[a][b] = ' ';
 }
}


 //skriver ut information om hur spelaren ska gå till väga
 cout << "   S är rutan du står på och 0 är rutor du kan gå till." << endl;
 cout << "   X är i horisontalled och Y är i vertikalled." << endl << endl;


 //Kontroll om steg är giltigt och insättning i ruta
 if((x+1)<=7 && (y-2)>=0)
ruta[y-2][x+1] = '0';

 if((x+1)<=7 && (y+2)<=7)
ruta[y+2][x+1] = '0';

 if((x+2)<=7 && (y+1)<=7)
ruta[y+1][x+2] = '0';

 if((x+2)<=7 && (y-1)>=0)
ruta[y-1][x+2] = '0';

 if((x-1)>=0 && (y+2)<=7)
ruta[y+2][x-1] = '0';

 if((x-1)>=0 && (y-2)>=0)
ruta[y-2][x-1] = '0';

 if((x-2)>=0 && (y+1)<=7)
ruta[y+1][x-2] = '0';

 if((x-2)>=0 && (y-1)>=0)
ruta[y-1][x-2] = '0';


 //Ställer föregående ruta
 ruta[yg][xg] = 'F';


 //ställer in vilken ruta spelaren står på
 ruta[y][x] = 'S';


 //Utskrift av spelplan och positioner
 cout << "     0    1   2   3   4   5   6   7  " << endl;
 cout << "    ---------------------------------" << endl;

 for(int i=0;i<8;i++)
{
cout << "    |";
for(int c=0;c<8;c++)
 {
 cout << " " << ruta[i][c] << " " << "|";
 }
cout << i << endl;
cout << "    ---------------------------------" << endl;
}


 //Sparar gammal position:
 xg = x;
 yg = y;


 //Förfrågan efter förflyttning
 cout << "   Ange ny punkt. X-led(bredd) mellanslag Y-led(höjd): ";
 cin >> x >> y;


 while(ruta[y][x]!='0')
{
cout << "   Förflyttning ej tillåten. Prova igen: ";
cin >> x >> y;
}


 //Ökar på steg med ett.
 steg = steg + 1;


 //Börjar om från början så länge steg är mindre än sju
}


cout << endl << endl << "   Du har gått 10 steg på svarta rutor och 21 steg totalt. Programmet avslutas!";


}

 

Tack för all hjälp.

 

MVH Jimmie Pettersson

 

Länk till kommentar
Dela på andra webbplatser

Jimmie Pettersson

Japp det funkade perfekt. Det var precis det jag letade efter!

 

Tack igen.

 

MVH Jimmie Pettersson

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...