Looking for tetris created on C, not c++.
Hello everyone, i'm looking for tetris sroucecode (better would be a tutorial), created with C language. Not C++. Just C. Because i'v took some courses on youtube for C and now i want to create some game. Thanks.
Look up the tetris stuff in my posting history (newest 2-3), to get some idea.
Or:
http://www.gamedev.net/columns/hardcore/tetris/default.asp
Or:
http://www.gamedev.net/columns/hardcore/tetris/default.asp
Google turned up these:
http://www.programmersheaven.com/download/16993/download.aspx
http://www.programmersheaven.com/download/1022/download.aspx
They look pretty old though.
[Edit]
This one looks a bit newer:
http://code.google.com/p/simple-tetris-clone/
http://www.programmersheaven.com/download/16993/download.aspx
http://www.programmersheaven.com/download/1022/download.aspx
They look pretty old though.
[Edit]
This one looks a bit newer:
http://code.google.com/p/simple-tetris-clone/
I'v tried that google one before. I like it how it's designed, that's why i wanted to get it up. It just doesn't compiles. I guess i need some external stuff or something.
Quote:Original post by frozen01
I've tried that Google one before. I like it how it's designed, that's why I wanted to get it up. It just doesn't compiles. I guess I need some external stuff or something.
Yes. You need SDL.
Here is my code. I made it in 5 hours, so no optimization, or fancy stuff. No game over.
It's C, but I think it has some invalid C syntax, but they can easily been replaced with valid code.
I posted, because I'm curious about feedback.
(I hope I don't violate a rule with this.)
It's C, but I think it has some invalid C syntax, but they can easily been replaced with valid code.
I posted, because I'm curious about feedback.
(I hope I don't violate a rule with this.)
#include <windows.h>#include <stdio.h>#include <GL/gl.h>#include "glut.h"#define SQUARE_SIZE 0.05#define X_OFFSET -0.5#define Y_OFFSET -0.7int Field[15][30]; //0 empty, 1 fixed, 2 current moving, 3 new positionint c_i, c_k;int LineCount = 0;void DrawSqare(float x, float y){ glBegin(GL_QUADS); glVertex2f(X_OFFSET+(x+0)*SQUARE_SIZE, Y_OFFSET+(y+0)*SQUARE_SIZE); glVertex2f(X_OFFSET+(x+0.9)*SQUARE_SIZE, Y_OFFSET+(y+0)*SQUARE_SIZE); glVertex2f(X_OFFSET+(x+0.9)*SQUARE_SIZE, Y_OFFSET+(y+0.9)*SQUARE_SIZE); glVertex2f(X_OFFSET+(x+0)*SQUARE_SIZE, Y_OFFSET+(y+0.9)*SQUARE_SIZE); glEnd();}bool MoveBrickDown(){ int i, k; for( i = 0; i < 15; i++ ) { k = 29; while( k >=0 && Field[k] != 2 ) k--; if( k == 29 || Field[k+1] == 1 ) return true; } c_k ++; for( i = 0; i < 15; i++ ) { k = 0; while( k < 30 && Field[k++] != 2 ); if( k == 30 ) continue; Field[k-1] = 0; while( Field[k++] == 2 ); Field[k-1] = 2; } return false;}void MoveBrickRight(){ int i, k; for( k = 0; k < 30; k++ ) { i = 14; while( i >= 0 && Field[k] != 2 ) i--; if( i != -1 && (i == 14 || Field[i+1][k] == 1) ) return; } c_i++; for( k = 0; k < 30; k++ ) { i = 0; while( i < 15 && Field[i++][k] != 2 ); if( i == 15 ) continue; Field[i-1][k] = 0; while( Field[i++][k] == 2 ); Field[i-1][k] = 2; }}void MoveBrickLeft(){ int i, k; for( k = 0; k < 30; k++ ) { i = 0; while( i <= 14 && Field[k] != 2 ) i++; if( i != 15 && (i == 0 || Field[i-1][k] == 1) ) return; } c_i--; for( k = 0; k < 30; k++ ) { i = 14; while( i > -1 && Field[i--][k] != 2 ); if( i == -1 ) continue; Field[i+1][k] = 0; while( Field[i--][k] == 2 ); Field[i+1][k] = 2; }}void RotateBrick(int direction){ int i, k; int di, dk; for( i = 0; i < 15; i++ ) { for( k = 0; k < 30; k++ ) { if( Field[k] == 2 || Field[k] == 4 ) { di = direction*(i - c_i); dk = direction*(k - c_k); if( c_i+dk < 0 || c_i+dk > 14 || c_k-di < 0 || c_k-di > 29 || Field[c_i+dk][c_k-di] == 1 ) return; } } } for( i = 0; i < 15; i++ ) { for( k = 0; k < 30; k++ ) { if( Field[k] & 2 ) { di = direction*(i - c_i); dk = direction*(k - c_k); Field[k] &= ~2; Field[c_i+dk][c_k-di] |= 4; } } } for( i = 0; i < 15; i++ ) { for( k = 0; k < 30; k++ ) { if( Field[k] == 4 ) Field[k] = 2; } }}void Display(void);void DestroyLine(){ int counter; for( int k = 0; k < 30; k++ ) { counter = 0; for( int i = 0; i < 15; i++ ) if( Field[k] == 1 ) counter ++; if( counter < 15 ) continue; LineCount ++; for( int i = 0; i < 15; i++ ) { Field[k] = 0; Sleep(30); Display(); } for( int i = 0; i < 15; i++ ) { for( int m = k-1; m >= 0; m-- ) { Field[m+1] = Field[m]; } } }}void MakeFieldStatic(){ for( int i = 0; i < 15; i++ ) for( int k = 0; k < 30; k++ ) if( Field[k] == 2 ) Field[k] = 1;}void SpawnBrick(){ srand(timeGetTime()); switch( rand()%7 ) { case 0: Field[6][0] = 2; Field[7][0] = 2; Field[8][0] = 2; Field[9][0] = 2; break; case 1: Field[6][0] = 2; Field[7][0] = 2; Field[8][0] = 2; Field[6][1] = 2; break; case 2: Field[6][0] = 2; Field[7][0] = 2; Field[8][0] = 2; Field[8][1] = 2; break; case 3: Field[6][0] = 2; Field[7][0] = 2; Field[8][0] = 2; Field[7][1] = 2; break; case 4: Field[7][0] = 2; Field[8][0] = 2; Field[6][1] = 2; Field[7][1] = 2; break; case 5: Field[6][0] = 2; Field[7][0] = 2; Field[7][1] = 2; Field[8][1] = 2; break; case 6: Field[6][0] = 2; Field[7][0] = 2; Field[6][1] = 2; Field[7][1] = 2; break; } c_i = 7; c_k = 0;}void Init(void){ glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); memset(&Field[0][0],0,sizeof(Field)); SpawnBrick();}void PrintLines(){ int val = LineCount; float text_pos = -0.7; glColor3f(1,1,1); do { glRasterPos2f(text_pos, 0); glutBitmapCharacter( GLUT_BITMAP_TIMES_ROMAN_24, (char)(val%10)+'0' ); val /= 10; text_pos -= 0.05; }while( val > 0 );}void Display(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1,1,1); for( int i = 0; i < 15; i++ ) for( int k = 0; k < 30; k++ ) { if( Field[k] == 2 ) glColor3f(0,0,1); else if( Field[k] == 1 ) glColor3f(1,1,1); else glColor3f(0.5,0,0); DrawSqare(i,k); } //glColor3f(0,1,0); //DrawSqare(c_i,c_k); PrintLines(); glutSwapBuffers();}void Reshape(int w, int h){ glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION_MATRIX); glLoadIdentity(); glOrtho(0,w,h,0,-1, 1); glMatrixMode(GL_MODELVIEW_MATRIX); glLoadIdentity(); glScalef(1,-1,1); glutPostRedisplay();}void Keyboard(unsigned char key, int x, int y){ if(key==27) exit(0); if( key == 'A' || key == 'a' ) MoveBrickLeft(); if( key == 'D' || key == 'd' ) MoveBrickRight(); if( key == 'S' || key == 's' ) if( MoveBrickDown() ) { MakeFieldStatic(); DestroyLine(); SpawnBrick(); } if( key == 'Q' || key == 'q' ) RotateBrick(+1); if( key == 'E' || key == 'e' ) RotateBrick(-1); glutPostRedisplay();}void TimerFunc(int dummy){ if( MoveBrickDown() ) { MakeFieldStatic(); DestroyLine(); SpawnBrick(); } glutPostRedisplay(); glutTimerFunc(450,TimerFunc,0);}void main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(640, 512); glutCreateWindow("Shadow Mapping"); Reshape(640, 512); Init(); glutTimerFunc(450,TimerFunc,0); glutReshapeFunc(Reshape); glutDisplayFunc(Display); glutKeyboardFunc(Keyboard); glutMainLoop();}
Quote:Original post by szecs
It's C, but I think it has some invalid C syntax, but they can easily been replaced with valid code.
You get a cookie. Unfortunately, in C, there's no boolean type; replace with int, and return 0 and 1 in place of false and true respectively. Also, variable declarations can only exist at the start of the function. And one other nit pick: Isn't glut's header <GL/glut.h> and not "glut.h"? Google seems to say the former is correct.
Quote:Original post by _fastcallQuote:Original post by szecs
It's C, but I think it has some invalid C syntax, but they can easily been replaced with valid code.
You get a cookie. Unfortunately, in C, there's no boolean type; replace with int, and return 0 and 1 in place of false and true respectively. Also, variable declarations can only exist at the start of the function. And one other nit pick: Isn't glut's header <GL/glut.h> and not "glut.h"? Google seems to say the former is correct.
If you put it in the GL directory. But it isn't included in Windows by default, so "" means it's in the same directory, as the main.c. And since I don't use glut, just there was in a tutorial directory, it was simpler to copy near main.c.
But thanks for the cookie, whatever that means, I'm not a native English speaker (which is quite obvious, I think).
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement