From c6e7ed22bdf9a39a6353b9daf96cfe67d053c17c Mon Sep 17 00:00:00 2001 From: KRUGSON Date: Wed, 8 Feb 2023 14:51:55 +0100 Subject: [PATCH] refactoring: improved map output&input handl. shop --- src/c/commands.c | 6 +- src/c/main | Bin 0 -> 27120 bytes src/c/main.c | 13 +- src/c/print_helper.c | 61 ++++++-- src/c/print_helper.h | 4 + src/c/shop.c | 223 ++++++++++++++++++------------ src/content/game_instructions.txt | 1 + test/c/test_commands.c | 2 +- 8 files changed, 194 insertions(+), 116 deletions(-) create mode 100755 src/c/main diff --git a/src/c/commands.c b/src/c/commands.c index 7b7eeff..b01b2de 100644 --- a/src/c/commands.c +++ b/src/c/commands.c @@ -13,17 +13,17 @@ char* getPossibleCommands(Room r, int playerPosition) strcpy(msg, ""); //assign char (string) that no leading zero result if (playerPosition > 0) { - strcat(msg, "You can move south from here\n"); + strcat(msg, "> You can move south from here\n"); } if (playerPosition < mapMax - 1) { - strcat(msg, "You can move north from here\n"); + strcat(msg, "> You can move north from here\n"); } if (r.shopAvailable == 1) { - strcat(msg, "You can call 'shop' to buy items.\n"); + strcat(msg, "> You can call 'shop' to buy items.\n"); } return msg; diff --git a/src/c/main b/src/c/main new file mode 100755 index 0000000000000000000000000000000000000000..46cb679f7c10d295e623952b505d70dc8435c790 GIT binary patch literal 27120 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 playerPosition) @@ -233,16 +232,6 @@ void printStatus() if (lastPlayerPosition != playerPosition || lastPlayerPosition == playerPosition || playerPosition == 0 && inputCounter == 0) { - printf("\n\n################################################################################\n"); - - printf("--> %s <--\n", moveMessage); - printf("%s\n", actualRoom.nameRoom); - printf("%s\n", actualRoom.msgRoom); - printf("\n"); - - char *possibleCommands = malloc(sizeof(char) * (500)); - possibleCommands = getPossibleCommands(map[playerPosition], playerPosition); - printf("%s", possibleCommands); - free(possibleCommands); + printRoomStatus(moveMessage, map[playerPosition], playerPosition); } } \ No newline at end of file diff --git a/src/c/print_helper.c b/src/c/print_helper.c index 2a07bd0..9907a72 100644 --- a/src/c/print_helper.c +++ b/src/c/print_helper.c @@ -5,6 +5,7 @@ #include #include "print_helper.h" +#include "commands.h" char *append(const char *s, char c); @@ -12,39 +13,71 @@ void printHeader(char *header) { printf("\n"); int len = strlen(header); - - //set + + // set int maxSize = len * 3 + 3; // 2 spaces | left - mid - right = 3 -> 3 times length of header char pHeader[maxSize]; - char ch = '*'; for (int i = 0; i < maxSize; i++) { pHeader[i] = ch; } - printf("%.*s\n", maxSize, pHeader); printf("%-*s %s %-*s \n", len, "", header, len, ""); printf("%.*s\n", maxSize, pHeader); - } void printItem(char *header, char *item, int itemID, int itemPrice) { int len = strlen(header); - int maxSizeForItem = (len * 3 + 3)-10; - + int maxSizeForItem = (len * 3 + 3) - 10; + printf("%-*d %-*s %*d$ \n", 2, itemID, maxSizeForItem, item, 5, itemPrice); } -char *append(const char *s, char c) +void printRoomStatus(char *moveMessage, Room currentRoom, int playerPosition) { - int len = strlen(s); - char buf[len + 2]; - strcpy(buf, s); - buf[len] = c; - buf[len + 1] = 0; - return strdup(buf); + + int len = strlen(moveMessage); + + int maxSizeRoomStatus = 60; // 2 spaces | left - mid - right = 3 -> 3 times length of header + char roomStatusPlaceholder[maxSizeRoomStatus]; + + int show = maxSizeRoomStatus - len; + + int fullLine = show * 2 + len + 2; + int paddingRoomName = (fullLine - strlen(currentRoom.nameRoom)) / 2; + int paddingRoomStory = (fullLine - strlen(currentRoom.msgRoom)) / 6; + int paddingRoomStoryPlace = fullLine - (paddingRoomStory * 2) - 2; + char seperatorLine[fullLine]; + + char ch = '#'; + for (int i = 0; i < fullLine; i++) + { + roomStatusPlaceholder[i] = ch; + } + char sCh = '-'; + for (int i = 0; i < fullLine; i++) + { + seperatorLine[i] = sCh; + } + + printf("\n"); + printf("%.*s\n", fullLine, seperatorLine); + printf("%.*s %s %.*s \n", show, roomStatusPlaceholder, moveMessage, show, roomStatusPlaceholder); + printf("%.*s\n", fullLine, seperatorLine); + printf("\n"); + printf("%-*s%s %-*s \n\n", paddingRoomName, "", currentRoom.nameRoom, paddingRoomName, ""); + printf("%-*s %-*s %-*s \n\n", paddingRoomStory, "", paddingRoomStoryPlace, currentRoom.msgRoom, paddingRoomStory, ""); + printf("%.*s\n", fullLine, seperatorLine); + printf("%.*s\n", fullLine, roomStatusPlaceholder); + printf("%.*s\n\n", fullLine, seperatorLine); + + char *possibleCommands = malloc(sizeof(char) * (500)); + possibleCommands = getPossibleCommands(currentRoom, playerPosition); + printf("%s\n", possibleCommands); + free(possibleCommands); + printf("please enter what you want to do next:\n"); } diff --git a/src/c/print_helper.h b/src/c/print_helper.h index deaaddd..1d50d2d 100644 --- a/src/c/print_helper.h +++ b/src/c/print_helper.h @@ -1,7 +1,11 @@ #ifndef PRINT_HELPER_H #define PRINT_HELPER_H +#include "map.h" + void printHeader(char *header); void printItem(char *header, char *item, int itemID, int itemPrice); +void printRoomStatus(char *moveMessage, Room currentRoom, int playerPosition); + #endif \ No newline at end of file diff --git a/src/c/shop.c b/src/c/shop.c index 617b2af..fa38f96 100644 --- a/src/c/shop.c +++ b/src/c/shop.c @@ -9,141 +9,192 @@ int *openShop(Item *availableItems, Player player) { - int mode = 0; + int mode = -1; int *x = malloc(sizeof(int) * 2); - int userModeInput; - fflush(stdout); - bool selectMode = 1; - while (selectMode == 1) + char *userModeInput = malloc(sizeof(char) * 1); + do { - printf("Please type '0' for buy or '1' to sell items!\n"); - while (scanf(" %d", &userModeInput) != 1) - { - printf("Invalid [index]. Please try again: "); - fflush(stdout); - } + printf("Please type '0' for buy or '1' to sell items:\n"); + scanf(" %s", userModeInput); - if (userModeInput > 1 || userModeInput < 0) + if (strlen(userModeInput) == 1) { - printf("Invalid [index]. Please try again: "); - } - else if (userModeInput == 0) - { - mode = 0; - selectMode = 0; + if (isdigit(userModeInput[0])) + { + int check = userModeInput[0] - '0'; + if (check > 1 || check < 0) + { + printf("\nInvalid Index.\n"); + } + else if (check == 0) + { + mode = 0; + } + else if (check == 1) + { + mode = 1; + } + } + else + { + printf("\nInvalid input. Input isn't a number.\n"); + } } - else if (userModeInput == 1) + else { - mode = 1; - selectMode = 0; + printf("\nOnly ONE char is needed!\n"); } - } + } while (mode != 0 && mode != 1); - int userInput; fflush(stdout); - bool shopIsOpen = 1; + bool shopIsOpen = true; if (mode == 0) { - - while (shopIsOpen == 1) + char *userInput = malloc(sizeof(char) * 1); + do { + // header char *header = "SHOP-Items"; printHeader(header); - // printf("%-5s %-30s %5s\n", "Index", "Name", "Price"); + // items + int maxItemsShop = 0; for (int i = 0; i < 6; i++) { - //printf("%-5d %-40s %5d$\n", availableItems[i].id, availableItems[i].itemName, availableItems[i].price); + // printf("%-5d %-40s %5d$\n", availableItems[i].id, availableItems[i].itemName, availableItems[i].price); printItem(header, availableItems[i].itemName, availableItems[i].id, availableItems[i].price); + maxItemsShop += 1; } + // instruction printf("\n-> to buy items type '[index of item]' \n-> write '0' to quit the shop'\n\n"); - while (scanf(" %d", &userInput) != 1) - { - printf("Invalid [index]. Please try again: "); - fflush(stdout); - } + // input + scanf(" %s", userInput); - if (userInput > 0) - { - x[0] = mode; - x[1] = userInput; - return x; - // BUY ITEM added later -> addItemToInventory(userInput); - } - else if (userInput == 0) + bool finished = false; + // check input + if (strlen(userInput) == 1) { - shopIsOpen = 0; - printf("Enjoy your items, have a great day!\n"); - x[0] = -1; - x[1] = -1; - return x; + if (isdigit(userInput[0])) + { + int check = userInput[0] - '0'; + + if (check > maxItemsShop) // about max items index -> invalid + { + printf("\nInvalid [index]. Please try again: \n"); + } + else if (check > 0) // all available Indizes + { + shopIsOpen = false; + x[0] = mode; + x[1] = check; + return x; + } + else if (check == 0) + { + shopIsOpen = false; + printf("Enjoy your items, have a great day!\n"); + x[0] = -1; + x[1] = -1; + return x; + } + else + { + printf("Invalid [index]. Please try again. \n"); + } + } + else + { + printf("\nInvalid input. Input isn't a number.\n"); + } } else { - printf("Invalid [index]. Please try again: "); + printf("\nToo many chars entered. Only ONE char is needed. Try again!\n"); } - } - } + } while (shopIsOpen == true); + + } //end mode = 0 else if (mode == 1) { - while (shopIsOpen == 1) + + char *userInput = malloc(sizeof(char) * 1); + if (player.itemCounter > 0)//check if inventory of player is empty { - if (player.itemCounter > 0) + do { + // header char *header = "Your inventory"; - printHeader(header); - // printf("%-5s %-30s %5s\n", "Index", "Name", "Price"); + // print inventory + int maxItemsInv = 0; for (int i = 0; i < player.itemCounter; i++) { - printItem(header, player.itemInventory[i].itemName, i+1, player.itemInventory[i].price); + printItem(header, player.itemInventory[i].itemName, i + 1, player.itemInventory[i].price); + maxItemsInv += 1; } - + // instructions printf("\n-> to sell items type '[index of item]' \n-> write '0' to quit the shop'\n\n"); - while (scanf(" %d", &userInput) != 1) - { - printf("Invalid [index]. Please try again: "); - fflush(stdout); - } + // input + scanf(" %s", userInput); - if (userInput > 0) - { - x[0] = mode; - x[1] = userInput-1; //index begin on 1 because we will cancel with 0 - return x; - // BUY ITEM added later -> addItemToInventory(userInput); - } - else if (userInput == 0) + bool finished = false; + // check input + if (strlen(userInput) == 1) { - shopIsOpen = 0; - printf("Enjoy your money, have a great day!\n"); - x[0] = -1; - x[1] = -1; - return x; + if (isdigit(userInput[0])) + { + int check = userInput[0] - '0'; + if (check > maxItemsInv) // about max items index -> invalid + { + printf("\nInvalid [index]. Please try again: \n"); + } + else if (check > 0) + { + shopIsOpen = false; + x[0] = mode; + x[1] = check - 1; // index begin on 1 because we will cancel with 0 + return x; + } + else if (check == 0) + { + shopIsOpen = false; + printf("Enjoy your money, have a great day!\n"); + x[0] = -1; + x[1] = -1; + return x; + } + else + { + printf("Invalid [index]. Please try again: "); + } + } + else + { + printf("\nInvalid input. Input isn't a number.\n"); + } } else { - printf("Invalid [index]. Please try again: "); + printf("\nToo many chars entered. Only ONE char is needed. Try again!\n"); } - } - else - { - shopIsOpen = 0; - printf("*** Your inventory is empty *** \n\n"); - x[0] = -1; - x[1] = -1; - return x; - } + } while (shopIsOpen == true); + } - } + else //when inventory of player is empty + { + printf("*** Your inventory is empty *** \n\n"); + x[0] = -1; + x[1] = -1; + return x; + } + + }//end mode = 1 - x[0] = -1; - return x; } \ No newline at end of file diff --git a/src/content/game_instructions.txt b/src/content/game_instructions.txt index e089751..10eea1c 100644 --- a/src/content/game_instructions.txt +++ b/src/content/game_instructions.txt @@ -27,6 +27,7 @@ enter "south" to go south alltime commands: - 'inventory' -> will show your items that you have bought or found () +- 'commands' -> to show available comamnds list from this spot special commands (not available at any time during the game): - 'shop' -> opens the shop where you can buy or sell items diff --git a/test/c/test_commands.c b/test/c/test_commands.c index aa20fa0..052a6cb 100644 --- a/test/c/test_commands.c +++ b/test/c/test_commands.c @@ -20,7 +20,7 @@ void test_commands(void) Room* mapData; mapData = getMap("./src/content/game.map"); int playerPosition = 3; //last player position in north - so you can only move to south - char* expectedString = "You can move south from here\n"; + char* expectedString = "> You can move south from here\n"; /* act */ // Die Funktion wird ausgeführt