commit c4e01c3917dab95e07c4fa6791a74d4fbb7732ca Author: Giovani Date: Fri Jul 16 13:53:08 2021 -0400 chore: add project to git repo diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4e945a0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +{"mode":"full","isActive":false} \ No newline at end of file diff --git a/krazy_kats_game.cbp b/krazy_kats_game.cbp new file mode 100644 index 0000000..7d7a8f3 --- /dev/null +++ b/krazy_kats_game.cbp @@ -0,0 +1,46 @@ + + + + + + diff --git a/krazy_kats_game.depend b/krazy_kats_game.depend new file mode 100644 index 0000000..0db2960 --- /dev/null +++ b/krazy_kats_game.depend @@ -0,0 +1,45 @@ +# depslib dependency file v1.0 +1449675415 source:c:\users\giovani rodriguez\desktop\other\current\krazy_kats_game\main.cpp + + + + + + + +1450200877 source:c:\users\kciscisco\desktop\krazy_kats_game\main.cpp + + + + + + + + +1449705239 source:c:\users\giovani rodriguez\desktop\other\current\krazy_kats_game\krazy_kats_game\main.cpp + + + + + + + + +1449768605 source:c:\users\giovani rodriguez\desktop\other\current\krazy_kats_game\krazy_kats_game\krazy_kats_game\main.cpp + + + + + + + + +1450197869 source:c:\users\luis\desktop\krazy_kats_game\main.cpp + + + + + + + + diff --git a/krazy_kats_game.layout b/krazy_kats_game.layout new file mode 100644 index 0000000..8d54c8e --- /dev/null +++ b/krazy_kats_game.layout @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..797800a --- /dev/null +++ b/main.cpp @@ -0,0 +1,1138 @@ +// Notes: +// credit to Erick Skiff +// Resistor Anthems / Music + +#include +#include +#include +#include +#include + +#define _WIN32_WINNT 0x0500 // make sure its windows higher than XP +#include +#include + +//define key word for clear +#define clear system("CLS") + +using namespace std; + +// Windows API struct and methods +// credit to Duoas +// http://www.cplusplus.com/forum/windows/10731/ +// colorattribute = foreground_color + background_color * 16 +struct console +{ + console( unsigned width, unsigned height ) + { + SMALL_RECT r; + COORD c; + hConOut = GetStdHandle( STD_OUTPUT_HANDLE ); + if (!GetConsoleScreenBufferInfo( hConOut, &csbi )) + throw runtime_error( "You must be attached to a human." ); + + r.Left = + r.Top = 0; + r.Right = width -1; + r.Bottom = height -1; + SetConsoleWindowInfo( hConOut, TRUE, &r ); + + c.X = width; + c.Y = height; + SetConsoleScreenBufferSize( hConOut, c ); + } + + ~console() + { + SetConsoleTextAttribute( hConOut, csbi.wAttributes ); + SetConsoleScreenBufferSize( hConOut, csbi.dwSize ); + SetConsoleWindowInfo( hConOut, TRUE, &csbi.srWindow ); + } + + void color( WORD color = 0x07 ) + { + SetConsoleTextAttribute( hConOut, color ); + } + + HANDLE hConOut; + CONSOLE_SCREEN_BUFFER_INFO csbi; +}; + +// console set size +console con(80, 47); + +// global variables { +const unsigned int Y_SIZE = 10; +const unsigned int X_SIZE = 15; +const unsigned int KATS = 5; +const unsigned int OBSTACLES = 15; + +// pertange chance +const double KAT_KAPTURE = 0.65; +const double SELF_KAPTURE = 0.02; +const double HAS_TUNA = 0.10; +const double EYES_SUBMISSION = 0.60; +const double PURRS_DOOM = 0.70; +const double IS_SMART = 0.60; + +// declare structures +struct Human_t +{ + static const char HUNTER_C = 233; // character representation + + int x; // x position + int y; // y position + int health; + bool has_glasses; // is it on + bool has_muffs; // is it on + bool is_stunned; // is he stunned +}; + +struct Cat_t +{ + static const char KATS_C = 236; // character representation + + int x; // x position on board + int y; // y position on board + bool is_kaptured; // check if kaptured + bool is_smart; + bool has_tuna; // if cat carries tuna +}; + +// function prototypes +void instructions(const char, const char); +bool success(double percent_chance); +unsigned int rangeCheck(const char [][X_SIZE], const unsigned int, const unsigned int, int &, int &, const char); +unsigned int directionCheck(const Human_t, const Cat_t); +bool won(Cat_t []); +void initializeBoard(char [][X_SIZE]); +void setupGame(char [][X_SIZE], Human_t &, Cat_t []); +void printBoard(const char [][X_SIZE], const Human_t, const Cat_t [], const unsigned int); +void userMovementAction(char [][X_SIZE], Human_t &, Cat_t [], const unsigned int); +void katsMovementAction(char [][X_SIZE], Human_t &, Cat_t []); + +int main() +{ + // play music + PlaySound("music.wav", NULL, SND_FILENAME | SND_ASYNC); + + // variable declarations + // consts + const unsigned int ACTIONS_PER_TURN = 2; + const unsigned int ENTER = 13; + + // non-const + char board[Y_SIZE][X_SIZE] = { {' '} }; + Human_t hunter; + Cat_t kats[KATS]; + bool have_won = false; + + // set console color + con.color(15); + clear; + + // tell user the instruction + instructions(hunter.HUNTER_C,kats[0].KATS_C); + + // initialize board + initializeBoard(board); + + // setup board + setupGame(board, hunter, kats); + + // print board + printBoard(board, hunter, kats, 0); + + // start the game + while ( !(hunter.health <= 0) ) + { + // user performs two action + for (unsigned int i = 0; (i < ACTIONS_PER_TURN) && !hunter.is_stunned; i++) + { + userMovementAction(board, hunter, kats, i); + + // reprint to screen + printBoard(board, hunter, kats, i+1); + + // check to see if i've won + have_won = won(kats); + + // if you won break + if (have_won) + break; + } + + // if you won break second loop + if (have_won) + break; + + // tell user it's kats turn + if (!hunter.is_stunned) + cout << "Kats will now make their move.." << endl << endl; + else + cout << "You are stunned, Kats will move again.." << endl << endl; + + // reset stun + hunter.is_stunned = false; + + // so user can seoption = 1 + rand() % 4;e movement + // make user wait + Sleep(750); + + // make Kats move + for (unsigned int i = 0; i < ACTIONS_PER_TURN; i++) + { + // make user wait + Sleep(750); + + // kats choose their action + katsMovementAction(board, hunter, kats); + + // reprint to screen + printBoard(board, hunter, kats, 0); + + // check to see if you lost + if (hunter.health <= 0) + break; + } + + // reset hunter's protection + hunter.has_glasses = false; + hunter.has_muffs = false; + + // reprint to screen + printBoard(board, hunter, kats, 0); + + // check to see if you lost + if (hunter.health <= 0) + break; + } + + if (hunter.health <= 0) + { + // tell then they lost + con.color(12); + cout << "YOU LOSE! TRY AGAIN..." << endl; + con.color(15); + } + else if (have_won) + { + // tell then they lost + con.color(10); + cout << "CONGRATULATIONS! YOU WIN!" << endl; + con.color(15); + } + + cout << "Press enter to play again!" << endl; + while ((unsigned)getch() != ENTER); + + main(); // start game again + + return 0; +} + +void instructions(const char hunter, const char kat) +{ + // variable declaration + // consts + const char EMPTY_C = 176; + const char OBSTACLE_C = 219; + const char BULLET = 237; + const unsigned int ENTER = 13; + + // explain instruction + // characters + cout << "Characters: " << endl << endl; + cout << "\t" << hunter << " - HUNTER" << endl; + cout << "\t" << kat << " - KAT" << endl; + cout << "\t" << OBSTACLE_C << " - HOUSE" << endl; + cout << "\t" << EMPTY_C << " - EMPTY" << endl << endl; + + // background + cout << "Background:" << endl << endl; + cout << "You are in a town that is crawling with Krazy Kats!! You a hunter sent to\nthis town to kapture them. The Kats wander in"; + cout << " the town and attack their\nvictims. Once an attack is executed successfully the hunter has been subued\nand the kat steals"; + cout << " their Tuna Of Health. The hunter has equipment to protect\nagainst these types of attacks and can kapture kats using a Kat"; + cout << " Kapture system." << endl << endl; + + // controls + cout << "Controls: " << endl << endl; + cout << "\tUp - Move Up" << endl; + cout << "\tDown - Move Down" << endl; + cout << "\tLeft - Move Left" << endl; + cout << "\tRight - Move Right" << endl; + cout << "\tF1 - Reflective Glasses" << endl; + cout << "\tF2 - Earmuffs of Happiness" << endl; + cout << "\tF3 - Kat Kapture" << endl << endl; + + // mechanics + cout << "Mechanics: " << endl << endl; + cout << "\t" << BULLET << " Each the hunter and the kats get two actions per turn" << endl; + cout << "\t" << BULLET << " The hunter and kats can move up, down, left or right" << endl; + cout << "\t" << BULLET << " Any attack by the hunter or kats take one action" << endl; + cout << "\t" << BULLET << " The hunter and the kat may not occupy the same square" << endl << endl; + + // hunter attacks + cout << "Attack and Defenses:" << endl << endl; + cout << "Kats use Eyes of Submission to take a hunter's Tuna from one space away and\nhave a 60% chance of success. "; + cout << "They also use Purr of Doom to stun a hunter from\ntwo spaces away and have a 80% chance of success. "; + cout << "Hunter's may use Reflective\nGlasses and Earmuffs of Happiness respectively and cut those chances in half.\n"; + cout << "To defeat the Kats the hunter must use the Kat Kapture System to kapture them\nwith a 10% of finding health! "; + cout << "Careful with some kats! They may not be as stupid\nas they seem. Good luck." << endl << endl; + + cout << "You can press ESC at anytime to view instructions again!\nPress enter to continue to the game..."; + while ((unsigned)getch() != ENTER); + + // clear screen + clear; + + // go back to main function + return; +} + +bool success(double percent_chance) +{ + // delcare and initialize variable + unsigned int random = 0; + unsigned int bin = 100 * percent_chance; // store in int even if trancates + + random = 1 + rand() % 100; // number between 1 - 100 + + // determine wether it is success or not + if (random <= bin) + return true; + else + return false; +} + +unsigned int rangeCheck(const char board [][X_SIZE], const unsigned int y, const unsigned int x, unsigned int & y_find, unsigned int & x_find, const char find) +{ + // check to see where we can find char "find" + // range of 1 + for (unsigned int j = y - 1; j <= y + 1; j++) + for (unsigned int i = x - 1; i <= x + 1; i++) + if (board[j][i] == find) + { + // save coordinates + y_find = j; + x_find = i; + return 1; + } + + // range of 2 + for (unsigned int j = y - 2; j <= y + 2; j++) + for (unsigned int i = x - 2; i <= x + 2; i++) + if (board[j][i] == find) + { + // save coordinates + y_find = j; + x_find = i; + return 2; + } + + // if we didnt find anything retunr 0 + return 0; +} + +void initializeBoard(char arr_board[][X_SIZE]) +{ + // variable declaration + // consts + const char HORI = 205; + const char VERT = 186; + const char CORNER1 = 201; + const char CORNER2 = 187; + const char CORNER3 = 200; + const char CORNER4 = 188; + const char EMPTY_C = 176; + + // do top fence + arr_board[0][0] = CORNER1; + arr_board[0][X_SIZE - 1] = CORNER2; + + for (unsigned int i = 1; i < (X_SIZE - 1); i++) + arr_board[0][i] = HORI; + + // everything in middle + for (unsigned int i = 1; i < Y_SIZE; i++) + { + for (unsigned int j = 0; j < X_SIZE; j++) + { + if (j == 0 || j == (X_SIZE - 1) ) + arr_board[i][j] = VERT; + else + arr_board[i][j] = EMPTY_C; + } + } + + // do bottom fence + arr_board[Y_SIZE - 1][0] = CORNER3; + arr_board[Y_SIZE - 1][X_SIZE - 1] = CORNER4; + + for (unsigned int i = 1; i < (X_SIZE - 1); i++) + arr_board[Y_SIZE - 1][i] = HORI; + + // go back to main + return; +} + +void setupGame(char arr_board[][X_SIZE], Human_t & hunter, Cat_t kats[]) +{ + // variable declaration + // consts + const char EMPTY_C = 176; + const char OBSTACLE_C = 219; + + // non consts + unsigned int bin_x = 0; + unsigned int bin_y = 0; + unsigned int dummy_y = 0; + unsigned int dummy_x = 0; + bool hunter_generated = false; + + // seed random function + srand( (unsigned)time(NULL) ); + + // intitalize values + // hunter + hunter.x = 0; + hunter.y = 0; + hunter.health = 5; + hunter.has_glasses = 0; + hunter.has_muffs = 0; + hunter.is_stunned = 0; + + // kats + for (unsigned int i = 0; i < KATS; i++) + { + kats[i].x = 0; + kats[i].y = 0; + kats[i].is_kaptured = 0; + kats[i].is_smart = 0; + kats[i].has_tuna = 0; + } + + // give kats tuna 10% chance and 50% if smart + for (unsigned int i = 0; i < KATS; i++) + { + if ( success(HAS_TUNA) ) + kats[i].has_tuna = 1; + + if ( success(IS_SMART) ) + kats[i].is_smart = 1; + } + + // generate obstacles + for (unsigned int i = 0; i < OBSTACLES; i++) + { + // generate a coordinate and make sure neither x or y are zero + bin_y = 1 + rand() % (Y_SIZE - 2); + + bin_x = 1 + rand() % (X_SIZE - 2); + + // put in board + if (arr_board[bin_y][bin_x] == EMPTY_C && rangeCheck(arr_board, bin_y, bin_x, dummy_y, dummy_x, OBSTACLE_C) != 1 ) + arr_board[bin_y][bin_x] = OBSTACLE_C; + else + i--; + } + + // generate kats + for (unsigned int i = 0; i < KATS; i++) + { + kats[i].y = 1 + rand() % (Y_SIZE - 2); + + kats[i].x = 1 + rand() % (X_SIZE - 2); + + // put on board + if (arr_board[ kats[i].y ][ kats[i].x ] == EMPTY_C) + arr_board[ kats[i].y ][ kats[i].x ] = kats[0].KATS_C; + else + i--; + } + + // generate hunter + while(!hunter_generated) + { + hunter.y = 1 + rand() % (Y_SIZE - 2); + + hunter.x = 1 + rand() % (X_SIZE - 2); + + // put on board + if (arr_board[ hunter.y ][ hunter.x ] == EMPTY_C && rangeCheck(arr_board, hunter.y, hunter.x, dummy_y, dummy_x, kats[0].KATS_C) != 1) + { + arr_board[ hunter.y ][ hunter.x ] = hunter.HUNTER_C; + hunter_generated = true; + } + } + + // go back to main + return; +} + +void printBoard(const char arr_board[][X_SIZE], const Human_t hunter, const Cat_t kats[], const unsigned int turn) +{ + // clear screen before printing + clear; + + // print the header (health and game name) + con.color(10); + cout << "\t\t\t" << setw( (X_SIZE) + 5 ) << right << "KrAzY KAts!" << endl << endl; + con.color(15); + + cout << "\t\t\tTURN: " << turn << endl; + cout << "\t\t\tHEALTH: "; + + if ( !(hunter.health < 0) ) // if health becomes less than 0 make it 0 + { + for (int i = 0; i < hunter.health; i++) + { + con.color(14); + cout << "* "; + con.color(15); + } + } + cout << "\n"; + + // print board to screen + for (unsigned int i = 0; i < Y_SIZE; i++) + { + // tab eveything over and center the board + cout << "\t\t\t"; + for (unsigned int j = 0; j < X_SIZE; j++) + { + // add top and bottom fences to spaces if needed + if ( ( i == 0 || i == (Y_SIZE - 1) ) && j != (X_SIZE - 1) ) + cout << arr_board[i][j] << arr_board[0][1]; + else + { + if (arr_board[i][j] == hunter.HUNTER_C) + { + // this will make the hunter green + con.color(10); + cout << arr_board[i][j] << " "; + con.color(15); + } + else if (arr_board[i][j] == kats[0].KATS_C) + { + // this will make the the kats red + con.color(12); + cout << arr_board[i][j] << " "; + con.color(15); + } + else + cout << arr_board[i][j] << " "; + } + } + // after the newline tab everything over and center + // add the side fence to the spaces + if ( i != (Y_SIZE - 1) ) + { + cout << "\n\t\t\t"; + cout << arr_board[1][0] << setw( (X_SIZE * 2) - 2 ) << right << arr_board[1][0] << endl; + } + else + cout << "\n"; + } + + // print hunter information + cout << "\t\t\tReflective Glasses: "; + if (hunter.has_glasses) + { + con.color(10); + cout << "ON"; + con.color(15); + } + else + { + con.color(12); + cout << "OFF"; + con.color(15); + } + cout << "\n"; + + cout << "\t\t\tEarmuffs of Happiness: "; + if (hunter.has_muffs) + { + con.color(10); + cout << "ON"; + con.color(15); + } + else + { + con.color(12); + cout << "OFF"; + con.color(15); + } + cout << "\n\n"; + + // log part + cout << "LOG:" << endl; + + // go back to main + return; +} + +void userMovementAction(char board[][X_SIZE], Human_t & hunter, Cat_t kats[], const unsigned int turn) +{ + // variable declaration + // consts + const unsigned int UP = 72; + const unsigned int DOWN = 80; + const unsigned int LEFT = 75; + const unsigned int RIGHT = 77; + const unsigned int F1 = 59; + const unsigned int F2 = 60; + const unsigned int F3 = 61; + const unsigned int ESC = 27; + const unsigned int ENTER = 13; + const char EMPTY_C = 176; + + + // non-consts + bool action_success = false; + unsigned int bin_y = hunter.y; + unsigned int bin_x = hunter.x; + unsigned int kat_y = 0; + unsigned int kat_x = 0; + bool bin_glasses = false; + bool bin_muffs = false; + bool kat_kapture = false; + bool instructions_bool = false; + + while(!action_success) + { + FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); // flush input buffer + // start to take input + switch ( getch() ) + { + case UP: // move up + bin_y--; + break; + case DOWN: // move down + bin_y++; + break; + case LEFT: // move left + bin_x--; + break; + case RIGHT: // move right + bin_x++; + break; + case F1: // put glasses on + bin_glasses = true; + break; + case F2: // put glasses on + bin_muffs = true; + break; + case F3: + kat_kapture = true; + break; + case ESC: + // show user the instruction without reseting the game + instructions_bool = true; + break; + default: + break; + } + + // if we moved then check to see if there is an empty space + if (bin_x != (unsigned)hunter.x || bin_y != (unsigned)hunter.y) + { + if (board[bin_y][bin_x] == EMPTY_C) + { + // replace old spot with empty space + board[hunter.y][hunter.x] = EMPTY_C; + + // set new coordinates to hunter + hunter.x = bin_x; + hunter.y = bin_y; + + // put hunter in new spot + board[hunter.y][hunter.x] = hunter.HUNTER_C; + + // make action successful + action_success = true; + } + else + { + // let the user know they may not go in that direction + cout << "This direction is blocked! Try Again." << endl; + + // return to original position + bin_x = hunter.x; + bin_y = hunter.y; + } + } + // if user wants to put glasses on makes sure they aren't on already + else if (bin_glasses) + { + // check to see if hunter has glasses on already if not put the on + if (!hunter.has_glasses) + { + // put glasses on + hunter.has_glasses = true; + + // tell user glasses on + con.color(10); + cout << "You have put on the Reflective Glasses." << endl; + con.color(15); + // ask the user to press enter so they may end their turn + cout << "Press enter to continue..." << endl << endl; + while ((unsigned)getch() != ENTER); + + // reset bin + bin_glasses = false; + + // make action successful + action_success = true; + } + else + { + // tell user he already has glasses on + cout << "You already have the glasses on." << endl; + + // reset bin + bin_glasses = false; + } + } + // if user wants to put muffs on makes sure they aren't on already + else if (bin_muffs) + { + // check to see if hunter has glasses on already if not put the on + if (!hunter.has_muffs) + { + // put glasses on + hunter.has_muffs = true; + + // tell user earmuffs on + con.color(10); + cout << "You have put on the Earmuffs of Happiness." << endl; + con.color(15); + // ask the user to press enter so they may end their turn + cout << "Press enter to continue..." << endl << endl; + while ((unsigned)getch() != ENTER); + + // reset bin + bin_muffs = false; + + // make action successful + action_success = true; + } + else + { + // tell user he already has glasses on + cout << "You already have the earmuffs on." << endl; + + // reset bin + bin_muffs = false; + } + } + // run code if user wants to kapture kat + else if (kat_kapture) + { + if ( rangeCheck(board, hunter.y, hunter.x, kat_y, kat_x, kats[0].KATS_C) == 1 ) + { + // check to see if attack successful + if( success(KAT_KAPTURE) ) + { + // find kat that was kaptured and set to true + for (unsigned int i = 0; i < KATS; i++) + { + if( (unsigned)kats[i].y == kat_y && (unsigned)kats[i].x == kat_x) + { + kats[i].is_kaptured = true; + // if kat has tuna increase health + if (kats[i].has_tuna) + { + con.color(10); + cout << "You have found a tuna of health!" << endl; + con.color(15); + hunter.health++; + } + + } + + } + + // set space to empty + board[kat_y][kat_x] = EMPTY_C; + + // tell user they were successful + con.color(10); + cout << "You have kaptured the kat successfully!!" << endl; + con.color(15); + // ask the user to press enter so they may end their turn + cout << "Press enter to continue..." << endl; + while ((unsigned)getch() != ENTER); + } + else if ( success(SELF_KAPTURE) ) + { + // take health + hunter.health--; + + // tell user kapture was unsuccessful + con.color(4); + cout << "You have hurt yourself with the Kat Kapture.. -.-" << endl; + con.color(15); + + cout << "Press enter to continue..." << endl; + while ((unsigned)getch() != ENTER); + } + else + { + // tell user kapture was unsuccessful + con.color(12); + cout << "Kapture was unsuccessful. :'(" << endl; + con.color(15); + + cout << "Press enter to continue..." << endl; + while ((unsigned)getch() != ENTER); + } + + // reset bin + kat_y = 0; + kat_x = 0; + + // reset action + kat_kapture = false; + + // set action successful to true + action_success = true; + } + else + { + // tell user there are no kats near by + cout << "You are not within one space of a kat. Try again." << endl; + + // reset action + kat_kapture = false; + + // reset bin + kat_y = 0; + kat_x = 0; + } + } + // run code to show instructions + else if(instructions_bool) + { + // clear current screen + clear; + + // show instruction + instructions(hunter.HUNTER_C, kats[0].KATS_C); + + // clear instruction screen + clear; + + // return to game + printBoard(board, hunter, kats, turn); + + // reset instructions + instructions_bool = false; + } + } + + // go back to main + return; +} + +void katsMovementAction(char board[][X_SIZE], Human_t & hunter, Cat_t kats[]) +{ + // variable declaration + // consts + const char EMPTY_C = 176; + const unsigned int ENTER = 13; + + // non-consts + unsigned int bin_y = 0; + unsigned int bin_x = 0; + unsigned int option = 0; + unsigned int bin_range = 0; + double chance = 0.0; + bool submission = false; + bool purr = false; + bool blocked = false; + bool action_success = false; + + FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); // flush input buffer + + // start actions for each kat + for (unsigned int i = 0; i < KATS; i++) + { + // reset action success + action_success = false; + + // if he is kaptured skip kat + if ( kats[i].is_kaptured ) + continue; + + while(!action_success) // if counter goes over 5 kat is stuck + { + // if kat is smart force to attack if close or move closer + if( kats[i].is_smart ) + { + bin_range = rangeCheck(board, kats[i].y, kats[i].x, bin_y, bin_x, hunter.HUNTER_C); + + if (bin_range == 1) + option = 6; // eyes of submission + else if (bin_range == 2 && !hunter.is_stunned) + option = 7; // purr of doom + else if (bin_range == 2 && hunter.is_stunned && !blocked) + { + option = directionCheck(hunter, kats[i]); + blocked = true; // make sure kat isnt blocked + } + else + { + option = 1 + rand() % 4; + blocked = false; // reset blocked since it moved + } + } + else + // generate random number for stupid kat + option = 1 + rand() % 7; + + + // set coordinates for this kat to bin + bin_y = kats[i].y; + bin_x = kats[i].x; + + // decide what cat will do + switch ( option ) + { + case 1: + // up + bin_y--; + break; + case 2: + // down + bin_y++; + break; + case 3: + // left + bin_x--; + break; + case 4: + // right + bin_x++; + break; + case 5: // creating another case will higher the chance of stupid kats attacking + case 6: + // eyes of submission + submission = true; + break; + case 7: + // purr of doom + purr = true; + break; + default: + break; + } + + // if coordinates have changed and there is an empty space move + if ( (bin_y != (unsigned)kats[i].y || bin_x != (unsigned)kats[i].x) ) + { + if (board[bin_y][bin_x] == EMPTY_C) + { + // put empty space in current space + board[kats[i].y][kats[i].x] = EMPTY_C; + + // move kat + kats[i].y = bin_y; + kats[i].x = bin_x; + + // put kat in new space + board[kats[i].y][kats[i].x] = kats[i].KATS_C; + + // make action success + action_success = true; + } + + // reset values + bin_y = 0; + bin_x = 0; + } + else if (submission) + { + // pull range + bin_range = rangeCheck(board, kats[i].y, kats[i].x, bin_y, bin_x, hunter.HUNTER_C); + + // check to see if hunter is in range + if (bin_range == 1) + { + // if hunter has glasses on cut chances in half + if (hunter.has_glasses) + chance = EYES_SUBMISSION / 2; + else + chance = EYES_SUBMISSION; + + // check to see if attack is successful + if ( success(chance) ) + { + // tell user kat attacked + cout << "Kat attacks with Eyes of Submission!!" << endl; + + con.color(12); // change color + if (hunter.has_glasses) + { + cout << "Reflective Glasses were ineffective and Kat was still successful..." << endl; + } + else + { + cout << "Kat attack was successful and you've lost one tuna..." << endl; + } + con.color(15); + + hunter.health--; // Subtract one health from hunter + + // ask user to press enter + cout << "Press enter to continue..." << endl << endl; + while ((unsigned)getch() != ENTER); + } + else + { + if (hunter.has_glasses) + { + con.color(10); + cout << "Reflective Glasses protected you from the attack!" << endl; + con.color(15); + + // ask user to press enter + cout << "Press enter to continue..." << endl << endl; + while ((unsigned)getch() != ENTER); + } + } + } + + // reset submission + submission = false; + + // reset values + bin_y = 0; + bin_x = 0; + bin_range = 0; + chance = 0.0; + + // make action success + action_success = true; // action is always successful whether or not it is in range + } + else if (purr) + { + // pull range + bin_range = rangeCheck(board, kats[i].y, kats[i].x, bin_y, bin_x, hunter.HUNTER_C); + + // check to see if he is within range + if ( (bin_range == 1 || bin_range == 2) && !hunter.is_stunned) // check to see if hunter isn't already stunned + { + // if hunter has glasses on cut chances in half + if (hunter.has_muffs) + chance = PURRS_DOOM / 2; + else + chance = PURRS_DOOM; + + if ( success(chance) ) + { + // tell user kat attacked + cout << "Kat attacks with Purr of Doom!!" << endl; + + con.color(12); // change color + if (hunter.has_muffs) + { + cout << "Earmuffs of Happiness were ineffective and Kat was still successful..." << endl; + } + else + { + cout << "Kat attack was successful and you've been stunned for a turn..." << endl; + } + con.color(15); + + hunter.is_stunned = true; // stun hunter + + // ask user to press enter + cout << "Press enter to continue..." << endl << endl; + while ((unsigned)getch() != ENTER); + } + else + { + if (hunter.has_muffs) + { + con.color(10); + cout << "Earmuffs of Happiness protected you from the attack!" << endl; + con.color(15); + + // ask user to press enter + cout << "Press enter to continue..." << endl << endl; + while ((unsigned)getch() != ENTER); + } + } + } + + // reset submission + purr = false; + + // reset values + bin_y = 0; + bin_x = 0; + bin_range = 0; + chance = 0.0; + + // make action success + action_success = true; // action is always successful whether or not it is in range + } + + } + } + + // go back to main + return; +} + +bool won(Cat_t kats[]) +{ + // variable declarations + unsigned int kaptured = 0; + + // check to see if they are kaptured + for (unsigned int i = 0; i < KATS; i++) + { + if (kats[i].is_kaptured) + { + kaptured++; + } + } + + // checkk to see if won + if (kaptured == KATS) + return true; + else + return false; +} + +unsigned int directionCheck(const Human_t hunter, const Cat_t kat) +{ + // variables declaration + int bin_y = 0; + int bin_x = 0; + + // check distance + bin_y = kat.y - hunter.y; + bin_x = kat.x - hunter.x; + + // check to see whether y or x have a greater gap + if ( abs(bin_y) > abs(bin_x) ) + { + if (bin_y > 0) + return 1; // up + if (bin_y < 0) + return 2; // down + } + else + { + if (bin_x > 0) + return 3; // left + if (bin_x < 0) + return 4; // right + } + + return 0; +} diff --git a/music.wav b/music.wav new file mode 100644 index 0000000..24f7a6b Binary files /dev/null and b/music.wav differ