utrata danych w tablicy

0

Witam, chcialem napisac gre Kolko i Krzyzyk. Wszytko ladnie mi szlo do momentu w ktorym tablica w ktorej mam przechowywane wspolrzedne poszczegolnych pol COORD pola[8], traci to co jest w niej zapisane. pojawiaja sie tam jakies krzaczki itp... Oto kod zrodlowy.

//main.cpp

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#include "main.h"
#include "gameplay.h"
#include "gvar.h"
#include "gui.h"



HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

     TGui gui;
TGameplay gameplay;
     gvar Igvar;

char title[100]={'K','o','l','k','o',' ','i',' ','K','r','z','y','z','y','k',' ','v','0','.','0','.','2'};


int main()
{
COORD buff2;
buff2.X=1;
buff2.Y=41;

gui.DrawMainFrame(GREEN);
gui.WindowResolution(0,0,40,60);
gui.DrawTitle(2,2,GREEN);

gameplay.ClearAllGameFields('.');
gameplay.SetPositionTable();

gameplay.DrawStaticGameText();

gameplay.DrawPlayground('+');

gameplay.DrawBlack(Igvar.pole[0],'#');
gameplay.DrawBlack(Igvar.pole[1],'#');
gameplay.DrawBlack(Igvar.pole[2],'#');
gameplay.DrawBlack(Igvar.pole[3],'#');
gameplay.DrawBlack(Igvar.pole[4],'#');
gameplay.DrawBlack(Igvar.pole[5],'#');
gameplay.DrawBlack(Igvar.pole[6],'#');
gameplay.DrawBlack(Igvar.pole[7],'#');
gameplay.DrawBlack(Igvar.pole[8],'#');

gameplay.DrawNumbers();

gameplay.DrawO(Igvar.pole[0],' ');
gameplay.DrawO(Igvar.pole[1],' ');
gameplay.DrawO(Igvar.pole[2],' ');
gameplay.DrawO(Igvar.pole[3],' ');
gameplay.DrawX(Igvar.pole[4],' ');
gameplay.DrawX(Igvar.pole[5],' ');
gameplay.DrawX(Igvar.pole[6],' ');
gameplay.DrawX(Igvar.pole[7],' ');
gameplay.DrawX(Igvar.pole[8],' ');

//Igvar.SetPlayerInformation();
//gameplay.DrawPlayerInformation();

gameplay.DrawBlackAll('-');       //


getch();
SetConsoleCursorPosition(hConsole,buff2);
return 0;
}

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

//CLASS TGameplay
void TGameplay::ClearAllGameFields(char symbol)
{
unsigned int i,i2;
COORD buff;

	SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE | BACKGROUND_INTENSITY);

	buff.X=1;
	buff.Y=5;
	SetConsoleCursorPosition(hConsole,buff);

	for(i=0;i<=34;i++)
	{
	buff.X=1;
	buff.Y=5+i;
	SetConsoleCursorPosition(hConsole,buff);

		for(i2=0;i2<=37;i2++)
		{
		printf("%c",symbol);
		}
	}
}


void TGameplay::DrawBlack(COORD pos, char symbol)
{
COORD buff;
unsigned int i,i2;

	SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE | BACKGROUND_INTENSITY);

	//SetConsoleCursorPosition(gvar::hConsole,buff);

	for(i=0;i<10;i++)
	{
	buff.X=pos.X+i;
	buff.Y=pos.Y+i2;
	SetConsoleCursorPosition(hConsole,buff);

		for(i2=0;i2<10;i2++)
		{
		buff.Y=pos.Y+i2-1;
		buff.X=pos.X+i-1;
		SetConsoleCursorPosition(hConsole,buff);

		printf("%c",symbol);
		}
	}
}


void TGameplay::SetPositionTable()
{
Igvar.pole[0].X=4;
Igvar.pole[0].Y=7;//0

Igvar.pole[1].X=15;
Igvar.pole[1].Y=7;//1

Igvar.pole[2].X=26;
Igvar.pole[2].Y=7;//2

Igvar.pole[3].X=4;
Igvar.pole[3].Y=18;//3

Igvar.pole[4].X=15;
Igvar.pole[4].Y=18;//4

Igvar.pole[5].X=26;
Igvar.pole[5].Y=18;//5

Igvar.pole[6].X=4;
Igvar.pole[6].Y=29;//6

Igvar.pole[7].X=15;
Igvar.pole[7].Y=29;//7

Igvar.pole[8].X=26;
Igvar.pole[8].Y=29;//8
}

void TGameplay::DrawPlayground(char symbol)
{
COORD buff;
unsigned int i;

	buff.X=2;
	buff.Y=16;

	SetConsoleTextAttribute(hConsole,BACKGROUND_INTENSITY);
	SetConsoleCursorPosition(hConsole,buff);

	//pozioma 1
	for(i=0;i<34;i++)
	{
	printf("%c",symbol);
	}

	//pozioma 2
	buff.X=2;
	buff.Y=27;
	SetConsoleCursorPosition(hConsole,buff);
	for(i=0;i<34;i++)
	{
	printf("%c",symbol);
	}

	//pionowa 1
	buff.X=13;
	buff.Y=17;
	for(i=0;i<32;i++)
	{
	buff.Y=6+i;
	SetConsoleCursorPosition(hConsole,buff);
	printf("%c",symbol);
	}

	//pionowa 2
	buff.X=24;
	buff.Y=17;
	for(i=0;i<32;i++)
	{
	buff.Y=6+i;
	SetConsoleCursorPosition(hConsole,buff);
	printf("%c",symbol);
	}
}


void TGameplay::DrawNumbers()
{
unsigned int i;
COORD buff;

	for(i=0;i<=8;i++)
	{
	buff=Igvar.pole[i];

	buff.X=buff.X+4;
	buff.Y=buff.Y+4;

	SetConsoleCursorPosition(hConsole,buff);
	SetConsoleTextAttribute(hConsole, WHITE | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
	printf("%d",i);
	}

}


void TGameplay::DrawX(COORD pos, char symbol)
{
COORD buff;
unsigned int i;

	DrawBlack(pos,symbol);

	buff.X=pos.X;
	buff.Y=pos.Y;

	SetConsoleTextAttribute(hConsole,BACKGROUND_GREEN | BACKGROUND_INTENSITY);

	for(i=0;i<8;i++)
	{
	buff.X=pos.X+i;
	buff.Y=pos.Y+i;
	SetConsoleCursorPosition(hConsole,buff);
	printf("%c",symbol);
	}

	for(i=0;i<8;i++)
	{
	buff.X=pos.X+7-i;
	buff.Y=i+pos.Y;
	SetConsoleCursorPosition(hConsole,buff);
	printf("%c",symbol);
	}
}

void TGameplay::DrawO(COORD pos, char symbol)
{
COORD buff;
unsigned int i;

	DrawBlack(pos,symbol);

	buff.X=pos.X+1;
	buff.Y=pos.Y;

	SetConsoleTextAttribute(hConsole,BACKGROUND_RED | BACKGROUND_INTENSITY);


	//Poziome
	SetConsoleCursorPosition(hConsole,buff);
	for(i=0;i<6;i++)
	{
	printf(" ");
	}

	buff.X=pos.X+1;
	buff.Y=pos.Y+7;
	SetConsoleCursorPosition(hConsole,buff);
	for(i=0;i<6;i++)
	{
	printf(" ");
	}
	//EOPoziome

	//Pionowe
	buff.X=pos.X;
	buff.Y=pos.Y+2;
	SetConsoleCursorPosition(hConsole,buff);
	for(i=0;i<6;i++)
	{
	buff.Y=pos.Y+i+1;
	SetConsoleCursorPosition(hConsole,buff);
	printf(" ");
	}


	buff.X=pos.X+7;
	buff.Y=pos.Y+2;
	SetConsoleCursorPosition(hConsole,buff);
	for(i=0;i<6;i++)
	{
	buff.Y=pos.Y+i+1;
	SetConsoleCursorPosition(hConsole,buff);
	printf(" ");
	}
	//EOPionowe
}


void TGameplay::DrawStaticGameText()
{
COORD buff;

//Gracz 1
	buff.X=40;
	buff.Y=6;

	SetConsoleTextAttribute(hConsole, WHITE);
	SetConsoleCursorPosition(hConsole,buff);
	printf("Gracz 1:");

	buff.X=40;
	buff.Y=10;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Symbol gracza:");

	buff.X=40;
	buff.Y=14;
	SetConsoleCursorPosition(hConsole,buff);
	printf("  Wygranych rund:");

	buff.X=40;
	buff.Y=16;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Przegranych rund:");
//EOGracz 1



//Gracz 2
	buff.X=40;
	buff.Y=24;
	SetConsoleTextAttribute(hConsole, WHITE);
	SetConsoleCursorPosition(hConsole,buff);
	printf("Gracz 2:");

	buff.X=40;
	buff.Y=28;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Symbol gracza:");

	buff.X=40;
	buff.Y=32;
	SetConsoleCursorPosition(hConsole,buff);
	printf("  Wygranych rund:");

	buff.X=40;
	buff.Y=34;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Przegranych rund:");
//EOGracz 2
}


void TGameplay::DrawBlackAll(char symbol)
{
	SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE | BACKGROUND_INTENSITY);

	DrawBlack(Igvar.pole[0],symbol);
	DrawBlack(Igvar.pole[1],symbol);
	DrawBlack(Igvar.pole[2],symbol);

	DrawBlack(Igvar.pole[3],symbol);
	DrawBlack(Igvar.pole[4],symbol);
	DrawBlack(Igvar.pole[5],symbol);

	DrawBlack(Igvar.pole[6],symbol);
	DrawBlack(Igvar.pole[7],symbol);
	DrawBlack(Igvar.pole[8],symbol);
}




void TGameplay::DrawPlayerInformation()
{
//Gracz 1
	SetConsoleTextAttribute(hConsole, WHITE);
	buff.X=40;
	buff.Y=6;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Gracz 1:");

	buff.X=41;
	buff.Y=8;
	SetConsoleCursorPosition(hConsole,buff);
	SetConsoleTextAttribute(hConsole, LIGHTGREEN);
	printf("%s",Igvar.player[0].name);

	SetConsoleTextAttribute(hConsole, WHITE);
	buff.X=40;
	buff.Y=10;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Symbol gracza: %c",Igvar.player[0].symbol);

	buff.X=40;
	buff.Y=14;
	SetConsoleCursorPosition(hConsole,buff);
	printf("  Wygranych rund: %d",Igvar.player[0].win);

	buff.X=40;
	buff.Y=16;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Przegranych rund: %d",Igvar.player[0].lose);
//EOGracz 1

//Gracz 2
	buff.X=40;
	buff.Y=24;
	SetConsoleTextAttribute(hConsole, WHITE);
	SetConsoleCursorPosition(hConsole,buff);
	printf("Gracz 2:");

	buff.X=41;
	buff.Y=26;
	SetConsoleCursorPosition(hConsole,buff);
	SetConsoleTextAttribute(hConsole, LIGHTGREEN);
	printf("%s",Igvar.player[1].name);

	SetConsoleTextAttribute(hConsole, WHITE);
	buff.X=40;
	buff.Y=28;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Symbol gracza: %c",Igvar.player[1].symbol);

	buff.X=40;
	buff.Y=32;
	SetConsoleCursorPosition(hConsole,buff);
	printf("   Wygranych rund: %d",Igvar.player[1].win);

	buff.X=40;
	buff.Y=34;
	SetConsoleCursorPosition(hConsole,buff);
	printf("Przegranych rund: %d",Igvar.player[1].lose);
//EOGracz 2
}
//EOTGameplay



//-----------------
//-------gvar
//------------------
void gvar::SetPlayerInformation()
{
	player[0].lose=0;
	player[0].win=0;
	player[0].symbol='X';
	strcpy(player[0].name,"Gracz");


	player[1].lose=0;
	player[1].win=0;
	player[1].symbol='O';
	strcpy(player[1].name,"Komputer");
}
//---------------
//----eogvar
//----------------


//---------------
//----gui
//-------------
void TGui::WindowResolution(unsigned int top, unsigned int left, unsigned int bottom, unsigned int right)
{
	SMALL_RECT buff;

	buff.Top=top;
	buff.Left=left;
	buff.Bottom=bottom;
	buff.Right=right;

	SetConsoleWindowInfo(hConsole,TRUE,&buff);
};

void TGui::DrawMainFrame(unsigned int color)
{
SetConsoleTextAttribute(hConsole,BACKGROUND_BLUE | BACKGROUND_INTENSITY);

DrawBox(0,0,60,40,' ');

SetConsoleTextAttribute(hConsole, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

DrawBox(0,0,1,41,' '); // |
DrawBox(60,0,1,41,' ');// |
DrawBox(1,0,60,1,' '); // --
DrawBox(0,41,61,1,' ');// --

DrawBox(1,4,59,1,' '); // --
DrawBox(39,4,1,38,' ');// --

DrawBox(40,22,20,1,' ');//--
DrawBox(40,40,20,1,' ');//--
}

void TGui::DrawBox(unsigned int x, unsigned int y, unsigned int width, unsigned int height,char symbol)
{
COORD buff;
unsigned int i,i2;

	buff.X=x;
	buff.Y=y;

	SetConsoleCursorPosition(hConsole,buff);

	for(i=0;i<height;i++)
	{
	buff.Y=y+i;
	SetConsoleCursorPosition(hConsole,buff);

		for(i2=0;i2<width;i2++)
		{
		printf("%c",symbol);
		}
	}

}
void TGui::DrawTitle(unsigned int x, unsigned int y, unsigned int color)
{
COORD buff;

	buff.X=x;
	buff.Y=y;

	SetConsoleCursorPosition(hConsole,buff);

	SetConsoleTextAttribute(hConsole, color | BACKGROUND_BLUE | BACKGROUND_INTENSITY | FOREGROUND_INTENSITY);
	printf("%s",title);

}
//------------gui
//---------------
//----------------

//end main.cpp

//main.h

#ifndef MAIN_H
#define MAIN_H

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define FAST_GAME 1
#define TOURNAMENT 2
#define GREEN 2
#define LIGHTGREEN 10
#define LIGHTCYAN 11
#define LIGHTRED 12
#define LIGHTGREEN 10
#define WHITE 15
#define BLACK 0
#define FAST_GAME 1
#define TOURNAMENT 2
#define YELLOW 14

#endif

//end main.h

//gameplay.h

#ifndef GAMEPLAY_H
#define GAMEPLAY_H

//CLASS TGameplay
class TGameplay
{
public:
    COORD buff;
	void ClearAllGameFields(char symbol);
	void DrawBlack(COORD pos, char symbol);
	void DrawBlackAll(char symbol);
	void SetPositionTable();
	void DrawPlayground(char symbol);
	void DrawNumbers();
	void DrawX(COORD pos, char symbol);
	void DrawO(COORD pos, char symbol);
	void DrawStaticGameText();

	void DrawPlayerInformation();
	void SetPlayerInformation();

};
//EOCLASS TGameplay

#endif

//end gameplay.h

//gui.h

#ifndef GUI_H
#define GUI_H

//CLASS TGui
class TGui
{
public:
	void WindowResolution(unsigned int top, unsigned int left, unsigned int bottom, unsigned int right);
	void DrawBox(unsigned int x, unsigned int y, unsigned int width, unsigned int height, char symbol);
	void DrawTitle(unsigned int x, unsigned int y, unsigned int color);
	void DrawMainFrame(unsigned int color);
};
//EOCLASS TGui

#endif

//end gui.h

//gvar.h

#ifndef GVAR_H
#define GVAR_H

//CLASS gvar
class gvar
{
public:
	void SetPlayerInformation();

	struct SPlayer
		{
		unsigned int win;
		unsigned int lose;
		char name[20];
		char symbol;
		}player[1];

	COORD pole[8];

};
//EOCLASS gvar

#endif

//end gvar.h

W pliku main.cpp sa nastepujace linijki:

//Igvar.SetPlayerInformation();
//gameplay.DrawPlayerInformation();

gameplay.DrawBlackAll('-');

jak jest tak to procedura DrawBlackAll() dziala ok, ale jak te 2 wyzej sa uruchomione to DrawBlackAll ktora czysci pola od 0 do 8 wybranym znakiem na podstawie wspolrzednych z tablicy pola[8] typu COORD szaleje bo dane w tablicy pola[8] cos mi zmienia. Moze ktos mi powiedziec dlaczego tak sie dzieje? Odznaczcie sobie // i sprawdzcie. MEcze sie z tym juz 4 dzien i nie wiem dlaczego tak jest.

Przepraszam tez za nieczytelnosc kodu ale C++ ucze sie od 1 tygodnia...

0

Zmień

COORD pole[8];

na COORD pole[9];

0

nie to nic nie daje, musi byc coord pole[8] bo ja potrzebuje tylko 9 miejsc a od 0 do 8 mam 9,

0

Chcesz mieć 9, a deklarujesz 8.

0

To jak to w koncu jest, w kursach jest napisane ze elementy tablicy zaczynamy liczyc od 0, jak ja mam w tablicy pole[8]; czyli mam 9 elementow bo 0,1,2,3,4,5,6,7,8 ?

0

Nie. Przy deklaracji tablicy podajesz ilość elementów, a przy dostępie do konkretnych komórek podajesz indeks liczony od zera. Czyli jak masz pole[8] to poprawne indeksy są od 0 do 7.

0

Aaaaa juz wiem moj boze deklaracja COORD pole[9] bo potrzebuje 9 elementow ale zaczynamy je liczyc od 0 do 8, a ja mialem tez inna tablice player[1] i myslalem ze ona zawiera 2 elementy bo player[0], i player[1],i to jest drugi blad w moim proramie, juz wszystko dziala tak jak powinno, wielkie dzieki ze mnie naprowadziles, bo ja bylem przekonany ze tak jest... kurde to szkoda ze kompilator tu nie mowi o takich rzeczach ... ja siedzialem 4 dni i nie wiedzialem co jest, myslalem ze programy konsolowe maja jakies ograniczenia pamieci do uzycia czy cos takiego i dlatego mi nadpisuje. dzieki za tak oczywista rzecz ktora powinienem wiedziec po przeczytaniu kursu o tablicach

0

Igvar.pole[0].X=4;
Igvar.pole[0].Y=7;//0

Igvar.pole[1].X=15;
Igvar.pole[1].Y=7;//1

Igvar.pole[2].X=26;
Igvar.pole[2].Y=7;//2

Igvar.pole[3].X=4;
Igvar.pole[3].Y=18;//3

Igvar.pole[4].X=15;
Igvar.pole[4].Y=18;//4

Igvar.pole[5].X=26;
Igvar.pole[5].Y=18;//5

Igvar.pole[6].X=4;
Igvar.pole[6].Y=29;//6

Igvar.pole[7].X=15;
Igvar.pole[7].Y=29;//7

Igvar.pole[8].X=26;
Igvar.pole[8].Y=29;//8

//....
DrawBlack(Igvar.pole[0],symbol);
DrawBlack(Igvar.pole[1],symbol);
DrawBlack(Igvar.pole[2],symbol);

    DrawBlack(Igvar.pole[3],symbol);
    DrawBlack(Igvar.pole[4],symbol);
    DrawBlack(Igvar.pole[5],symbol);

    DrawBlack(Igvar.pole[6],symbol);
    DrawBlack(Igvar.pole[7],symbol);
    DrawBlack(Igvar.pole[8],symbol);

A o tablicach i pętlach słyszałeś ? One są po to aby ich używać. Powyższy kod możesz zamienić na:

const COORD coords[] = { {4, 7}, {15, 7}, {26, 7}, {4, 18}, {15, 18}, {26, 18}, {4, 29}, {15, 29}, {26, 29} };
for(int i = 0; i < 9; i++) Igvar.pole[i] = coords[i];

//...
   for(int i = 0; i < 9; i++) DrawBlack(Igvar.pole[i],symbol);

W ten sposób powinieneś ulepszyć cały program. Miejsca do poprawienia w ten sposób: main, SetPositionTable, DrawStaticGameText, DrawBlackAll, DrawPlayerInformation.

No i zamiast printf("%c",symbol) proponuje używać putc(symbol) - szybsze w napisaniu i działaniu.

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