// Game Code in C++
#include<stdio.h>
#include<glut.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<Windows.h>
#include<math.h>
int stx = 100, sty = 280;
float px = stx, py = sty; //centre pixel of car
float nacc = 2.0;
float accl = 0;
clock_t t1, t2; //to calculate the time taken to reach the goal
float friction = 0.20;
int time1 = 15;
float splimit = 5.0f;
char dir = 'O';
int leveltype = 0; //0 for easy, 1 for medium, 2 for hard
int h = 600, w = 1000;
int goalsize = 10;
int carsize = 4;
bool moveStart = false;
bool nwgame = true;
bool gmover = false;
bool goal = false;
int level = 1;
int highscore = 0;
int score = 0;
int encKey = 123;
int allcomp = 0; //All levels completed
int maxlevel = 6;
unsigned char pic[3] = {0};
bool toggle = true;
FILE *fp;
void car(float x, float y, int csize);
void myInit();
void grid1(int);
int collision(int, int);
void reshape(int wx, int hy);
void specialkeys(int key, int x, int y);
void handlekeys(unsigned char key, int x, int y);
void display();
void setPixel(float x, float y);
void automove(int value);
void start();
void mouse(int button, int state, int x, int y);
void changeLevelType();
GLubyte rgba[4];
int encryptHighscore(int num)
{
return num * encKey - 511377;
}
int decryptHighscore(int num)
{
if (num == 0)
return 0;
float s = (float) (num + 511377) / encKey;
float frac = s - (int)s;
if ((frac + 1) * 10000 == 10000.0)
return (int)s;
else return 0;
}
void toggleGlutWindowMaximizeBox(char *szWindowTitle)
{
long dwStyle;
HWND hwndGlut;
hwndGlut = FindWindow(NULL, szWindowTitle);
dwStyle = GetWindowLong(hwndGlut, GWL_STYLE);
dwStyle ^= WS_MAXIMIZEBOX;
SetWindowLong(hwndGlut, GWL_STYLE, dwStyle);
}
void getPixel(int x, int y, GLubyte *color) {
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color);
}
void *fonts[] =
{
GLUT_BITMAP_9_BY_15,
GLUT_BITMAP_TIMES_ROMAN_10,
GLUT_BITMAP_TIMES_ROMAN_24,
GLUT_BITMAP_HELVETICA_18,
GLUT_BITMAP_8_BY_13
};
void output(int x, int y, char *string, int f)
{
int len, i;
glPointSize(20.0);
glRasterPos2f(x, y);
len = (int) strlen(string);
for (i = 0; i < len; i++) {
glutBitmapCharacter(fonts[f], string[i]);
}
}
void myInit()
{
glClearColor(0.0, 1.0, 1.0, 1.0);
glLineWidth(3.0);
glShadeModel(GL_FLAT);
gluOrtho2D(0, w, h, 0);
changeLevelType();
int ii = encryptHighscore(20000);
int uu = decryptHighscore(ii);
try
{
fp = fopen("highscore.txt", "r+");
if (fp == NULL)
{
fp = fopen("highscore.txt", "w+");
fprintf(fp,"%d", 0);
}
else
{
fscanf(fp, "%d", &highscore);
highscore = decryptHighscore(highscore);
}
}
catch(...)
{
}
}
void border()
{
glBegin(GL_LINES);
//border
glVertex2i(1, 1);
glVertex2i(1, 599);
glVertex2i(1, 599);
glVertex2i(999, 599);
glVertex2i(999, 599);
glVertex2i(999, 1);
glVertex2i(999, 1);
glVertex2i(1, 1);
glEnd();
}
void grid1(int value)
{
//black grid rgba values are 0 0 0 255, a (alpha) is always same.
glBegin(GL_LINES);
//1st level
glVertex2i(260, 360);
glVertex2i(260, 200);
glVertex2i(260, 200);
glVertex2i(740, 200);
glVertex2i(740, 200);
glVertex2i(740, 400);
glVertex2i(740, 400);
glVertex2i(260, 400);
//2nd level
if (value >= 5)
{
glVertex2i(300, 240);
glVertex2i(300, 400);
}
glVertex2i(340, 200);
glVertex2i(340, 280);
glVertex2i(340, 320);
glVertex2i(340, 400);
if (value >= 3)
{
glVertex2i(380, 200);
glVertex2i(380, 360);
}
glVertex2i(420, 240);
glVertex2i(420, 400);
//3rd level
if (value > 1)
{
glVertex2i(460, 200);
glVertex2i(460, 280);
glVertex2i(460, 280);
glVertex2i(580, 280);
}
if (value > 1)
{
glVertex2i(460, 320);
glVertex2i(460, 360);
glVertex2i(460, 320);
glVertex2i(540, 320);
glVertex2i(460, 360);
glVertex2i(540, 360);
glVertex2i(540, 320);
glVertex2i(540, 360);
}
if (value > 2)
{
glVertex2i(540, 200);
glVertex2i(540, 240);
}
if (value >= 1)
{
glVertex2i(660, 280);
glVertex2i(740, 280);
}
if (value > 3)
{
glVertex2i(620, 240);
glVertex2i(700, 240);
}
if (value >= 1)
{
glVertex2i(620, 320);
glVertex2i(700, 320);
glVertex2i(700, 320);
glVertex2i(700, 360);
}
if (value >= 4)
{
glVertex2i(660, 360);
glVertex2i(700, 400);
}
glVertex2i(620, 240);
glVertex2i(620, 400);
glEnd();
glColor3f(0.0f, 0.0, 1.0);
if (value == 1)
car(580, 320, goalsize);
else if (value == 2)
car(570, 360, goalsize);
else if (value == 3)
car(520, 220, goalsize);
else if (value == 4)
car(720, 260, goalsize);
else if (value == 5)
car(720, 370, goalsize);
else if (value == 6)
car(660, 385, goalsize);
}
int collision(int size, int value)
{
// 0 if not collision, 1 if collision, 2 if goal
//checking goal color i.e. blue
getPixel(px,h - 1 - py, rgba);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 255)
return 2;
getPixel(px,h - 1 - py+size, rgba);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 255)
return 2;
getPixel(px+size,h - 1 - py, rgba);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 255)
return 2;
getPixel(px-size,h - 1 - py, rgba);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 255)
return 2;
// checking for 4 directions of car
getPixel(px,600 - 1 - py-size, rgba); // getting pixel from cooardinates, initially viewport coordinates are bottom left, then inverting y to set viewport
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 0)
return 1;
getPixel(px,600 - 1 - py+size, rgba);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 0)
return 1;
getPixel(px+size,600 - 1 - py, rgba);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 0)
return 1;
getPixel(px-size,600 - 1 - py, rgba);
if (rgba[0] == 0 && rgba[1] == 0 && rgba[2] == 0)
return 1;
return 0;
}
void setPixel(float x, float y)
{
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
void car(float x, float y, int csize)
{
glBegin(GL_POLYGON);
glVertex2i(x-csize, y-csize);
glVertex2i(x-csize, y+csize);
glVertex2i(x+csize, y+csize);
glVertex2i(x+csize, y-csize);
glEnd();
}
float ax = 1.0, ay = 1.0;
void movement(int value)
{
px += ax;
py += ay;
if (px <= 0)
ax = -ax;
if (px > 1000)
ax = -ax;
if (py < 0)
ay = -ay;
if (py >= 600)
ay = -ay;
glutPostRedisplay();
if(!toggle)
glutTimerFunc(time1, movement, 1);
}
void changeLevelType()
{
if (leveltype == 1)
{
carsize = 7;
goalsize = 10;
friction = 0.15;
nacc = 2.0;
splimit = 6.0;
}
else if(leveltype == 2)
{
carsize = 8;
goalsize = 10;
friction = 0.10;
nacc = 2.0;
splimit = 8.0;
}
else if(leveltype == 0)
{
level = 1;
accl = 0;
t1 = t2;
leveltype = 0;
px = stx;
py = sty;
nwgame = true;
goal = false;
carsize = 4;
goalsize = 10;
score = 0;
friction = 0.20;
nacc = 1.0;
splimit = 5.0;
}
level = 1;
}
void automove(int value)
{
if (dir == 'w')
py -= accl;
else if (dir == 's')
py += accl;
else if (dir == 'a')
px -= accl;
else if (dir == 'd')
px += accl;
else dir = 'O';
//time -= accl;
accl -= friction;
if (px < 0)
px = 1000;
if (px > 1000)
px = 0;
if (py < 0)
py = 600;
if (py > 600)
py = 0;
if (collision(carsize, level) == 1) //wall collision
{
accl = 0;
px = stx;
nwgame = false;
py = sty;
goal = false;
if (score >= 0)
score -= 100;
if (score < 0)
score = 0;
}
if(collision(carsize, level) == 2) //goal collision
{
if (score > highscore)
{
highscore = score;
try{
fp = fopen("highscore.txt", "w+");
fprintf(fp, "%d", encryptHighscore(highscore));
}
catch(...)
{
}
}
accl = 0;
level++;
if (level > maxlevel)
{
leveltype++;
if (leveltype == 3)
allcomp = 1;
changeLevelType();
}
px = stx;
nwgame = true;
py = sty;
goal = false;
}
glutPostRedisplay();
if (accl > 0)
glutTimerFunc(time1, automove, 0);
}
void start()
{
accl = 0;
glutTimerFunc(time1, automove, 0);
}
void showtime()
{
char strr[20];
int tot;
tot = (double)(t2 - t1)/1000; // calculating time
itoa(tot, strr, 10);
output(650, 50, strr, 3); // displaying time
itoa(level, strr, 10);
output(650, 80, strr, 3); // displaying level
itoa(score, strr, 10);
output(650, 140, strr, 3); // displaying score
output(600,110, "HIGHSCORE: ", 4);
itoa(highscore, strr, 10);
output(680, 110, strr, 3);
}
void playtime(int value)
{
glutPostRedisplay();
t2 = clock();
if (score > 0)
score -= 1; // score calculation
if (goal == true)
glutTimerFunc(100, playtime, 1);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 0.01, 0.0);
border();
if (allcomp == 1)
{
output(260,170, "CONGRATULATIONS! YOU HAVE COMPLETED ALL LEVELS.", 4);
output(260,190, "FOR MORE VISIT WWW.YOUTUBE.COM/SHIVNARR", 4);
leveltype = 0;
changeLevelType();
}
glColor3f(0.0f, 0.0, 0.0);
grid1(level);
glColor3f(0.0f, 0.1, 0.0);
output(800, 580, "SHIVINDER SINGH NARR", 4);
output(700, 592, "http://shivindernarr.blogspot.com", 4);
output(50, 50, "GOAL - MOVE GREEN SQUARE TO BLUE SQUARE", 4);
output(50, 80, "USE ARROW KEYS TO MOVE SQUARE", 4);
output(50, 580, "Exit(ESC)", 4);
output(150, 580, "Restart(R)", 4);
output(600, 80, "LEVEL: ", 4);
output(600,140, "SCORE: ", 4);
output(665, 80, "/ 6", 3);
if (leveltype == 0)
{
output(690, 80, "(EASY)", 4);
}
else if (leveltype == 1)
{
output(690, 80, "(MEDIUM)", 4);
}
else if (leveltype == 2)
{
output(690, 80, "(HARD)", 4);
}
output(600, 50, "TIME: ", 4);
output(680, 50, "SECONDS", 4);
showtime();
glColor3f(0.0f, 0.3, 0.0);
car(px, py, carsize);
glutSwapBuffers();
glFlush();
}
void handlekeys(unsigned char key, int x, int y)
{
if (key == 27) // Esc key
exit(0);
if (key == 'S') // Cheat key
{
toggle = !toggle;
movement(1);
}
if (allcomp == 1) // Enter key
{
level = 1;
allcomp = 0;
accl = 0;
t1 = t2;
leveltype = 0;
px = stx;
py = sty;
nwgame = true;
goal = false;
carsize = 4;
goalsize = 10;
score = 0;
friction = 0.20;
nacc = 1.0;
splimit = 5.0;
glutPostRedisplay();
}
if (key == 'r' || key == 'R')
{
level = 1;
accl = 0;
t1 = t2;
leveltype = 0;
px = stx;
py = sty;
nwgame = true;
goal = false;
carsize = 4;
goalsize = 10;
score = 0;
friction = 0.20;
nacc = 1.0;
splimit = 5.0;
glutPostRedisplay();
}
}
void specialkeys(int key, int x, int y) {
if (key == GLUT_KEY_UP){
dir = 'w';
}
else if (key == GLUT_KEY_DOWN) {
dir = 's';
}
else if (key == GLUT_KEY_LEFT) {
dir = 'a';
}
else if (key == GLUT_KEY_RIGHT) {
dir = 'd';
}
if (accl <= 0)
{
start();
}
if (accl == 0 && px == stx && py == sty)
{
t1 = clock();
goal = true;
if (nwgame)
score = score + 500 * level; //score addition
playtime(1);
}
if (moveStart == false && accl <= 0)
{
moveStart = true;
}
accl += nacc;
if (accl > splimit)
accl = splimit;
}
void specialkeysup(int key, int x, int y)
{
if (key == GLUT_KEY_UP){
moveStart = false;
}
else if (key == GLUT_KEY_DOWN) {
moveStart = false;
}
else if (key == GLUT_KEY_LEFT) {
moveStart = false;
}
else if (key == GLUT_KEY_RIGHT) {
moveStart = false;
}
}
void reshape(int wx, int hy)
{
glViewport(0,0, w, h); // Set the viewport to the size of our window
}
int main(int argc, char ** argv)
{
char * winMess = "Maze Ver 1.0";
HWND h1 = GetConsoleWindow();
ShowWindow(h1, SW_HIDE);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowSize(w, h);
glutInitWindowPosition(150, 100);
glutCreateWindow(winMess);
myInit();
glutDisplayFunc(display);
glutKeyboardFunc(handlekeys);
glutSpecialFunc(specialkeys);
glutSpecialUpFunc(specialkeysup);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
|
No comments:
Post a Comment