Sunday 10 December 2017

Snake Game In C

#include <iostream>
#include <conio.h>

void run(); //fun prototype//
void printMap();
void initMap();
void move(int dx, int dy);
void update();
void changeDirection(char key);
void clearScreen();
void generateFood();
char getMapValue(int value);




// Map dimensions
const int mapwidth = 20;
const int mapheight = 20;
const int size = mapwidth * mapheight; //to make squre(square formula w*h)




// The tile values for the map
int map[size];




// Snake head details
int headxpos;
int headypos;
int direction;




// Amount of food the snake has (How long the body is)
int food = 3;




// Determine if game is running
bool running;

int main()


{
run();
return 0;


}
// Main game function
void run()


{
// Initialize the map


initMap();
running = true;
while (running)


{
// If a key is pressed
if (kbhit())


{
// Change to direction determined by key pressed


changeDirection(getch());
}
// Upate the map


update();
// Clear the screen


clearScreen();
// Print the map


printMap();
// wait 0.5 seconds


_sleep(500);
}
// Print out game over text
printf("\t\t!!!Game over!");
printf("\t\tYour score is: %d\n", food );



// Stop console from closing instantly
scanf("ignore");


}
// Changes snake direction from input
void changeDirection(char key)


{

switch (key)


{
case 'w':
if (direction != 3) direction = 0;
break;
case 'd':
if (direction != 4) direction = 1;
break;
case 's':
if (direction != 4) direction = 2;
break;
case 'a':
if (direction != 5) direction = 3;
break;


}
}
// Moves snake head to new location
void move(int dx, int dy)


{
// determine new head position
int newx = headxpos + dx;
int newy = headypos + dy;

// Check if there is food at location
if (map[newx + newy * mapwidth] == -2)



{
// Increase food value (body length)


food++;
// Generate new food on map


generateFood();
}
// Check location is free
else if (map[newx + newy * mapwidth] != 0)



{
running = false;


}
// Move head to new location


headxpos = newx;
headypos = newy;
map[headxpos + headypos * mapwidth] = food + 1;

}
// Clears screen
void clearScreen()



{
// Clear the screen
system("cls"); //pre defined function


}
// Generates new food on map
void generateFood()



{
int x = 0;
int y = 0;
do


{
// Generate random x and y values within the map


x = rand() % (mapwidth - 2) + 1;
y = rand() % (mapheight - 2) + 1;
// If location is not free try again


}

while (map[x + y * mapwidth] != 0);

// Place new food


map[x + y * mapwidth] = -2;
}
// Updates the map
void update() //fun declearation//


{
// Move in direction indicated
switch (direction)


{
case 0: move(-1, 0); //down
break;
case 1: move(0, 1); //right
break;
case 2: move(1, 0); //up
break;
case 3: move(0, -1); //left
break;


}
// Reduce snake values on map by 1
for (int i = 0; i < size; i++)



{
if (map[i] > 0) map[i]--;


}
}
// Initializes map
void initMap()


{
// Places the initual head location in middle of map


headxpos = mapwidth / 2;
headypos = mapheight / 2;
map[headxpos + headypos * mapwidth] = 1;
// Places top and bottom walls
for (int x = 0; x < mapwidth; ++x)



{
map[x] = -1;
map[x + (mapheight - 1) * mapwidth] = -1;
}
// Places left and right walls
for (int y = 0; y < mapheight; y++)



{
map[0 + y * mapwidth] = -1;
map[(mapwidth - 1) + y * mapwidth] = -1;
}
// Generates first food


generateFood();
}
// Prints the map to console
void printMap()


{
for (int x = 0; x < mapwidth; ++x)



{
for (int y = 0; y < mapheight; ++y)



{
// Prints the value at current x,y location
std::cout << getMapValue(map[x + y * mapwidth]); // internet help


}
// Ends the line for next x value
std::cout << std::endl; //internet help


}
}
// Returns graphical character for display from map value
char getMapValue(int value)


{
// Returns a part of snake body
if (value > 0) return 'o';

switch (value)



{
// Return wall
case -1: return 'X';
// Return food
case -2: return '0x';


}
}

1 comments:

Tech UOG