#include #include #include #include //values below control random item/customer selections, change for debugging (illegal items only 7-9, default 0-9) #define ITEM_LOWER_BOUND 0 #define ITEM_UPPER_BOUND 9 #define CUSTOMER_LOWER_BOUND 0 #define CUSTOMER_UPPER_BOUND 9 //values below control the police random chances, out of a 100 #define POLICE_SHOOT_SUCCESS 20 #define POLICE_DECLINE_SUCCESS 50 //values below control the police fines, and when they will get suspicous or attempt to arrest the player #define POLICE_FINE_NORMAL 400 #define POLICE_FINE_INCREASE 100 #define POLICE_FINE_WARRANT 600 #define POLICE_WARNING 1 //warn at X amount of illegal items sold #define POLICE_ARREST 3 //attempt arrest at X amount of illegal items sold #define POLICE_WARRANT 4 //execute arrest with warrant at X amount of illegal items sold //values below control how the player starts the game, default is 100 gold and 1 banana #define PLAYER_STARTING_MONEY 100 struct gameItem { char itemName[10]; int itemCurrentItemPrice; int itemStartingPrice; int itemWiggleRoom; bool itemInInventory; }; struct gameCustomer { char customerName[10]; int customerWiggleRoom; //should be a randomly generated number bool customerRecentlyDoneDeal; }; struct gamePlayer { char playerName[10]; int playerScore; int playerMoney; int totalItemsSold; int illegalItemsSold; bool warrantForArrest; bool gameForceEnd; bool playerNotified; bool gameKilled; }; struct gameItem item[10] = { {"Banana", 5, 5, 2, 1}, {"Music CD", 10, 10, 5, 0}, {"Book", 25, 25, 10, 0}, {"Jacket", 50, 50, 20, 0}, {"Headphones", 150, 150, 20, 0}, {"TV", 400, 400, 20, 0}, {"Smartphone", 0, 1200, 0, 0}, //special items {"Ink", 65, 65, 35, 0}, {"Weed", 12, 12, 60, 0}, {"Crypto", 150, 100, 500, 0} }; struct gameCustomer customer[10] = { {"George", 0, false}, {"Mandy", 0, false}, {"Teo", 0,false}, {"Benji", 0, false}, {"Xavier", 0, false}, {"Joey", 0, false}, {"Kurt", 0, false}, {"Armando", 0, false}, {"Nick", 0, false}, {"Shelly", 0, false} }; struct gamePlayer player; void initCustomers() { srand((unsigned int) time(NULL)); for (int i = 0; i < 10; i++) { customer[i].customerWiggleRoom = rand() % 100 + 1; } } void debugInfo() { for (int i = 0; i < 10; i++) { printf("%s\n", customer[i].customerName); printf("%d\n", customer[i].customerWiggleRoom); printf("%d\n", customer[i].customerRecentlyDoneDeal); } for (int i = 0; i < 10; i++) { printf("%s\n", item[i].itemName); printf("%d\n", item[i].itemCurrentItemPrice); printf("%d\n", item[i].itemStartingPrice); printf("%d\n", item[i].itemWiggleRoom); } } void gameIntro() { printf("Welcome to a game about buying and selling items.\n"); printf("It's simple, buy items and sell them to your customers for a profit.\n"); printf("The game ends after your chosen amount of turns and you get a score!\n"); printf("Please enter your player name (Max 10 characters)\n"); printf("Name: "); scanf("%s", &player.playerName); player.playerMoney = PLAYER_STARTING_MONEY; printf("You start with %d gold and 1 %s\n", player.playerMoney, item->itemName); } void printStats() { printf("Name: %s\nGold: %d\n", player.playerName, player.playerMoney); } void printInventory() { printf("Inventory:\n"); for (int i = 0; i < 10; i++) { if (item[i].itemInInventory) { printf("* %s", item[i].itemName); printf("\n"); } } } void printItems() { int busnPrice; for (int i = 0; i < 10; i++) { busnPrice = item[i].itemStartingPrice / 1.5; printf("(%d) %s (%d Gold)\n", i, item[i].itemName, busnPrice); } } bool buyItem(int itemNumber) { int busnItemPrice = item[itemNumber].itemStartingPrice / 1.5; if (!item[itemNumber].itemInInventory && (player.playerMoney >= busnItemPrice)) { item[itemNumber].itemInInventory = true; player.playerMoney -= busnItemPrice; return true; } else { return false; } } void buyItems() { printf("What item would you like to buy? Type X to exit\n"); printf("Current list of items:\n"); printItems(); while (true) { printf("Selection: "); while (getchar() != '\n'); int selection = getchar(); if (selection == 'X' || selection == 'x') { return; } if (selection >= '0' && selection <= '9') { int index = selection - '0'; if(buyItem(index)) { printf("Item bought\n"); } else { printf("You already have this item or you can't afford it\n"); } } } } bool checkForItem(int itemPicked) { if (item[itemPicked].itemInInventory == true) { return true; } else { return false; } } void policeAccept() { if(player.warrantForArrest) { player.playerMoney -= POLICE_FINE_WARRANT; printf("You were arrested by the police and issued a hefty %d gold fine\n", POLICE_FINE_WARRANT); } else { player.playerMoney -= POLICE_FINE_NORMAL; printf("You were arrested by the police and issued a %d gold fine\n", POLICE_FINE_NORMAL); } player.illegalItemsSold = 0; } void policeDecline() { int randomness = rand() % 100 + 1; if (randomness > POLICE_DECLINE_SUCCESS) { printf("You have been arrested by the police and have been fined %d gold, and an additional %d gold for resisting arrest\n", POLICE_FINE_NORMAL, POLICE_FINE_INCREASE); player.playerMoney -= (POLICE_FINE_NORMAL + POLICE_FINE_INCREASE); player.illegalItemsSold = 0; return; } else { printf("Alright then, since we have no evidence we will get a warrant\n"); player.warrantForArrest = true; return; } } void policeShoot() { int randomness = rand() % 100 + 1; if (randomness > POLICE_SHOOT_SUCCESS) { printf("You were shot and killed by the police\n"); player.gameForceEnd = true; player.gameKilled = true; return; } else { printf("You shot and killed the police, you escaped this time\n"); player.illegalItemsSold = 0; return; } } void policeUI() { printf("A: Accept\nD: Decline\nS: Shoot Police\n"); while (true) { printf("Selection: "); while (getchar() != '\n'); int selection = getchar(); switch (selection) { case 'A': policeAccept(); return; case 'D': policeDecline(); return; case 'S': policeShoot(); return; } } } void warrantUI() { printf("A: Accept\nS: Shoot Police\n"); while (true) { printf("Selection: "); while (getchar() != '\n'); int selection = getchar(); switch (selection) { case 'A': policeAccept(); player.warrantForArrest = false; return; case 'S': policeShoot(); player.warrantForArrest = false; return; } } } void checkPolice() { if (player.warrantForArrest && player.illegalItemsSold >= POLICE_WARRANT) { printf("Police: %s, WE HAVE A WARRANT FOR YOUR ARREST. PUT YOUR HANDS BEHIND YOUR BACK AND INTERLOCK YOUR FINGERS\n", player.playerName); warrantUI(); return; } if (player.illegalItemsSold == POLICE_WARNING && player.playerNotified == false) { printf("You have sold an illegal item, if you keep this up the police might start asking questions\n"); player.playerNotified = true; } else if (player.illegalItemsSold >= POLICE_ARREST && player.warrantForArrest == false) { printf("Police: You seem to be selling contraband, you are under arrest!\n"); policeUI(); } } void checkMoney() { if (player.playerMoney <= 0) { printf("You have no money, you lose unless you can sell your inventory\n"); player.playerMoney = 0; player.gameForceEnd = true; } else { player.gameForceEnd = false; } } int gameUI(int itemPicked) { printf("A: Accept\nN: Negotiate\nD: Decline\nS: Print Stats\nI: Print Inventory\nB: Buy Items\n"); while (true) { printf("Selection: "); while (getchar() != '\n'); int selection = getchar(); switch (selection) { case 'A': if (checkForItem(itemPicked)) { return 1; } else { printf("You don't have this item, buy it with B\n"); break; } case 'N': if (checkForItem(itemPicked)) { return 2; } else { printf("You don't have this item, buy it with B\n"); break; } case 'D': return 3; case 'S': printStats(); printf("A: Accept\nN: Negotiate\nD: Decline\nS: Print Stats\nI: Print Inventory\nB: Buy Items\n"); break; case 'I': printInventory(); printf("A: Accept\nN: Negotiate\nD: Decline\nS: Print Stats\nI: Print Inventory\nB: Buy Items\n"); break; case 'B': buyItems(); printf("A: Accept\nN: Negotiate\nD: Decline\nS: Print Stats\nI: Print Inventory\nB: Buy Items\n"); break; } } } bool checkCustomerWiggle(int potNewItemPrice, int customerPicked, int itemPicked) { int randomness = rand() % 100 + 1; float wiggleness = (float)randomness / (float)customer[customerPicked].customerWiggleRoom; float negotionness = ((float)potNewItemPrice - (float)item[itemPicked].itemCurrentItemPrice) / (float)item[itemPicked].itemWiggleRoom; if ((potNewItemPrice - item[itemPicked].itemCurrentItemPrice) <= 0) { item[itemPicked].itemCurrentItemPrice = potNewItemPrice; return true; } else if (wiggleness <= 1 && negotionness <= 1) { item[itemPicked].itemCurrentItemPrice = potNewItemPrice; return true; } else { return false; } } void sellItem(int itemPicked) { player.playerMoney += item[itemPicked].itemCurrentItemPrice; player.playerScore++; item[itemPicked].itemInInventory = false; player.totalItemsSold++; printf("Sold!\n\n"); if (itemPicked >= 7) { player.illegalItemsSold++; } } void displayCustomerWiggleRoom(int customerPicked) { printf("Customer Wiggle Room: "); if(customer[customerPicked].customerWiggleRoom <= 25) { printf("*\n"); } else if (customer[customerPicked].customerWiggleRoom <= 50) { printf("**\n"); } else if (customer[customerPicked].customerWiggleRoom <= 75) { printf("***\n"); } else if (customer[customerPicked].customerWiggleRoom <= 100) { printf("****\n"); } } void negotiateItem(int itemPicked, int customerPicked) { int potNewItemPrice; printf("%s: Aight, what are we talking?\n", customer[customerPicked].customerName); displayCustomerWiggleRoom(customerPicked); printf("Enter desired item price: "); scanf("%d", &potNewItemPrice); if (checkCustomerWiggle(potNewItemPrice, customerPicked, itemPicked)) { player.playerMoney += item[itemPicked].itemCurrentItemPrice; player.playerScore += 2; item[itemPicked].itemInInventory = false; player.totalItemsSold++; printf("Sold!\n\n"); if (itemPicked >= 7) { player.illegalItemsSold++; } } else { printf("%s: Nah, think I'll pass\n\n", customer[customerPicked].customerName); if(player.playerScore != 0) { player.playerScore -= 1; } } } void gameTurn() { checkPolice(); if (player.gameKilled) { return; } checkMoney(); int itemPicked = rand() % (ITEM_UPPER_BOUND - ITEM_LOWER_BOUND + 1) + ITEM_LOWER_BOUND; int customerPicked = rand() % (CUSTOMER_UPPER_BOUND - CUSTOMER_LOWER_BOUND + 1) + CUSTOMER_LOWER_BOUND; item[itemPicked].itemCurrentItemPrice = item[itemPicked].itemStartingPrice; //reset item prices for negotiation; stupid solution printf("%s: I need %s, willing to pay %d gold for it.\n", customer[customerPicked].customerName, item[itemPicked].itemName, item[itemPicked].itemCurrentItemPrice); int selection = gameUI(itemPicked); switch (selection) { case 1: sellItem(itemPicked); break; case 2: negotiateItem(itemPicked, customerPicked); break; case 3: printf("%s: Alright then, maybe some other time\n\n", customer[customerPicked].customerName); break; } } int turnSelector() { printf("Please select amount of turns: "); int turns; scanf("%d", &turns); return turns; } void printExtStats() { printf("Name: %s\nGold: %d\nScore: %d\nTotal Items Sold: %d\n", player.playerName, player.playerMoney, player.playerScore, player.totalItemsSold); } void gameEnd(int turns) { printf("Game End!\n"); printf("Total turns played: %d\n", turns); printf("Player Stats:\n"); printExtStats(); } int main() { initCustomers(); gameIntro(); int turns; int numOfTurns = turnSelector(); for (turns = 0; turns < numOfTurns; turns++) { if (player.gameForceEnd) { break; } else { gameTurn(); } } gameEnd(turns); return 0; }