Tetris - jak napisac?

0

Witajcie

Musze do szkoly napisac gre tetris w c++ pod konsole korzystajac z pliku console.h i nie bardzo wiem jak sie zabrac. Poszukalem kody w necie ale zadne nie spelniaja wymogow - te ktore sa pod console.h nie sa napisane z wykorzystaniem klas. Czy ma ktos kod takiej gry z w.w. wymaganiami?[???]
Wiele godzin szukalem - podejrzewam ze w tym czasie ktos sprawny bylby w stanie napisac sama gre ;)

Czy trudno bedzie przerobic ponizszy kod na wykorzystywanie w console.h i klas ? Why tak czesto goto jest wykorzystywane? Po co jest wstawka asemblerowa ? :| Ja moge miec najprostsza wersje bez hightstores itd.

#include<conio.h>

#define AR 72
#define AB 80
#define IZ 75
#define DE 77
#define ESP 32
#define ESC 27
#define ENTER 13

struct {int tx,ty,fig,gi;} pieza;
char figura[7][4][64],temp[64],dib[7][64];
int op,i,j,c=0,vel=250,ret=1,y=1,pun,lin,sig,niv;
unsigned int seed;

void retardo(unsigned int segundos) {
	asm {
		mov AX, segundos
		mov BX, 1000
		mul BX
		mov CX, DX
		mov DX, AX
		mov AH, 0x86
		int 0x15
	};
}
void dibuja(void) {
	textbackground(BLACK);
	clrscr();
	textcolor(LIGHTBLUE);
	gotoxy(1,1);cputs("                ŰŰŰŰ      ŰŰŰŰ  ");
	gotoxy(1,2);cputs("            ŰŰ    ŰŰŰŰ    ŰŰ    ");
	gotoxy(1,3);cputs("                ŰŰŰŰ      ŰŰŰŰ  ");
	gotoxy(1,4);cputs("            ŰŰ    ŰŰŰŰ    ŰŰ    ");
	textcolor(LIGHTGREEN);
	gotoxy(1,5);cputs("                  ŰŰŰŰ  ŰŰŰŰ    ");
	gotoxy(1,6);cputs("        ŰŰ      ŰŰŰŰ      ŰŰ    ");
	gotoxy(1,7);cputs("                  ŰŰŰŰ  ŰŰŰŰ    ");
	gotoxy(1,8);cputs("        ŰŰ      ŰŰŰŰ      ŰŰ    ");
	textcolor(YELLOW);
	gotoxy(1,9);cputs("                ŰŰŰŰŰŰ  ŰŰ      ");
	gotoxy(1,10);cputs("        ŰŰŰŰ      ŰŰ      ŰŰ    ");
	gotoxy(1,11);cputs("            ŰŰ  ŰŰŰŰŰŰ          ");
	gotoxy(1,12);cputs("          ŰŰ      ŰŰ      ŰŰŰŰ  ");
	textcolor(LIGHTMAGENTA);
	gotoxy(1,13);cputs("                ŰŰŰŰŰŰ      ŰŰ  ");
	gotoxy(1,14);cputs("          ŰŰ      ŰŰ    ŰŰŰŰ    ");
	gotoxy(1,15);cputs("        ŰŰ      ŰŰŰŰŰŰ          ");
	gotoxy(1,16);cputs("          ŰŰŰŰ    ŰŰ      ŰŰ    ");
	textcolor(CYAN);
	gotoxy(1,17);cputs("                ŰŰŰŰ    ŰŰŰŰ    ");
	gotoxy(1,18);cputs("                ŰŰŰŰ    ŰŰŰŰ    ");
	gotoxy(1,19);cputs("                ŰŰŰŰ    ŰŰŰŰ    ");
	gotoxy(1,20);cputs("                ŰŰŰŰ    ŰŰŰŰ    ");
	textcolor(BROWN);
	gotoxy(1,21);cputs("                ŰŰŰŰŰŰ    ŰŰ    ");
	gotoxy(1,22);cputs("          ŰŰ    ŰŰŰŰ      ŰŰ    ");
	gotoxy(1,23);cputs("          ŰŰ    ŰŰŰŰŰŰ          ");
	gotoxy(1,24);cputs("          ŰŰ      ŰŰŰŰ    ŰŰ    ");
	for (i=0;i<=5;i++)
		for (j=0;j<=3;j++) {
			c++;
			gettext(1,c,32,c, figura[i][j]);
		};
	textcolor(RED);
	gotoxy(34,5);cputs("  ŰŰ      ŰŰ      ŰŰ      ŰŰ    ");
	gotoxy(34,6);cputs("                ŰŰŰŰŰŰŰŰ        ");
	gotoxy(34,7);cputs("  ŰŰ      ŰŰ      ŰŰ      ŰŰ    ");
	gotoxy(34,8);cputs("                ŰŰŰŰŰŰŰŰ        ");
	for (j=0;j<4;j++) gettext(34,j+5,65,j+5,figura[6][j]);
	textcolor(LIGHTBLUE);
	gotoxy(34,9); cputs("         ŰŰŰŰ      ŰŰŰŰ         ");
	textcolor(LIGHTGREEN);
	gotoxy(34,10);cputs("           ŰŰŰŰ  ŰŰŰŰ           ");
	textcolor(YELLOW);
	gotoxy(34,11);cputs("         ŰŰŰŰŰŰ  ŰŰ             ");
	textcolor(LIGHTMAGENTA);
	gotoxy(34,12);cputs("         ŰŰŰŰŰŰ      ŰŰ         ");
	textcolor(CYAN);
	gotoxy(34,13);cputs("          ŰŰŰŰ    ŰŰŰŰ          ");
	textcolor(BROWN);
	gotoxy(34,14); cputs("         ŰŰŰŰŰŰ    ŰŰ           ");
	textcolor(RED);
	gotoxy(34,15); cputs("   ŰŰ      ŰŰ      ŰŰ      ŰŰ   ");
	for (j=0;j<7;j++) gettext(34,j+9,65,j+9,dib[j]);

	clrscr();
	outport(0x60,0xf3);
	retardo(200);
	outport(0x60,0);
}
void test(void){
	for (int i=0;i<=6;i++)
		for (int j=0;j<=3;j++) {
			puttext(1,1,8,4,figura[i][j]);
			getch();
		};
}
void ventana(int ix, int iy, int fx, int fy, int c) {
	textcolor(c);
	for (int i=iy+1;i<fy;i++) {
		gotoxy(ix,i);putch('ł');
		gotoxy(fx,i);putch('ł');
	};
	for (i=ix+1;i<fx;i++) {
		gotoxy(i,fy);putch('Ä');
	};
	gotoxy(ix,iy);cputs("ÚÄÄÄÄÄ");
	gotoxy(fx-5,iy);cputs("ÄÄÄÄÄż");
	gotoxy(ix,fy);putch('Ŕ');
	gotoxy(fx,fy);putch('Ů');
}
int aleat(void){
unsigned int a;
	a=seed;
	a*=36421;
	a++;
	seed=a;
	return(a&0x7fff);
};
int pon(int ix, int iy, int fg, int po) {
int bool=1;
char temp2[64];

	gettext(pieza.tx,pieza.ty,pieza.tx+7,pieza.ty+3,temp);
	gettext(pieza.tx,pieza.ty,pieza.tx+7,pieza.ty+3,temp2);
	for (c=0;c<=63;c+=2) if ((temp[c]==figura[pieza.fig][pieza.gi][c])) temp[c]=' ';
	puttext(pieza.tx,pieza.ty,pieza.tx+7,pieza.ty+3,temp);
	gettext(ix,iy,ix+7,iy+3,temp);
	if ((pieza.tx==ix)&&(pieza.ty==iy)) {
		for	(c=0;c<=63;c+=2)
		if ((temp[c]!=' ')&&((figura[pieza.fig][po][c]!=' ')||(figura[fg][pieza.gi][c]!=' '))) bool=0;
	}
	else
		for	(c=0;c<=63;c+=2) if ((temp[c]!=' ')&&(figura[pieza.fig][pieza.gi][c]!=' ')) bool=0;
	if (bool) {
		for (c=0;c<=63;c+=2)
			if (figura[fg][po][c]=='Ű') {
				temp[c]=figura[fg][po][c];
				temp[c+1]=figura[fg][po][c+1];
			};
		if ((ix==34)&&(iy==y)&&(ret==0)) puttext(pieza.tx,pieza.ty,pieza.tx+7,pieza.ty+3,temp2);
		if ((iy<=1)&&(pieza.ty<=1)) return(2);
		puttext(ix,iy,ix+7,iy+3,temp);
		pieza.tx=ix;
		pieza.ty=iy;
		pieza.fig=fg;
		pieza.gi=po;
		return(0);
	}
	else {
		puttext(pieza.tx,pieza.ty,pieza.tx+7,pieza.ty+3,temp2);
		return(1);
	};
}
int delay(){
	if (ret==0) ret=vel;
	for (ret;ret!=0;ret--){
		retardo(1);
		if (kbhit())
		return(1);
	};
	return(0);
}

void linea(void) {
char temp3[40];
int bool2,pun2=50;

	for (i=2;i<=22;i++) {
		bool2=1;
		gettext(28,i,47,i,temp3);
		for (c=0;c<=38;c+=2)
			if (temp3[c]==' ') bool2=0;
		if (bool2) {
			for (j=i;j>3;j--) {
				gettext(28,j-1,47,j-1,temp3);
				puttext(28,j,47,j,temp3);
				retardo(20);
			};
			lin++;
			pun2*=2;
			pun+=pun2;
			if (!(lin%10)) {niv++;vel-=10;};
			gotoxy(60,11);cprintf("%.6d",pun);
			gotoxy(61,15);cprintf("%.4d",lin);
			gotoxy(62,19);cprintf("%.2d",niv);
		};
	};
}

int main(void) {
	directvideo=1;
do {
	dibuja();
	vel=250;y=ret=1;lin=sig=niv=pun=0;
	ventana(27,2,48,23,LIGHTBLUE);
	ventana(58,10,67,12,LIGHTGRAY);
	gotoxy(60,11);cprintf("%.6d",pun);
	gotoxy(60,10);cputs("PUNTOS");
	ventana(58,14,67,16,LIGHTGRAY);
	gotoxy(61,15);cprintf("%.4d",lin);
	gotoxy(60,14);cputs("LINEAS");
	ventana(58,18,67,20,LIGHTGRAY);
	gotoxy(62,19);cprintf("%.2d",lin);
	gotoxy(60,18);cputs("NIVEL");
	gotoxy(2,2);cputs("Jos? Fco. Montelongo");
	gotoxy(2,3);cputs("I.E.C. VII  Junio 2001 ");
	pieza.tx=34;
	pieza.ty=y;
	pieza.fig=aleat()%7;
	pieza.gi=0;
	pon(34,y,pieza.fig,0);
	sig=aleat()%7;
	ventana(58,3,67,8,LIGHTGRAY);
	puttext(59,4,66,7,dib[sig]);
	do {
		if (kbhit()) {
			switch(op=getch()) {
				case  AR:pon(pieza.tx,pieza.ty,pieza.fig,(pieza.gi==0)?3:pieza.gi-1);break;
				case  AB:if (!pon(pieza.tx,pieza.ty+1,pieza.fig,pieza.gi))ret=vel;break;
				case  IZ:pon(pieza.tx-2,pieza.ty,pieza.fig,pieza.gi);break;
				case  DE:pon(pieza.tx+2,pieza.ty,pieza.fig,pieza.gi);break;
				case '0':pon(pieza.tx,pieza.ty,pieza.fig,(pieza.gi+1)%4);break;
			};
		};
		if (!delay())
			if (pon(pieza.tx,pieza.ty+1,pieza.fig,pieza.gi)) {
				linea();
				if (pon(34,y,sig,0)==2) break;
				sig=aleat()%7;
				puttext(59,4,66,7,dib[sig]);
				ret=1;
			};
	}while(op!=ESC);
	gotoxy(59,22);cputs("GAME OVER");
	gotoxy(51,24);cputs("ESC->SALIR | ENTER->NUEVO");
	op=0;
	while ((op!=ESC)&&(op!=ENTER)) op=getch();
}while (op!=ESC);
return(0);
}

Pozdrawiam

0

a ty do tej szkoly chodziles? bo twoje pytania brzmia tak jakbys w ogóle nie wiedzial co jest grane

0
mlodyno napisał(a)

Why tak czesto goto jest wykorzystywane?
To nie goto ale gotoxy! Przeniesienie kursora przed wypisaniem tekstu.

mlodyno napisał(a)

Po co jest wstawka asemblerowa ? :|
To opóźnienie, tu masz info: http://www.ctyme.com/intr/rb-1525.htm

0

dziekuje Tobie za odpowiedz! cos czuje ze kod mi nic nie da i bede musial sie zmierzyc z napisaniem samemu... ale marnie to widze, oj marnie :(

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