diff --git a/data/07-05-2024/item_inventory.csv b/data/07-05-2024/item_inventory.csv new file mode 100644 index 0000000..2223bdc --- /dev/null +++ b/data/07-05-2024/item_inventory.csv @@ -0,0 +1,3 @@ +user_id;type;quantity + + diff --git a/data/07-05-2024/item_shop.csv b/data/07-05-2024/item_shop.csv new file mode 100644 index 0000000..e273dab --- /dev/null +++ b/data/07-05-2024/item_shop.csv @@ -0,0 +1,3 @@ +type;stock;price + + diff --git a/data/07-05-2024/monster.csv b/data/07-05-2024/monster.csv new file mode 100644 index 0000000..a83e4d0 --- /dev/null +++ b/data/07-05-2024/monster.csv @@ -0,0 +1,3 @@ +id;type;atk_power;def_power;hp + + diff --git a/data/07-05-2024/monster_inventory.csv b/data/07-05-2024/monster_inventory.csv new file mode 100644 index 0000000..422d913 --- /dev/null +++ b/data/07-05-2024/monster_inventory.csv @@ -0,0 +1,3 @@ +user_id;monster_id;level + + diff --git a/data/07-05-2024/monster_shop.csv b/data/07-05-2024/monster_shop.csv new file mode 100644 index 0000000..ac4777a --- /dev/null +++ b/data/07-05-2024/monster_shop.csv @@ -0,0 +1,4 @@ +monster_id;stock;price +1;10;500 +2;5;700 +3;3;1000 \ No newline at end of file diff --git a/data/07-05-2024/user.csv b/data/07-05-2024/user.csv new file mode 100644 index 0000000..d099b76 --- /dev/null +++ b/data/07-05-2024/user.csv @@ -0,0 +1,10 @@ +id;username;password;role;oc +1;bill_2231;fsdgdrgh;agent;0 +2;bill_2232;fsgxdgb;agent;0 +3;bill_2233;cvhg;agent;0 +4;bill_2234;dfhg;agent;0 +5;bill_2235;fsdgdfh;agent;0 +6;bill_2236;dfhgyf;agent;0 +7;bill_2237;dhfghg;agent;0 +8;bill_2238;dgxfcgbd;agent;0 +9;bill_2239;fhjchcvb;agent;0 diff --git a/doc/LAPORAN TUBES DASPRO K06-H.docx.pdf b/doc/LAPORAN TUBES DASPRO K06-H.docx.pdf new file mode 100644 index 0000000..ed0efd1 Binary files /dev/null and b/doc/LAPORAN TUBES DASPRO K06-H.docx.pdf differ diff --git a/main.py b/main.py index e69de29..ad902ab 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,146 @@ +import sys +sys.path.append('src') + +# Melakukan import fungsi fungsi yang tidak dibuat dalam file main +from load import load +from login import login +from logout import logout +from register import register +from save import save +from exit import exit +from menu_and_help import menu_help +from laboratory import laboratory +from laboratory import monster_upgrade +from inventory import inventory +from battle import battle +from shop_currency import shop_currency +# from shop_management import shop_management +# from monster_management import monster_management +from arena import arena + +# Inisialisasi seluruh variabel +is_Logged_in = False +is_Playing = True +dict = load() +user_idx = 1 + +def mainhelp(idx, log_status) : + global is_Logged_in, user_idx + + menu_help(dict['user'], idx, dict['user'][idx][1], log_status) + cmd_help = (int(input("\n>>> Pilih fungsi : "))) + + if not log_status : + if cmd_help == 1 : + is_Logged_in, user_idx = login(dict['user']) + + elif cmd_help == 2 : + register(dict['user']) + save(dict) + + elif dict['user'][idx][3] == "agent" and log_status: + if cmd_help == 1 : + logout(dict['user']) + is_Logged_in = False + user_idx = 1 + + elif cmd_help == 2 : + inventory(dict['item_inventory'], dict['monster_inventory'], dict['monster'], dict['user'][user_idx][4], dict['user'][user_idx][0]) + + elif cmd_help == 3 : + laboratory(dict['monster_inventory'], dict['monster'], dict['user'][idx][4], dict['user'][user_idx][0], dict['user']) + save(dict) + + elif cmd_help == 4 : + battle(dict, user_idx-1) + + elif cmd_help == 5 : + arena (dict, user_idx-1) + + elif cmd_help == 6 : + shop_currency(dict, user_idx-1) +#================================================================================================== + else : + # Kalau role adalah admin + if cmd_help == 1 : + logout(dict['user']) + is_Logged_in = False + user_idx = 1 + + # elif cmd_help == 2 : + # shop_management(dict['monster_inventory'], dict['item_inventory'], dict['monster_shop'], dict['item_shop']) + + # elif cmd_help == 3 : + # monster_management(dict) + +while is_Playing : + if dict is not None : + if not is_Logged_in : + print("1. Login") + print("2. Register") + print("3. Help") + command = int(input((">>> Pilih command yang akan kamu pilih : "))) + # Meminta pengguna untuk memberikan input berupa nilai 1/2/3 sesuai keterangan + if command == 1 : + is_Logged_in, user_idx = login(dict['user']) + + # Akan menjalankan fungsi login apabila pengguna memberikan input nilai 1 + + elif command == 2 : + register(dict['user'], dict['item_inventory'], dict['monster_inventory']) + save(dict) + # Akan menjalankan fungsi register apabila pengguna memberikan input nilai 2 + # Selanjutnya akan menjalankan fungsi save untuk menyimpan informasi hasil register + + elif command == 3 : + mainhelp(user_idx, is_Logged_in) + + while command != 1 and command != 2 and command != 3 : + # Akan melakukan pengulangan ketika command tidak tersedia dalam pilihan + print ("Command tidak tersedia.") + command = int(input(">>> Pilih command yang akan kamu pilih : ")) + print("1. Login") + print("2. Register") + print("3. Help") + if command == 1 : + is_Logged_in, user_idx = login(dict['user']) + + elif command == 2 : + register(dict['user'], dict['item_inventory'], dict['monster_inventory']) + save(dict) + + elif command == 3 : + mainhelp(user_idx, is_Logged_in) + + print("\nLoading...") + + print("\nMasukkan command \"Help\" untuk daftar command yang dapat kamu panggil.") + print("Masukkan command \"Exit\" untuk keluar dari program.") + + cmd_main = input("\n >>> Masukkan command : ").lower() + if cmd_main == "help" : + mainhelp(user_idx, is_Logged_in) + + elif cmd_main == "exit" : + print ("\nTerima kasih!") + print ("Sampai jumpa.") + print ("\n") + exit(dict) + is_Playing = False + + while cmd_main != "exit" and cmd_main != "help" : + print ("Loading...") + print ("\nCommand tidak tersedia.") + print ("Masukkan command kembali.") + print("\nMasukkan command \"Help\" untuk daftar command yang dapat kamu panggil.") + print("Masukkan command \"Exit\" untuk keluar dari program.") + cmd_main = input("\n >>> Masukkan command : ").lower() + if cmd_main == "help" : + mainhelp(user_idx, is_Logged_in) +#================================================================================================== + elif cmd_main == "exit" : + print ("\nTerima kasih!") + print ("Sampai jumpa.") + print("\n") + exit(dict) + is_Playing = False diff --git a/src/arena.py b/src/arena.py new file mode 100644 index 0000000..49581b3 --- /dev/null +++ b/src/arena.py @@ -0,0 +1,289 @@ +import os +from rng import random_uniform_sample +def toInteger(matrix): + for i in range (len(matrix)): + for j in range (len(matrix[i])): + if is_digit(str(matrix[i][j])): + matrix[i][j] = int(matrix[i][j]) + return matrix + +def is_digit(word): + result = True + for letter in word: + if not(47 < ord(letter) < 58): + result = False + break + return result + +def arena(data, user_id): + monster = toInteger(data['monster']) + monster_inventory = toInteger(data['monster_inventory']) + item_inventory = toInteger(data['item_inventory']) + + popped_monster_idx = [] + user_monster = [] + for i in range (1, len(monster_inventory)): + if monster_inventory[i][0] == user_id: + popped_monster_idx.append(i) + monster_id = monster_inventory[i][1] + level = monster_inventory[i][2] + type_monster = monster[monster_id][1] + atk_power = monster[monster_id][2] + def_power = monster[monster_id][3] + hp = monster[monster_id][4] + user_monster_i = { + "monster_id" : monster_id, + "level" : level, + "type_monster" : type_monster, + "atk_power" : atk_power * (100 + (level - 1) * 10) / 100, + "def_power" : def_power * (100 + (level - 1) * 10) / 100, + "hp" : hp * (100 + (level - 1) * 10) / 100, + "hp_normal" : hp * (100 + (level - 1) * 10) / 100 + } + user_monster.append(user_monster_i) + + popped_item_idx = [] + user_item = [] + for i in range (1, len(item_inventory)): + if item_inventory[i][0] == user_id: + popped_item_idx.append(i) + user_item_i = { + "type": item_inventory[i][1], + "quantity": item_inventory[i][2] + } + if user_item_i["type"] == "Strength Potion": + user_item_i["efect"] = "Increases ATK Power" + user_item_i["message1"] = "Setelah meminum ramuan ini, aura kekuatan terlihat mengelilingi " + user_item_i["message2"] = " dan gerakannya menjadi lebih cepat dan mematikan." + elif user_item_i["type"] == "Resilience Potion": + user_item_i["efect"] = "Increases DEF Power" + user_item_i["message1"] = "Setelah meminum ramuan ini, muncul sebuah energi pelindung di sekitar " + user_item_i["message2"] = " yang membuatnya terlihat semakin tangguh dan sulit dilukai." + elif user_item_i["type"] == "Healing Potion": + user_item_i["efect"] = "Restores Health" + user_item_i["message1"] = "Setelah meminum ramuan ini, luka-luka yang ada di dalam tubuh " + user_item_i["message2"] = " sembuh dengan cepat. Dalam sekejap, dia terlihat kembali prima dan siap melanjutkan pertempuran." + user_item.append(user_item_i) + + os.system("cls") + + print("Selamat datang di Arena!!") + + print("============ MONSTER LIST ============") + for i in range (len(user_monster)): + print(f"{i+1}. {user_monster[i]['type_monster']}") + + choosen_monster_id = 0 + while True: + choosen_monster_id = int(input("Pilih monster untuk bertarung: ")) + if (0 < choosen_monster_id <= len(user_monster)): + break + else: + print("Pilihan nomor tidak tersedia!") + using_monster = user_monster[choosen_monster_id - 1] + + print(f""" +RAWRRR, {data["user"][user_id+1][1]} mengeluarkan monster {using_monster['type_monster']} !!! + +Name : {using_monster['type_monster']} +ATK Power : {using_monster['atk_power']} +DEF Power : {using_monster['def_power']} +HP : {using_monster['hp']} +Level : {using_monster['level']} +""") + + lanjut = input("Klik apapun untuk lanjut: ") + + stage = 1 + num = 1 + jumlah_hadiah_array = [30,50,100,170,260] + jumlah_hadiah = 0 + while True: + print(f"============= STAGE {stage} =============") + + apakah_menang = False + used_potion = { + "Strength Potion" : 0 , + "Resilience Potion" : 0, + 'Healing Potion' : 0 + } + + n = random_uniform_sample(15) + 1 + level_lawan = stage + monster_lawan = monster[n] + data_lawan = { + "monster_id" : monster_lawan[0], + "level" : level_lawan, + "type_monster" : monster_lawan[1], + "atk_power" : monster_lawan[2] * (100 + (level_lawan - 1) * 10) / 100, + "def_power" : monster_lawan[2] * (100 + (level_lawan - 1) * 10) / 100, + "hp" : monster_lawan[4] * (100 + (level_lawan - 1) * 10) / 100, + "hp_normal" : monster_lawan[4] * (100 + (level_lawan - 1) * 10) / 100 + } + + + print(f""" +RAWRRR, Monster {data_lawan["type_monster"]} telah muncul !!! + +Name : {data_lawan["type_monster"]} +ATK Power : {data_lawan["atk_power"]} +DEF Power : {data_lawan["def_power"]} +HP : {data_lawan["hp"]} +Level : {data_lawan["level"]} + """) + + + print(f""" +============ TURN {num} ({using_monster['type_monster']}) ============ +1. Attack +2. Use Potion +3. Quit +""") + turn = 0 + while True: + turn = int(input("Pilih perintah: ")) + if turn < 1 or turn > 3: + print("Perintah tidak valid!") + turn = int(input("Pilih perintah: ")) + else: + break + print("\n") + if turn == 3: + print("Anda berhasil kabur dari BATTLE!") + break + elif turn == 2: + if len(user_item) == 0: + print("Anda tidak memiliki potion dalam inventory!") + else: + potion = 0 + while True: + print("============ POTION LIST ============") + for i in range(len(user_item)): + print(f"{i+1}. {user_item[i]['type']} (Qty : {user_item[i]['quantity']}) - {user_item[i]['efect']}") + print(f"{len(user_item) + 1}. Cancel") + print("\n") + potion = int(input("Potion yang diinginkan: ")) + if potion < 1 or potion > len(user_item) + 1: + print("Potion tidak valid!") + elif potion == len(user_item) + 1: + print("Batal menggunakan potion.") + break + elif used_potion[user_item[potion - 1]["type"]] == 1 and user_item[potion - 1]['type'] != "Healing Potion": + print(f"Kamu mencoba memberikan ramuan ini kepada {using_monster['type_monster']}, namun dia menolaknya seolah-olah dia memahami ramuan tersebut sudah tidak bermanfaat lagi.") + elif user_item[potion - 1]["quantity"] == 0: + print("Wah, kamu sedang tidak memiliki ramuan ini, silahkan pilih ramuan lain!") + else: + if user_item[potion - 1]["type"] == "Strength Potion": + user_item[potion - 1]["quantity"] -= 1 + used_potion["Strength Potion"] = 1 + print(f"{user_item[potion - 1]['message1']}{using_monster['type_monster']}{user_item[potion - 1]['message2']}\n") + elif user_item[potion - 1]["type"] == "Resilience Potion": + user_item[potion - 1]["quantity"] -= 1 + used_potion["Resilience Potion"] = 1 + print(f"{user_item[potion - 1]['message1']}{using_monster['type_monster']}{user_item[potion - 1]['message2']}\n") + elif user_item[potion - 1]["type"] == "Healing Potion": + user_item[potion - 1]["quantity"] -= 1 + using_monster['hp'] = using_monster['hp_normal'] + print(f"{user_item[potion - 1]['message1']}{using_monster['type_monster']}{user_item[potion - 1]['message2']}\n") + is_did_something = 1 + break + + elif turn == 1: + if used_potion["Strength Potion"] == 1: + random_attack = random_uniform_sample(60) - 30 + attack = (using_monster['atk_power']) * (100 + random_attack) / 100 + print(f"attack yang kamu berikan {random_attack}% dari attack_power!") + attack = (attack * 1.2) + print(f"Attack bertambah 20% karena penggunaan Strength Potion: {attack}") + attack = attack * (100 - data_lawan['atk_power']) / 100 + print(f"Attack berkurang {100 - data_lawan['atk_power']}% karena DEF Power: {attack}") + data_lawan["hp"] = (data_lawan["hp"] - attack) // 1 + print(f"Sisa HP {data_lawan['type_monster']} adalah {data_lawan['hp']}") + else: + attack = using_monster['atk_power'] * (100 - data_lawan['atk_power']) / 100 + print(f"Attack berkurang {100 - data_lawan['atk_power']}% karena DEF Power: {attack}") + data_lawan["hp"] = ((data_lawan["hp"]) - attack) // 1 + if data_lawan['hp'] <= 0: + data_lawan['hp'] = 0 + print(f"Sisa HP {data_lawan['type_monster']} adalah {data_lawan['hp']}") + + if data_lawan["hp"] <= 0: + print("\n==============================================") + print(f"Selamat, Anda berhasil mengalahkan monster {data_lawan['type_monster']} !!!") + print(f"STAGED CLEARED !!! Total OC yang diperoleh pada sesi ini: {data['user'][user_id + 1][4]}") + if stage < 5: + print("Memulai stage berikutnya ...") + if stage == 5: + print("Selamat, Anda berhasil menyelesaikan seluruh stage Arena !!!") + jumlah_hadiah += jumlah_hadiah_array[stage-1] + data_lawan['hp'] = data_lawan['hp_normal'] + apakah_menang = True + break + + is_did_something = 1 + + if is_did_something == 1: + print(f"============ TURN {num} ({data_lawan['type_monster']}) ============") + if used_potion["Resilience Potion"] == 1: + random_damage = random_uniform_sample(60) - 30 + damage = int(data_lawan['atk_power']) * (100 - random_damage) / 100 + print(f"attack yang lawanmu berikan {random_damage}% dari attack_powernya!") + damage = (damage * 0.8) + print(f"Damage berkurang 20% karena penggunaan Resilience Potion: {damage}") + damage = damage * (100 - using_monster['def_power']) / 100 + print(f"Damage berkurang {100 - using_monster['def_power']}% karena DEF Power: {damage}") + using_monster['hp'] = (using_monster['hp'] - damage) // 1 + print(f"Sisa HP {using_monster['type_monster']} adalah {using_monster['hp']}") + else: + damage = int(data_lawan['atk_power']) * (100 - int(using_monster['def_power'])) / 100 + print(f"Damage berkurang {100 - using_monster['def_power']}% karena DEF Power: {damage}") + using_monster['hp'] = (using_monster['hp'] - damage) // 1 + if using_monster['hp'] <= 0: + using_monster['hp'] = 0 + print(f"Sisa HP {using_monster['type_monster']} adalah {using_monster['hp']}") + num += 1 + if using_monster['hp'] <= 0: + print(f"Yahhh, Anda dikalahkan monster {data_lawan['type_monster']}. Jangan menyerah, coba lagi !!!") + using_monster['hp'] = using_monster['hp_normal'] + print(f"GAME OVER! Sesi latihan berakhir pada stage {stage}!") + break + + lanjut = input("Klik apapun untuk lanjut: ") + + print(f""" +============== STATS ============== +Total hadiah : {jumlah_hadiah} OC +Jumlah stage : {stage} +Damage diberikan : {monster_lawan[2]} +Damage diterima : {using_monster['atk_power']} + """) + data["user"][user_id + 1][4] = int(data["user"][user_id + 1][4]) + data["user"][user_id + 1][4] += jumlah_hadiah + user_monster.pop(choosen_monster_id - 1) + user_monster.append(using_monster) + + for i in (len(popped_item_idx)-1,-1,-1): + item_inventory.pop(i) + for i in (len(popped_monster_idx) - 1,-1,-1): + monster_inventory.pop(i) + + user_item_matrixed = [] + for data in user_item: + user_item_i_matrixed = [] + user_item_i_matrixed.append(user_id) + user_item_i_matrixed.append(data["type"]) + user_item_i_matrixed.append(str(data["quantity"])) + user_item_matrixed.append(user_item_i_matrixed) + + user_monster_matrixed = [] + for data in user_monster: + user_monster_i_matrixed = [] + user_monster_i_matrixed.append(user_id) + user_monster_i_matrixed.append(data["monster_id"]) + user_monster_i_matrixed.append(str(data["level"])) + user_monster_matrixed.append(user_monster_i_matrixed) + + monster_inventory.extend(user_monster_matrixed) + item_inventory.extend(user_item_matrixed) + data["item_inventory"] = item_inventory + data["monster_inventory"] = monster_inventory diff --git a/src/battle.py b/src/battle.py new file mode 100644 index 0000000..376dcc1 --- /dev/null +++ b/src/battle.py @@ -0,0 +1,289 @@ +import os +from rng import random_uniform_sample + +def battle(data, user_id): + monster = data["monster"] + for i in range (1, len(monster)): + monster[i][0] = int(monster[i][0]) + monster[i][2] = int(monster[i][2]) + monster[i][3] = int(monster[i][3]) + monster[i][4] = int(monster[i][4]) + + monster_inventory = data["monster_inventory"] + for i in range (1, len(monster_inventory)): + monster_inventory[i][0] = int(monster_inventory[i][0]) + monster_inventory[i][1] = int(monster_inventory[i][1]) + monster_inventory[i][2] = int(monster_inventory[i][2]) + + item_inventory = data["item_inventory"] + for i in range (1, len(item_inventory)): + item_inventory[i][0] = int(item_inventory[i][0]) + item_inventory[i][2] = int(item_inventory[i][2]) + + os.system("cls") + + popped_monster_idx = [] + user_monster = [] + for i in range (1, len(monster_inventory)): + if monster_inventory[i][0] == user_id: + popped_monster_idx.append(i) + monster_id = monster_inventory[i][1] + level = monster_inventory[i][2] + type_monster = monster[monster_id][1] + atk_power = monster[monster_id][2] + def_power = monster[monster_id][3] + hp = monster[monster_id][4] + user_monster_i = { + "monster_id" : monster_id, + "level" : level, + "type_monster" : type_monster, + "atk_power" : atk_power * (100+(level - 1) * 10) / 100, + "def_power" : def_power * (100+(level - 1) * 10) / 100, + "hp" : hp * (100+(level - 1) * 10) / 100, + "hp_normal" : hp * (100+(level - 1) * 10) / 100 + } + user_monster.append(user_monster_i) + + for i in (len(popped_monster_idx) - 1,-1,-1): + monster_inventory.pop(i) + + popped_item_idx = [] + user_item = [] + for i in range (1, len(item_inventory)): + if item_inventory[i][0] == user_id: + popped_item_idx.append(i) + user_item_i = { + "type": item_inventory[i][1], + "quantity": item_inventory[i][2] + } + if user_item_i["type"] == "Strength Potion": + user_item_i["efect"] = "Increases ATK Power" + user_item_i["message1"] = "Setelah meminum ramuan ini, aura kekuatan terlihat mengelilingi " + user_item_i["message2"] = " dan gerakannya menjadi lebih cepat dan mematikan." + elif user_item_i["type"] == "Resilience Potion": + user_item_i["efect"] = "Increases DEF Power" + user_item_i["message1"] = "Setelah meminum ramuan ini, muncul sebuah energi pelindung di sekitar " + user_item_i["message2"] = " yang membuatnya terlihat semakin tangguh dan sulit dilukai." + elif user_item_i["type"] == "Healing Potion": + user_item_i["efect"] = "Restores Health" + user_item_i["message1"] = "Setelah meminum ramuan ini, luka-luka yang ada di dalam tubuh " + user_item_i["message2"] = " sembuh dengan cepat. Dalam sekejap, dia terlihat kembali prima dan siap melanjutkan pertempuran." + user_item.append(user_item_i) + for i in (len(popped_item_idx)-1,-1,-1): + item_inventory.pop(i) + + n = random_uniform_sample(15) + 1 + level_lawan = random_uniform_sample(10) + 1 + monster_lawan = monster[n] + data_lawan = { + "monster_id" : monster_lawan[0], + "level" : level_lawan, + "type_monster" : monster_lawan[1], + "atk_power" : monster_lawan[2] * (100+(level_lawan - 1) * 10) / 100, + "def_power" : monster_lawan[2] * (100+(level_lawan - 1) * 10) / 100, + "hp" : monster_lawan[4] * (100+(level_lawan - 1) * 10) / 100, + "hp_normal" : monster_lawan[4] * (100+(level_lawan - 1) * 10) / 100 + } + + print(f""" +RAWRRR, Monster {data_lawan["type_monster"]} telah muncul !!! + +Name : {data_lawan["type_monster"]} +ATK Power : {data_lawan["atk_power"]} +DEF Power : {data_lawan["def_power"]} +HP : {data_lawan["hp"]} +Level : {data_lawan["level"]} +""") + + print("============ MONSTER LIST ============") + for i in range (len(user_monster)): + print(f"{i+1}. {user_monster[i]['type_monster']}") + + choosen_monster_id = 0 + while True: + choosen_monster_id = int(input("Pilih monster untuk bertarung: ")) + if (0 < choosen_monster_id <= len(user_monster)): + break + else: + print("Pilihan nomor tidak tersedia!") + using_monster = user_monster[choosen_monster_id - 1] + + print(f""" +RAWRRR, {data["user"][user_id+1][1]} mengeluarkan monster {using_monster['type_monster']} !!! + +Name : {using_monster['type_monster']} +ATK Power : {using_monster['atk_power']} +DEF Power : {using_monster['def_power']} +HP : {using_monster['hp']} +Level : {using_monster['level']} +""") + + lanjut = input("Klik apapun untuk lanjut: ") + + num = 1 + apakah_menang = False + used_potion = { + "Strength Potion" : 0 , + "Resilience Potion" : 0, + 'Healing Potion' : 0 + } + + while True: + os.system("cls") + is_did_something = 0 + print(f""" +============================================= +AYOO LAWAN MONSTER {data_lawan["type_monster"]} !!! + +Name : {data_lawan["type_monster"]} +ATK Power : {data_lawan["atk_power"]} +DEF Power : {data_lawan["def_power"]} +HP : {data_lawan["hp"]} +Level : {data_lawan["level"]} +""") + + print(f""" +============================================== +SEMANGAT MONSTER {using_monster['type_monster']} KAMU PASTI BISA !!! + +Name : {using_monster['type_monster']} +ATK Power : {using_monster['atk_power']} +DEF Power : {using_monster['def_power']} +HP : {using_monster['hp']} +Level : {using_monster['level']} +""") + + print(f""" +============ TURN {num} ({using_monster['type_monster']}) ============ +1. Attack +2. Use Potion +3. Quit +""") + turn = 0 + while True: + turn = int(input("Pilih perintah: ")) + if turn < 1 or turn > 3: + print("Perintah tidak valid!") + turn = int(input("Pilih perintah: ")) + else: + break + print("\n") + if turn == 3: + print("Anda berhasil kabur dari BATTLE!") + break + elif turn == 2: + if len(user_item) == 0: + print("Anda tidak memiliki potion dalam inventory!") + else: + potion = 0 + while True: + print("============ POTION LIST ============") + for i in range(len(user_item)): + print(f"{i+1}. {user_item[i]['type']} (Qty : {user_item[i]['quantity']}) - {user_item[i]['efect']}") + print(f"{len(user_item) + 1}. Cancel") + print("\n") + potion = int(input("Potion yang diinginkan: ")) + if potion < 1 or potion > len(user_item) + 1: + print("Potion tidak valid!") + elif potion == len(user_item) + 1: + print("Batal menggunakan potion.") + break + elif used_potion[user_item[potion - 1]["type"]] == 1 and user_item[potion - 1]['type'] != "Healing Potion": + print(f"Kamu mencoba memberikan ramuan ini kepada {using_monster['type_monster']}, namun dia menolaknya seolah-olah dia memahami ramuan tersebut sudah tidak bermanfaat lagi.") + elif user_item[potion - 1]["quantity"] == 0: + print("Wah, kamu sedang tidak memiliki ramuan ini, silahkan pilih ramuan lain!") + else: + if user_item[potion - 1]["type"] == "Strength Potion": + user_item[potion - 1]["quantity"] -= 1 + used_potion["Strength Potion"] = 1 + print(f"{user_item[potion - 1]['message1']}{using_monster['type_monster']}{user_item[potion - 1]['message2']}\n") + elif user_item[potion - 1]["type"] == "Resilience Potion": + user_item[potion - 1]["quantity"] -= 1 + used_potion["Resilience Potion"] = 1 + print(f"{user_item[potion - 1]['message1']}{using_monster['type_monster']}{user_item[potion - 1]['message2']}\n") + elif user_item[potion - 1]["type"] == "Healing Potion": + user_item[potion - 1]["quantity"] -= 1 + using_monster['hp'] = using_monster['hp_normal'] + print(f"{user_item[potion - 1]['message1']}{using_monster['type_monster']}{user_item[potion - 1]['message2']}\n") + is_did_something = 1 + break + + elif turn == 1: + if used_potion["Strength Potion"] == 1: + random_attack = random_uniform_sample(60) - 30 + attack = (using_monster['atk_power']) * (100 + random_attack) / 100 + print(f"attack yang kamu berikan {random_attack}% dari attack_power!") + attack = (attack * 1.2) + print(f"Attack bertambah 20% karena penggunaan Strength Potion: {attack}") + attack = attack * (100 - data_lawan['atk_power']) / 100 + print(f"Attack berkurang {100 - data_lawan['atk_power']}% karena DEF Power: {attack}") + data_lawan["hp"] = (data_lawan["hp"] - attack) // 1 + print(f"Sisa HP {data_lawan['type_monster']} adalah {data_lawan['hp']}") + else: + attack = using_monster['atk_power'] * (100 - data_lawan['atk_power']) / 100 + print(f"Attack berkurang {100 - data_lawan['atk_power']}% karena DEF Power: {attack}") + data_lawan["hp"] = ((data_lawan["hp"]) - attack) // 1 + print(f"Sisa HP {data_lawan['type_monster']} adalah {data_lawan['hp']}") + + if data_lawan["hp"] <= 0: + print("\n==============================================") + print(f"Selamat, Anda berhasil mengalahkan monster {data_lawan['type_monster']} !!!") + data["user"][user_id + 1][4] = (int(data["user"][user_id][4]) + 30) + print(f"Total OC yang diperoleh: {data['user'][user_id + 1][4]}") + using_monster['level'] += 1 + print(f"{using_monster['type_monster']} berhasil naik ke level {using_monster['level'] + 1}") + print("==============================================\n") + data_lawan['hp'] = data_lawan['hp_normal'] + apakah_menang = True + break + + is_did_something = 1 + + if is_did_something == 1: + print(f"============ TURN {num} ({data_lawan['type_monster']}) ============") + if used_potion["Resilience Potion"] == 1: + random_damage = random_uniform_sample(60) - 30 + damage = (data_lawan['atk_power'])*(100 - random_damage) / 100 + print(f"attack yang lawanmu berikan {random_damage}% dari attack_powernya!") + damage = (damage * 0.8) + print(f"Damage berkurang 20% karena penggunaan Resilience Potion: {damage}") + damage = damage * (100 - using_monster['def_power']) / 100 + print(f"Damage berkurang {100 - using_monster['def_power']}% karena DEF Power: {damage}") + using_monster['hp'] = (using_monster['hp'] - damage) // 1 + print(f"Sisa HP {using_monster['type_monster']} adalah {using_monster['hp']}") + else: + damage = int(data_lawan['atk_power']) * (100 - int(using_monster['def_power'])) / 100 + print(f"Damage berkurang {100 - using_monster['def_power']}% karena DEF Power: {damage}") + using_monster['hp'] = (using_monster['hp'] - damage) // 1 + print(f"Sisa HP {using_monster['type_monster']} adalah {using_monster['hp']}") + num += 1 + if using_monster['hp'] <= 0: + print(f"Yahhh, Anda dikalahkan monster {data_lawan['type_monster']}. Jangan menyerah, coba lagi !!!") + using_monster['hp'] = using_monster['hp_normal'] + break + lanjut = input("Klik apapun untuk lanjut: ") + + user_monster.pop(choosen_monster_id - 1) + user_monster.append(using_monster) + + user_item_matrixed = [] + for data in user_item: + user_item_i_matrixed = [] + user_item_i_matrixed.append(user_id) + user_item_i_matrixed.append(data["type"]) + user_item_i_matrixed.append(str(data["quantity"])) + user_item_matrixed.append(user_item_i_matrixed) + + user_monster_matrixed = [] + for data in user_monster: + user_monster_i_matrixed = [] + user_monster_i_matrixed.append(user_id) + user_monster_i_matrixed.append(data["monster_id"]) + user_monster_i_matrixed.append(str(data["level"])) + user_monster_matrixed.append(user_monster_i_matrixed) + + monster_inventory.extend(user_monster_matrixed) + item_inventory.extend(user_item_matrixed) + data["item_inventory"] = item_inventory + data["monster_inventory"] = monster_inventory + return apakah_menang diff --git a/src/exit.py b/src/exit.py new file mode 100644 index 0000000..909383a --- /dev/null +++ b/src/exit.py @@ -0,0 +1,20 @@ +from save import save + +def exit(data): + # PROGRAM exit + + # SPESIFIKASI + # program menerima input dictionary data (yang berisi data yang akan disimpan jika user ingin menyimpannya) + # program menerima input user yesOrNo (yang berisi character) + + # KAMUS + # KAMUS VARIABEL + # yesOrNo : character (berisi nilai yang menentukan apakah data akna di-save (y), data tidak di-save (n), atau input tidak valid(selain y atau n)) + + # ALGORITMA + yesOrNo = input("Apakah Anda mau melakukan penyimpanan file yang sudah diubah? (y/n) ") # inisiasi variabel yesOrNo + if yesOrNo == "y": # pengecekan, jika yesOrNo == "y", fungsi save(data) akan dijalankan + save(data) + elif yesOrNo != "n": # pengecekan, jika yesOrNo tidak sama dengan "y" atau "n", fungsi exit(data) akan dijalankan kembali + exit(data) + # secara implisit, jika yesOrNo == "n", maka tidak ada hal yang dijalankan dan program berhenti \ No newline at end of file diff --git a/src/inventory.py b/src/inventory.py new file mode 100644 index 0000000..be9561b --- /dev/null +++ b/src/inventory.py @@ -0,0 +1,113 @@ +def cek(a, user_idx): + if a[0] == user_idx: + return True + return False + +def pot_Inventory (userinventory, user_idx): + for i in userinventory: + if i[1]=='strengthpotion' and cek(i, user_idx): + jumlahstr=i[2] + break + else : + jumlahstr = 0 + for i in userinventory: + if i[1]=='respotion' and cek(i, user_idx) : + jumlahres=i[2] + break + else : + jumlahres = 0 + for i in userinventory: + if i[1]=='healingpotion' and cek(i, user_idx): + jumlahheal=i[2] + break + else : jumlahheal = 0 + return [jumlahstr,jumlahres,jumlahheal] + +def pot_List (qty): + pot_Type = ['ATK', 'DEF', 'HEAL'] + pot_Type_2 = [] + pot_Qty =[] + for i in range (3): + if qty[i] != 0 : + pot_Type_2.append(pot_Type[i]) + pot_Qty.append(qty[i]) + return (pot_Type_2, pot_Qty) + +def monster_Id (yourmonsterdata, user_idx): + mons_Id_Array = [] + for i in yourmonsterdata: + if cek(i, user_idx): + mons_Id_Array.append(i[1]) + return mons_Id_Array + +def monster_Lv (yourmonsterdata, user_idx): + mons_Lv_Array = [] + for i in yourmonsterdata: + if cek(i, user_idx): + mons_Lv_Array.append(i[2]) + return mons_Lv_Array + +def inventory(userinventory, yourmonsterdata, monsterdata, coin, user_idx) : + print(f'jumlah OWCA coin anda saat ini : {coin}') + while True : + check = input('Silakan pilih jenis item yang ingin diketahui Anda (Monster/Item/Back): ') + if check.lower() == 'item' : + x=1 + idx = [] + j = 0 + types=[] + for i in userinventory: + if cek(i, user_idx): + if i[1] == 'Strength Potion' : + type = 'ATK potion' + elif i[1] == 'Resilience Potion' : + type = 'DEF potion' + elif i[1] == 'Healing Potion' : + type = 'HEAL potion' + else: + type = "type" + + if type != "type": + types.append(type) + idx.append(j) + print(f'{x}. Type: {type}') + x+=1 + j += 1 + + while True : + pot_Number = input('Masukkan nomor potion untuk menampilkan detail item (1/2/3/Back): ') + if pot_Number.lower() != 'back' and int(pot_Number) <= 3 : + pot_Number = int(pot_Number) + print(f'Type: {types[pot_Number-1]}') + print(f'Quantity: {userinventory[idx[pot_Number - 1]][2]}') + else : + break + + elif check.lower() == 'monster' : + y = 0 + j = 0 + idx = [] + for i in yourmonsterdata: + if cek(i, user_idx): + if i[1] != "monster_id" : + print(f"{y+1}. {monsterdata[int(i[1])][1]}") + idx.append(j) + y+=1 + j += 1 + + while True : + mons_Number = input('Masukkan nomor monster untuk menampilkan detail monster (1/2/dst/Back): ') + if mons_Number.lower() != 'back' : + mons_Number = int(mons_Number) + monsterlvl = int(yourmonsterdata[idx[mons_Number - 1]][2]) + for i in monsterdata: + if i[0]==yourmonsterdata[idx[mons_Number - 1]][1] : + print(f'Nama : {i[1]}') + print(f'ATK Power : {int(i[2])+(monsterlvl-1)*(5/100)*(int(i[2]))}') + print(f'DEF Power : {int(i[3])+(monsterlvl-1)*(5/100)*(int(i[3]))}') + print(f'HP : {int(i[4])+(monsterlvl-1)*(5/100)*(int(i[4]))}') + print(f'Level : {monsterlvl}') + else : + break + elif check.lower() == 'back' : + break diff --git a/src/laboratory.py b/src/laboratory.py new file mode 100644 index 0000000..26e8455 --- /dev/null +++ b/src/laboratory.py @@ -0,0 +1,90 @@ +def cek(a, user_idx): + if a[0] == user_idx: + return True + return False + +def monster_upgrade(listmonster, monster, idx, owca_coin): + pilihan_monster = listmonster[idx] + print(pilihan_monster) + sudah_upgrade= False + while not sudah_upgrade: + if int(pilihan_monster[2]) >= 5: + print () + print("Maaf, monster yang Anda pilih sudah memiliki level maksimum.") + print () + break + else: + upgrade_harga_arr = [300, 500, 800, 1000] + level_now = int(pilihan_monster[2]) + temp_owca = int(owca_coin) + if level_now <= 4: + upgrade_harga = upgrade_harga_arr[level_now - 1] + print(f"\n {monster[int(pilihan_monster[1])][1]} akan di-upgrade ke level {int(pilihan_monster[2]) + 1}.") + print(f"Harga untuk melakukan upgrade {monster[int(pilihan_monster[1])][1]} adalah {upgrade_harga} OC.") + if temp_owca >= upgrade_harga: + confirm = input(">>> Lanjutkan upgrade (Y/N): ") + if confirm in ['Y', 'y']: + pilihan_monster[2] = str(int(pilihan_monster[2]) + 1) + # monster_inv[monster_idx][2] = pilihan_monster[2] + temp_owca -= upgrade_harga + print(f"Selamat, {monster[int(pilihan_monster[1])][1]} berhasil di-upgrade ke level {pilihan_monster[2]}!") + sudah_upgrade = True + elif confirm in ['N', 'n']: + print("Upgrade dibatalkan.") + break + else: + print("Pilihan tidak valid. Silakan masukkan Y atau N.") + else: + print("Maaf, OC Anda tidak mencukupi untuk melakukan upgrade.") + break + else: + print("Maaf, monster sudah mencapai level maksimum.") + break + return str(temp_owca) + +def laboratory(yourmonster , monster, owca_coins, user_idx, user): + while True: + print () + print("\nSelamat datang di Lab Dokter Asep !!!\n") + print () + print("============ MONSTER LIST ============") + y = 0 + mons_list = [] + for i in yourmonster : + if cek(i, user_idx): + if i[1] != "monster_id" : + mons_list.append(i) + print(f"{y+1}. {monster[int(i[1])][1]} " ": level ", f"{i[2]}") + y+=1 + + + print("\n============ UPGRADE PRICE =back===========") + print("1. Level 1 -> Level 2: 300 OC") + print("2. Level 2 -> Level 3: 500 OC") + print("3. Level 3 -> Level 4: 800 OC") + print("4. Level 4 -> Level 5: 1000 OC") + + pilih = input(">>> Pilih monster (atau keluar): ") + if pilih == 'keluar': + print () + print ("Terima kasih sudah datang ke Lab Dokter Asep.") + print () + break + elif pilih.isdigit(): + pilih = int(pilih) + if 1 <= pilih <= len(mons_list): + owca_coins = monster_upgrade(mons_list, monster, pilih-1, owca_coins) + user[int(user_idx)+1][4] = owca_coins + else: + print("Pilihan tidak valid, silakan pilih nomor monster yang valid.") + else: + print("Pilihan tidak valid, silakan pilih nomor monster yang valid.") + +#das CONTOH +if __name__ == "__main__": + agent_inventory = [{'name': 'Chaca', 'level': 1}, + {'name': 'Pikachow', 'level': 2}, + {'name': 'Zeze', 'level': 5}] + owca_coins = 1000 + + laboratory(agent_inventory, owca_coins) diff --git a/src/load.py b/src/load.py new file mode 100644 index 0000000..f93ae2b --- /dev/null +++ b/src/load.py @@ -0,0 +1,97 @@ +import os +import argparse + +def load(): + # PROGRAM load + + # SPESIFIKASI + # Program menerima input nama folder yang akan di load menggunakan argparse + # path folder yang diinputkan disimpan dalam variabel folder_name + # Jika folder_name tidak memiliki nilai, akan diprint pesan: + # "Tidak ada nama folder yang diberikan!" + # "Usage: python main.py " + # lalu program berhenti + # Jika folder_name ada nilainya, namun tidak dapat ditemukan, akan diprint pesan: + # "Folder '{folder_name}' tidak ditemukan." + # Lalu program berhenti + # Jika folder_name ada nilainya dan dapat ditemukan folder dengan path tersebut, maka: + # akan diprint "Loading..." + # dibuat dictionary "dict" yang akan menyimpan seluruh data yang diload + # seluruh data .csv akan diconvert ke matrix dan disimpan dalan dictionary "dict" + # akan diprint "Selamat datang di program OWCA!" + # return dict + + # KAMUS + # KAMUS FUNGSI DAN PROSEDUR + def parse(file): + # SPESIFIKASI + # fungsi menerima input string "file" yang akan diubah menjadi matrix dengan ketentuan: + # submatrix dipisahkan dengan enter ("\n") + # anggota submatrix dipisahkan dengan titik koma (";") + + # KAMUS LOKAL + # matrix : matrix of string (menyimpan matrix hasil parse(file)) + # array : matrix of string (submatrix sementara yang menyimpan elemen pada satu baris) + # data : string (anggota submatrix) + + # ALGORITMA + matrix = [] # inisiasi variabel matrix + for line in file: # looping untuk setiap baris (line) pada file + if line == "99999": + pass + else: + array = [] # inisiasi variabel array + data = "" # inisiasi variabel data + for _ in line: # looping untuk setiap character pada baris (line) + if _ != ";": # pengecekan, jika _ != ";" maka _ akan ditambahkan pada string data + data += _ + else: # pengecekan, jika _== ";", string data akan ditambahkan pada array, dan nilai string data direset + array.append(data) + data = "" + data = data[:-1] + array.append(data) # data paling akhir belum di-append ke array karena di akhir baris tidak ada ";", maka ditambahkan manual setelah looping berakhir + matrix.append(array) # array ditambahkan pada matrix + return matrix # fungsi menghasilkan matrix + + # KAMUS VARIABEL + # dict : dictionary (menyimpan seluruh data yang diload dan informasi tambahan) + + dict = {} # inisiasi dict + + # serangkaian kode untuk mengambil input nama folder yang dituliskan di terminal. nama folder disimpan dalam variabel folder_name + parser = argparse.ArgumentParser(description="Load data from external files.") + parser.add_argument("folder_name", type=str, nargs="?", help="Nama folder yang berisi file penyimpanan.") + args = parser.parse_args() + folder_name = args.folder_name + + if folder_name is None: # pengecekan, jika folder_name tidak memiliki nilai, maka akan diprint pesan peringatan, lalu program berhenti. Fungsi tidak memberi output (output None) + print("Tidak ada nama folder yang diberikan!") + print("Usage: python main.py ") + return None + elif not os.path.exists(folder_name): # pengecekan, jika folder_name ada nilainya, namun tidak ada di penyimpanan, maka akan diprint pesan peringatan, lalu program berhenti. Fungsi tidak memberi output (output None) + print(f"Folder '{folder_name}' tidak ditemukan.") + return None + else: # pengecekan, jika folder_name memiliki nilai dan terdapat di penyimpanan, maka: + print("Loading...") # diprint "Loading..." + dict['folder_name'] = folder_name # variabel folder_name dicopy ke dict['folder_name'] sebagai informasi tambahan + # file user.csv diubah ke matrix dan disimpan dalam dict['user'] + with open(os.path.join(folder_name, "user.csv"), "r") as file: + dict['user'] = parse(file) + # file monster.csv diubah ke matrix dan disimpan dalam dict['monster'] + with open(os.path.join(folder_name, "monster.csv"), "r") as file: + dict['monster'] = parse(file) + # file item_inventory.csv diubah ke matrix dan disimpan dalam dict['item_inventory'] + with open(os.path.join(folder_name, "item_inventory.csv"), "r") as file: + dict['item_inventory'] = parse(file) + # file monster_inventory.csv diubah ke matrix dan disimpan dalam dict['monster_inventory'] + with open(os.path.join(folder_name, "monster_inventory.csv"), "r") as file: + dict['monster_inventory'] = parse(file) + # file monster_shop.csv diubah ke matrix dan disimpan dalam dict['monster_shop'] + with open(os.path.join(folder_name, "monster_shop.csv"), "r") as file: + dict['monster_shop'] = parse(file) + # file item_shop.csv diubah ke matrix dan disimpan dalam dict['item_shop'] + with open(os.path.join(folder_name, "item_shop.csv"), "r") as file: + dict['item_shop'] = parse(file) + + print("Selamat datang di program OWCA!") + return dict # fungsi menghasilkan dict diff --git a/src/login.py b/src/login.py new file mode 100644 index 0000000..ffdd113 --- /dev/null +++ b/src/login.py @@ -0,0 +1,26 @@ +def login(user): + print (user) + user_input = input("Username: ") + pass_input = input("Password: ") + + user_idx = 0 + user_valid = False + + for i in range(len(user)): + if user[i][1] == user_input: + user_valid = True + user_idx = i + break + + if not user_valid: + print("Username tidak terdaftar!") + return False, -1 + elif user[user_idx][2] != pass_input: + print("Password salah!") + return False, -1 + elif user[user_idx][3] == "admin" : + print(f"Selamat datang, {user_input}!") + return True, user_idx + else : + print(f"Selamat datang, Agent {user_input}!") + return True, user_idx diff --git a/src/logout.py b/src/logout.py new file mode 100644 index 0000000..c9e2b80 --- /dev/null +++ b/src/logout.py @@ -0,0 +1,9 @@ +def logout(log_status): + if not log_status: + print("Logout gagal!") + print("Anda belum login, silahkan login terlebih dahulu sebelum melakukan logout") + return True + else: + print("Logout berhasil!") + print("Silahkan login lagi jika ingin mengakses kembali program") + return False \ No newline at end of file diff --git a/src/menu_and_help.py b/src/menu_and_help.py new file mode 100644 index 0000000..d2c5177 --- /dev/null +++ b/src/menu_and_help.py @@ -0,0 +1,28 @@ +def menu_help(user, user_idx, uname, log_status): + print("=========== HELP ===========") + if not log_status: + print("Kamu belum login sebagai role apapun. Silahkan login terlebih dahulu.") + print() + print(" 1. Login: Masuk ke dalam akun yang sudah terdaftar") + print(" 2. Register: Membuat akun baru") + return + + + if user[user_idx][3] == "agent": + print(f"Halo Agent {uname}. Kamu memanggil command HELP. Kamu memilih jalan yang benar, semoga kamu tidak sesat kemudian. Berikut adalah hal-hal yang dapat kamu lakukan sekarang:") + print(f" 1. Logout: Keluar dari akun yang sedang digunakan") + print(f" 2. Inventory: Lihat OWCA-dex dan peralatanmu, Agent {uname}") + print(f" 3. Laboratory: Upgrade monster yang kamu miliki, Agent {uname}!") + print(f" 4. Battle : Ayo bertarung di Arena, Agent {uname} dan menangkan hadiahnya!") + print(f" 5. Arena : Ayo masuk ke Arena, Agent {uname} dan latih monstermu!") + print(f" 6. Shop and Currency : Ayo belanjakan OWCA-mu dengan potion dan monster di sini, Agent {uname}!") + else: + print("Selamat datang, Admin. Berikut adalah hal-hal yang dapat kamu lakukan:") + print(" 1. Logout: Keluar dari akun yang sedang digunakan") + print(" 2. Shop Management: Lakukan manajemen pada SHOP sebagai tempat jual beli peralatan Agent") + print(" 3. Monster Management: Lakukan manajemen pada SHOP untuk menambah monster") + + print() + print("Footnote:") + print(" 1. Untuk menggunakan aplikasi, silahkan masukkan nama fungsi yang terdaftar") + print(" 2. Jangan lupa untuk memasukkan input yang valid") diff --git a/src/monster_management.py b/src/monster_management.py new file mode 100644 index 0000000..02116bd --- /dev/null +++ b/src/monster_management.py @@ -0,0 +1,134 @@ +# asumsi monster di dict +monster = [ + {"ID": 1, "TYPE": "Snorlax", "ATK": 60, "DEF": 66, "HP": 43}, + {"ID": 2, "TYPE": "Pikachu", "ATK": 52, "DEF": 53, "HP": 40}, + {"ID": 3, "TYPE": "Goku", "ATK": 54, "DEF": 63, "HP": 45}, + {"ID": 4, "TYPE": "Bejita", "ATK": 46, "DEF": 47, "HP": 40}, + {"ID": 5, "TYPE": "Naruto", "ATK": 62, "DEF": 50, "HP": 29}, +] + + +# Fungsi strip() +def mstrip(str): + nstring = "" + for char in str: + if char != " ": + nstring += char + return nstring + +# Fungsi split() +def split(str, pisah): + hasil = [] + kata = '' + for char in str: + if char == pisah: + hasil.append(kata) + kata = '' + else: + kata += char + hasil.append(kata) + return hasil + +# Fungsi cek Input int atau tidak +def is_integer(s): + digits = "0123456789" + for char in s: + if char not in digits: + return False + + return True + +def id_baru(monster): + max_id = -1 + for creature in monster: + if creature["ID"] > max_id: + max_id = creature["ID"] + return max_id + 1 + +def cek_sama(nama, dict): + for row in dict: + if row["TYPE"].lower() == nama.lower(): + return False + return True + + +def monster_management(): + print () + print("SELAMAT DATANG DI DATABASE PARA MONSTER !!!") + print () + + running = True + while running == True: + print () + print("1. Tampilkan semua monster") + print("2. Tambah monster baru") + print("3. Keluar") + print () + input_1 = int(input("Pilih Aksi : ")) + print () + if input_1 == 3: + print("Selamat tinggal!") + break + elif input_1 == 1: + categories = ["ID", "TYPE", "ATK", "DEF", "HP"] + header = "" + for category in categories: + header += category + " " * (10 - len(category)) + print(header) + + print("-" * (len(header) + 5)) + + for creature in monster: + data_row = "" + for category in categories: + data_row += str(creature[category]) + " " * (10 - len(str(creature[category]))) + print(data_row) + elif input_1 == 2: + print("Memulai pembuatan monster baru...") + valid = False + while valid == False: + new_monster = input("Masukkan Type/Nama : ") + if cek_sama(new_monster, monster) == False: + print("Monster sudah terdaftar di database!") + elif new_monster == "": + print("Masukkan input yang valid") + else: valid = True + valid_2 = False + while valid_2 == False: + atk_power = str(input("Masukkan ATK Power : ")) + if atk_power == "": + print("input tidak valid, coba lagi!") + elif is_integer(atk_power) == False: + print("Masukkan input bertipe Integer, coba lagi!") + elif is_integer(atk_power) == True: + valid_2 = True + valid_3 = False + while valid_3 == False: + def_power = str(input("Masukkan DEF Power: ")) + if def_power == "": + print("input tidak valid, coba lagi!") + elif is_integer(def_power) == False: + print("Masukkan input bertipe Integer, coba lagi!") + elif is_integer(def_power) == True: + if int(def_power) < 0 or int(def_power) > 50: + print("DEF Power harus bernilai 0-50, coba lagi!") + else: + valid_3 = True + valid_4 = False + while valid_4 == False: + hp = str(input("Masukkan HP: ")) + if hp == "": + print("input tidak valid, coba lagi!") + elif is_integer(hp) == False: + print("Masukkan input bertipe intger, coba lagi!") + elif is_integer(hp) == True: + valid_4 = True + print("Name/Type | ATK Power | DEF Power | HP") + print(new_monster + " " * (12 - len(new_monster)) + " | " + atk_power + " " * (10 - len(atk_power)) + " | " + def_power + " " * (10 - len(def_power)) + " | " + hp) + inp2 = input("Tambahkan Monster ke Database (Y/N) : ") + if inp2.lower() == 'y': + new_id = id_baru(monster) + monster.append({"ID": new_id, "TYPE": new_monster, "ATK": int(atk_power), "DEF": int(def_power), "HP": int(hp)}) + print("Monster baru telah ditambahkan!") + elif inp2.lower() == 'n': + print("Monster gagal ditambahkan!") diff --git a/src/register.py b/src/register.py new file mode 100644 index 0000000..8cd46c0 --- /dev/null +++ b/src/register.py @@ -0,0 +1,118 @@ +def register(user, item_inventory, monster_inventory): + # PROGRAM register + + # SPESIFIKASI: + # program menerima array user (yang berisi data user.csv dalam bentuk matrix) + # Program menerima input user berupa username dan password. + # Username dikatakan valid jika berisi sekumpulan character alfabet, angka, underscore dan strip. + # Selanjutnya akan dilakukan proses validasi username. + # Jika username tidak valid akan ditampilkan pesan "Username hanya boleh berisi alfabet, angka, underscore, dan strip!". + # Jika username sudah digunakan sebelumnya, akan ditmapilkan pesan f"Username {uname} sudah terpakai, silakan gunakan username lain!" + # Jika benar, user dipersilahkan untuk memilih monster awal. + # Lalu, data id, username, password, role, oc akan tersimpan dalam bentuk array ke matrix user. + # nilai default: + # id : jumlah user + 1 + # role : agent + # oc : 0 + + # KAMUS + # KAMUS FUNGSI DAN PROSEDUR + def validasiUName (uname): + # SPESIFIKASI + # fungsi menerima input uname (username). Fungsi mengecek apakah uname merupakan username yang valid. Jika iya, fungsi memberikan boolean True. Jika tidak, fungsi memberikan boolean False. + + # KAMUS LOKAL + # res: bool (menunjukkan apakah uname valid atau tidak) + # x : integer (menunjukkan nilai ascii code dari _) + + # ALGORITMA + res = True # Inisiasi bool res + for _ in uname: # looping pada setiap character pada string uname + x = ord(_) # inisiasi integer x + if not(x == 45 or x == 95 or 48 <= x <= 57 or 97 <= x <= 122 or 65 <= x <= 90): # pengecekan, jika char _ tidak memenuhi syarat character username yang valid, maka res akan bernilai "false" dan looping dihentikan + res = False + break + return res # Fungsi memberi output boolean res + + def isIn (x, A): + # SPESIFIKASI + # fungsi menerima input x (tipe data bebas) dan array A (tipe data bebas), lalu funsgi akan mengecek apakah x ada di dalam array A. Jika iya, fungsi akan memberi output boolean True. Jika tidak, fungsi akan memberi output boolean False + + # KAMUS LOKAL + # res : bool (menyimpan boolean yg menyatakan apakah x ada di dalam array A) + + res = False # inisiasi variabel res + for _ in A: # looping pada setiap anggota array A + if _ == x: # pengecekan, jika _ == x, maka variabel res menjadi True, dan looping dihentikan + res = True + break + return res # fungsi memberi output res + + # KAMUS VARIABEL + # uname : string (berisi username yang diinputkan user) + # pwd : string (berisi password yang diinputkan user) + # validUname : bool (berisi boolean yg menyatakan apakan username valid atau tidak) + # dataUname : Array of string (berisi nama username yang telah tersimpan) + # numMos : integer (menyimpan input user yang merepresentasikan monster awal yang dipilih) + # Mos : string (menyimpan nama monster yang sesuai dengan id (numMos) yang diinputkan sebelumnya) + # id : integer (menyimpan nilai id dari username yang didaftarkan) + + + # ALGORITMA + uname = input("Masukkan username: ") # input username + pwd = input("Masukkan password: ") # input password + + monster_id = -1 + + validUname = validasiUName(uname) # memvalidasi username + + if validUname: # pengecekan pertama: jika username tidak valid, user diminta registerasi ulang + # menghimpun nama username yang telah dibuat + dataUname = [user[i][1] for i in range (1, len(user))] # inisiasi array dataUname + if isIn(uname, dataUname): # pengecekan, menggunakan fungsi isIn(). Jika username yg akan didaftarkan sudah terdaftar sebelumnya (uname ada dalam array dataUname), maka user akan diminta registerasi ulang. + print(f"Username {uname} sudah terpakai, silakan gunakan username lain!") + register(user, item_inventory, monster_inventory) + else: # jika username yang akan didaftarkan belum terdaftar sebelumnya, maka user dipersilakan memilih monster awal + # Memilih monster awal + print("Silakan pilih salah satu monster sebagai monster awalmu.") + print("1. Charizard") + print("2. Bulbasaur") + print("3. Aspal") + numMos = int(input("Monster pilihanmu : ")) # Inisiasi dan input variabel numMos + Mos = "" # inisiasi string Mos. Selanjutnya akan diisi dengan nama yang sesuai dengan numMos + if numMos == 1: + Mos = "Charizard" + monster_id = 3 + elif numMos == 2: + Mos = "Bulbasaur" + monster_id = 5 + elif numMos == 3: + Mos = "Aspal" + monster_id = 17 + while numMos != 1 and numMos != 2 and numMos != 3 : + print ("Monster tidak tersedia dalam pilihan.") + print("Silakan pilih salah satu monster sebagai monster awalmu.") + print("1. Charizard") + print("2. Bulbasaur") + print("3. Aspal") + numMos = int(input("Monster pilihanmu : ")) # Inisiasi dan input variabel numMos + if numMos == 1: + Mos = "Charizard" + monster_id = 3 + elif numMos == 2: + Mos = "Bulbasaur" + monster_id = 5 + elif numMos == 3: + Mos = "Aspal" + monster_id = 17 + # ditampilkan pesan selamat datang + print(f"Selamat datang Agent {uname}. Mari kita mengalahkan Dr. Asep Spakbor dengan {Mos}!") + # proses menyimpan data yang sudah diinputkan ke matrix user + user.append([str(len(dataUname) + 1), uname, pwd, "agent", "0"]) + item_inventory.append([str(len(dataUname) + 1), 'Strength Potion', '0']) + item_inventory.append([str(len(dataUname) + 1), 'Resilience Potion', '0']) + item_inventory.append([str(len(dataUname) + 1), 'Healing Potion', '0']) + monster_inventory.append([str(len(dataUname) + 1), str(monster_id), '1']) + else: # jika username tidak valid, user diminta registerasi ulang + print("Username hanya boleh berisi alfabet, angka, underscore, dan strip!") + register(user, item_inventory, monster_inventory) diff --git a/src/rng.py b/src/rng.py new file mode 100644 index 0000000..9907e78 --- /dev/null +++ b/src/rng.py @@ -0,0 +1,18 @@ +from datetime import datetime +waktu_saat_ini = datetime.now() +detik = (waktu_saat_ini - datetime(2024, 5, 17)).total_seconds()//1 +def lcg(x, a, c, m): + while True: + x = (a * x + c) % m + yield x + + +def random_uniform_sample(batas, seed=detik): + interval = [0, batas] + a, c, m = 1103515245, 12345, 2 ** 31 + bsdrand = lcg(seed, a, c, m) + + lower, upper = interval[0], interval[1] + observation = (upper - lower) * (next(bsdrand) / (2 ** 31 - 1)) + lower + + return round(observation) diff --git a/src/save.py b/src/save.py new file mode 100644 index 0000000..c60d1d5 --- /dev/null +++ b/src/save.py @@ -0,0 +1,68 @@ +import os + +def save(data): + # PROGRAM save + + # SPESIFIKASI + # menerima input data (berupa dictionary yang menyimpan seluruh data yang digunakan) + # menerima input user berupa nama folder yang akan digunakan untuk menyimpan data + # fungsi melakukan pengecekan keberadaan folder data dan folder yang diinputkan. Jika belu ada, akan dibuat terlebih dahulu + # lalu, seluruh data akan disimpan dalam file.csv masing-masing + # ditampilkan pesan: f"Berhasil menyimpan data di folder {folder_path}!" + + # KAMUS + # KAMUS FUNGSI DAN PROSEDUR + def save_csv(folder_path, type_csv, data): + # SPESIFIKASI + # prosedur menerima input: + # folder_path (menyatakan path folder yang dituju) + # type_csv (menyatakan nama file csv yang akan disimpan) + # data (matrix yang berisi data yang akan diubah ke csv format) + # I.S. file type_csv dalam folder folder_path belum menyimpan data terkini + # I.S. file type_csv dalam folder folder_path sudah menyimpan data terkini + + # KAMUS LOKAL + # file_path : string (menyimpan path untuk file yang akan disimpan) + # line : string (menyimpan satu baris yang akan dituliskan ke file.csv) + # len_data : integer (menyimpan panjang matrix data) + # len_row : integer (menyimpan panjang array data[j]) + + # ALGORITMA + file_path = os.path.join(folder_path, type_csv) # inisiasi variabel file_path + with open(file_path, "w") as file: # membuka/membuat file dengan path yang ditentukan sbelumnya (dalam mode "w" atau tulis) + len_data = len(data) # inisiasi variabel len_data + for j in range(len_data): # looping pada setiap anggota matrix data (submatrix) + line = "" # inisiasi variabel line + len_row = len(data[j]) # inisiasi variabel len_row + for i in range(len_row): # looping untuk setiap i dalam range(len_row) + line += str(data[j][i]) # string line dikonkatenasi dengan string data[row][i] + if i != len_row - 1: # pengecekan, jika i += len_row - 1, maka line akan dikonkatenasi dengan ";" + line += ";" + else: + line += "\n" + if j == len_data - 1: # pengecekan, jika j == len_data - 1, maka string line akan dikonkatenasi dengan "\n", agar pada baris terakhir dibuat baris baru yang kosong + line += "99999" + file.write(line) # line akan ditulis ke file.csv + # KAMUS VARIABEL + # folder_name : string (menyimpan input user, menyimpan folder yang dituju untuk melakukan save) + # folder_path : string (menyimpan path: data/folder_name) + + folder_name = input("Masukkan nama folder: ") # inisiasi variabel folder_name + # mengecek apakah folder data sudah ada atau belum. Jika belum ada, akan dibuat + if not os.path.exists("data"): + print("Membuat folder data...") + os.makedirs("data") + folder_path = os.path.join("data", folder_name) # inisiasi variabel folder_path + # mengecek apakah folder_path sudah ada atau belum. Jika belum ada, akan dibuat + if not os.path.exists(folder_path): + os.makedirs(folder_path) + print(f"Membuat folder {folder_path}...") + # menyimpan seluruh data ke file csv masing-masing + save_csv(folder_path, "user.csv", data["user"]) + save_csv(folder_path, "monster.csv", data["monster"]) + save_csv(folder_path, "item_inventory.csv", data["item_inventory"]) + save_csv(folder_path, "monster_inventory.csv", data["monster_inventory"]) + save_csv(folder_path, "monster_shop.csv", data["monster_shop"]) + save_csv(folder_path, "item_shop.csv", data["item_shop"]) + # ditampilkan pesan bahwa proses menyimpan data berhasil + print(f"Berhasil menyimpan data di folder {folder_path}!") diff --git a/src/shop_currency.py b/src/shop_currency.py new file mode 100644 index 0000000..6b94cdf --- /dev/null +++ b/src/shop_currency.py @@ -0,0 +1,256 @@ +import os + +def toInteger(matrix): + for i in range (len(matrix)): + for j in range (len(matrix[i])): + if is_digit(str(matrix[i][j])): + matrix[i][j] = int(matrix[i][j]) + return matrix + +def is_digit(word): + result = True + for letter in word: + if not(47 < ord(letter) < 58): + result = False + break + return result + +def isIn (x, A): + res = False # inisiasi variabel res + for _ in A: # looping pada setiap anggota array A + if _ == x: # pengecekan, jika _ == x, maka variabel res menjadi True, dan looping dihentikan + res = True + break + return res # fungsi memberi output res + +def itsIndex (x, A): + for i in range (len(A)): + if A[i] == x: + return i + +def shop_currency(data, user_id): + user = toInteger(data['user']) + monster = toInteger(data['monster']) + monster_inventory = toInteger(data['monster_inventory']) + monster_shop = toInteger(data['monster_shop']) + item_inventory = toInteger(data['item_inventory']) + item_shop = toInteger(data['item_shop']) + + # {USER INVENTORY THINGS} + popped_monster_inventory = [] + user_monster = [] + for i in range (1, len(monster_inventory)): + if monster_inventory[i][0] == user_id: + popped_monster_inventory.append(i) + id = monster_inventory[i][1] + type_ = monster[id][1] + level = monster_inventory[i][2] + user_monster_i = { + "type" : type_, + "level" : level + } + user_monster.append(user_monster_i) + + popped_user_item = [] + user_item = [] + for i in range (1, len(item_inventory)): + if item_inventory[i][0] == user_id: + popped_user_item.append(i) + type_ = item_inventory[i][1] + quantity = item_inventory[i][2] + user_item_i = { + "type" : type_, + "quantity" : quantity + } + user_item.append(user_item_i) + + username = user[user_id+1][1] + oc = user[user_id+1][4] + + user_inventory = { + "id" : user_id, + "username" : username, + "oc" : oc, + "user_monster" : user_monster, + "user_item" : user_item + } + # {AKHIR USER INVENTORY THINGS} + + # {DISPLAY MONSTER THINGS} + popped_monster_shop = [] + display_monster = [] + for i in range (1, len(monster_shop)): + popped_monster_shop.append(i) + id = monster_shop[i][0] + print(monster[id]) + stock = monster_shop[i][1] + price = monster_shop[i][2] + type_ = monster[id][1] + atk_power = monster[id][2] + def_power = monster[id][3] + hp = monster[id][4] + display_monster_i = { + "id" : id, + "stock" : stock, + "price" : price, + "type" : type_, + "atk_power" : atk_power, + "def_power" : def_power, + "hp" : hp + } + display_monster.append(display_monster_i) + # {AKHIR DISPLAY MONSTER THINGS} + + # {DISPLAY ITEM THINGS} + popped_item_shop = [] + display_item = [] + for i in range (1, len(item_shop)): + popped_item_shop.append(i) + id = i-1 + if id != 0: + type_ = item_shop[i-1][0] + stock = item_shop[i-1][1] + price = item_shop[i-1][2] + display_item_i = { + "id" : id, + "type" : type_, + "stock" : stock, + "price" : price + } + display_item.append(display_item_i) + # {AKHIR DISPLAY ITEM THINGS} + + # {MULAI PROGRAM} + os.system("cls") + print("Irasshaimase! Selamat datang di SHOP!!") + while True: + aksi = input("Mau apa (lihat/beli/keluar) :") + if aksi == "lihat": + lihat_apa = "" + while True: + lihat_apa = input("Lihat apa (monster/item): ") + if lihat_apa == "monster" or lihat_apa == "item": + break + else: + print("Inputan salah!") + + if lihat_apa == "monster": + print("ID | Type | ATK Power | DEF Power | HP | Stok | Harga") + for item in display_monster: + print(f"{item['id']} | {item['type']:<14} | {item['atk_power']:<9} | {item['def_power']:<9} | {item['hp']:<4} | {item['stock']:<4} | {item['price']:<5}") + elif lihat_apa == "item": + print("ID | Type | Stok | Harga") + for item in display_item: + print(f"{item['id']} | {item['type']:<20} | {item['stock']:<5} | {item['price']:<5}") + elif aksi == "beli": + print(f"Jumlah OWCA coinmu sekarang adalah: {user_inventory['oc']}") + beli_apa = "" + while True: + beli_apa = input("Mau beli apa? (monster/item): ") + if beli_apa == "monster" or beli_apa == "item": + break + else: + print("Inputan salah!") + if beli_apa == "monster": + id_monster_dibeli = int (input("Masukkan id monster: ")) + monster_dibeli = display_monster[id_monster_dibeli - 1] + user_monster_type = [] + for i in range (len(user_inventory["user_monster"])): + user_monster_type.append(user_inventory["user_monster"][i]["type"]) + if monster_dibeli['price'] > user_inventory['oc']: + print("OC-mu tidak cukup.") + elif isIn(monster_dibeli['type'], user_monster_type): + print(f"Monster {monster_dibeli['type']} sudah ada dalam inventory-mu! Pembelian dibatalkan.") + else: + print(f"Berhasil membeli monster: {monster_dibeli['type']}. Item sudah masuk ke inventory-mu!") + display_monster[id_monster_dibeli - 1]["stock"] -= 1 + type_monster_dibeli = { + "type" : monster_dibeli['type'], + "level" : 1 + } + user_inventory['user_monster'].append(type_monster_dibeli) + user_inventory['oc'] -= monster_dibeli['price'] + + elif beli_apa == "item": + id_item_dibeli = int(input("Masukkan id potion: ")) + jumlah_potion = int(input("Masukkan jumlah: ")) + item_dibeli = display_item[id_item_dibeli - 1] + if int(item_dibeli['price']) * jumlah_potion > int(user_inventory['oc']): + print("OC-mu tidak cukup.") + else: + print(f"Berhasil membeli item: {jumlah_potion} {item_dibeli['type']}. Item sudah masuk ke inventory-mu!") + display_item[id_item_dibeli - 1]["stock"] -= 1 + belum_tersimpan = True + for i in range (len(user_inventory['user_item'])): + if user_inventory['user_item'][i]['type'] == item_dibeli['type']: + user_inventory['user_item'][i]['quantity'] += 1 + print(user_inventory['user_item']) + belum_tersimpan = False + if belum_tersimpan: + type_item_dibeli = { + 'type' : item_dibeli['type'], + 'quantity' : 1 + } + user_inventory['user_item'].append(type_item_dibeli) + user_inventory['oc'] -= item_dibeli['price'] + + elif aksi == "keluar": + print("Mr. Yanto bilang makasih, belanja lagi ya nanti :)") + break + else: + print("Inputan salah!") + + + for i in (len(popped_user_item) - 1,-1,-1): + item_inventory.pop(i) + + for i in (len(popped_monster_inventory) - 1,-1,-1): + monster_inventory.pop(i) + + for i in (len(popped_monster_shop) - 1,-1,-1): + monster_shop.pop(i) + + for i in (len(popped_item_shop) - 1,-1,-1): + item_shop.pop(i) + + # {ITEM INVENTORY} + for i in range (len(user_inventory['user_item'])): + display_item_i = [] + display_item_i.append(user_id) + display_item_i.append(user_inventory['user_item'][i]['type']) + display_item_i.append(user_inventory['user_item'][i]['quantity']) + item_inventory.append(display_item_i) + + # {MONSTER INVENTORY} + monster_array = [] + for i in range (len(monster)): + monster_array.append(monster[i][1]) + for i in range (len(user_inventory['user_monster'])): + display_monster_i = [] + display_monster_i.append(user_id) + index = itsIndex(user_inventory['user_monster'][i]['type'], monster_array) + display_monster_i.append(index) + display_monster_i.append(user_inventory['user_monster'][i]['level']) + monster_inventory.append(display_monster_i) + + # {MONSTER SHOP} + for i in range (len(display_monster)): + display_monster_i = [] + display_monster_i.append(display_monster[i]['id']) + display_monster_i.append(display_monster[i]['stock']) + display_monster_i.append(display_monster[i]['price']) + monster_shop.append(display_monster_i) + # {ITEM SHOP} + for i in range (len(display_item)): + display_item_i = [] + display_item_i.append(display_item[i]['type']) + display_item_i.append(display_item[i]['stock']) + display_item_i.append(display_item[i]['price']) + item_shop.append(display_item_i) + user[user_id][4] = user_inventory['oc'] + data['item_inventory'] = item_inventory + data['item_shop'] = item_shop + data['monster_inventory'] = monster_inventory + data['monster_shop'] = monster_shop + data['user'] = user + return data diff --git a/src/shop_management.py b/src/shop_management.py new file mode 100644 index 0000000..25401cc --- /dev/null +++ b/src/shop_management.py @@ -0,0 +1,202 @@ +from login import login +from load import load + +not_monster_shop = {} +not_item_shop = {} +exit = False + +# Fungsi menentukan monster yang belum ada di toko monster. +def not_monster(): + for id, data in load.monster.items(): + ada = False + for idmonster, datamonster in load.monster_shop.items(): + if id == idmonster: + ada = True + break + if not ada: + type = data['type'] + atk_power = data['atk_power'] + def_power = data['def_power'] + hp = data['hp'] + tidak_ada = {(id):{'type':(type),'atk_power':(atk_power),'def_power':(def_power),'hp':(hp)}} + not_monster_shop.update(tidak_ada) + +# Fungsi menentukan item yang belum ada di toko item. +def not_item(): + for id, data in load.item.items(): + ada = False + for iditem, dataitem in load.item_shop.items(): + if id == iditem: + ada = True + break + if not ada: + type = data['type'] + tidak_ada = {(id):{'type': (type)}} + not_item_shop = {} + +# Fungsi menampilkan daftar barang yang tersedia di toko monster atau toko item. +def tampilkan_shop(barang): + if barang == 'monster': + print("\nID | TYPE | ATK POWER | DEF POWER | HP | STOK | HARGA") + for id, data in load.monster_shop.items(): + stok = data['stock'] + harga = data['price'] + for idmonster, datamonster in load.monster.items(): + if idmonster == id: + type = datamonster['type'] + atk_power = datamonster['atk_power'] + def_power = datamonster['def_power'] + hp = datamonster['hp'] + print(f"{id} | {type} | {atk_power} | {def_power} | {hp} | {stok} | {harga}") + + elif barang == 'item': + print("\nID | TYPE | STOK | HARGA") + for id, data in load.item_shop.items(): + type = data['type'] + stok = data['stock'] + harga = data['price'] + print(f'{id} | {type} | {stok} | {harga}') + +# PROGRAM UTAMA +def shop_management(): + global exit + if login.user['user_id'] == '0': + aksi = input('\nPilih aksi (lihat/tambah/ubah/hapus/keluar): ') + + if aksi == 'lihat': + sub_aksi = input('\nApa yang mau dilihat? (monster/item): ') + + if sub_aksi == 'monster': + tampilkan_shop('monster') + elif sub_aksi == 'item': + tampilkan_shop('item') + + elif aksi == 'tambah': + sub_aksi = input('\nApa yang mau ditambah? (monster/item): ') + if sub_aksi == 'monster': + print('ID | TYPE | ATK POWER | DEF POWER | HP') + not_monster() + for id, data in not_monster_shop.items(): + type = data['type'] + atk_power = data['atk_power'] + def_power = data['def_power'] + hp = data['hp'] + print(f'{id} | {type} | {atk_power} | {atk_power} | {def_power} | {hp}') + + id_monster = input("\nMasukkan ID Monster: ") + stok = input("Masukkan Stok Awal: ") + harga = input("Masukkan Harga: ") + + for id, data in not_monster_shop.items(): + if id_monster == id: + tambah={(id):{'stock': (stok), 'price': (harga)}} + load.monster_shop.update(tambah) + print('\nITEM BERHASIL DITAMBAHKAN KE SHOP') + break + + elif sub_aksi == 'item': + print('ID | TYPE') + not_item() + for id, data in not_item_shop.items(): + type = data['type'] + print(f'{id} | {type}') + + id_item = input('\nMasukkan ID Item: ') + stok = input('Masukkan Stok Awal') + harga = input('Masukkan Harga: ') + + for id, data in not_monster.items(): + if id_item == id: + type = data['type'] + tambah = {(id):{'type': (type), 'stock': (stok), 'price': (harga)}} + load.item_shop.update(tambah) + print('\nITEM BERHASIL DITAMBAHKAN KE SHOP') + + elif aksi == 'ubah': + sub_aksi = input('\nApa yang mau diubah? (monster/item): ') + if sub_aksi == 'monster': + tampilkan_shop('monster') + + ubah_stok = False + ubah_harga = False + + id = input("\nMasukkan ID Monster: ") + stok = input("Masukkan Stok Baru: ") + harga = input("Masukkan Harga Baru: ") + + if stok != '': + ubah_stok = True + load.monster_shop[(id)]['stock'] = (stok) + if harga != '': + ubah_harga = True + load.monster_shop[(id)]['price'] = (harga) + + if ubah_stok: + if ubah_harga: + print(f"Monster telah berhasil diubah dengan stok baru sejumlah {stok} dan dengan harga baru {harga}") + else: + print(f"Monster telah berhasil diubah dengan stok baru sejumlah {stok}") + else: + if ubah_harga: + print(f"Monster telah berhasil diubah dengan harga baru {harga}") + else: + print("Isi Stok/Harga yang ingin diubah") + + elif sub_aksi == 'item': + tampilkan_shop('item') + + ubah_stok = False + ubah_harga = False + + id = input("\nMasukkan ID Item: ") + stok = input("Masukkan Stok Baru: ") + harga = input("Masukkan Harga Baru: ") + + if stok != '': + ubah_stok = True + load.item_shop[(id)]['stock'] = (stok) + if harga != '': + ubah_harga = True + load.item_shop[(id)]['price'] = (harga) + + if ubah_stok: + if ubah_harga: + print(f"Item telah berhasil diubah dengan stok baru sejumlah {stok} dan dengan harga baru {harga}") + else: + print(f"Item telah berhasil diubah dengan stok baru sejumlah {stok}") + else: + if ubah_harga: + print(f"Item telah berhasil diubah dengan harga baru {harga}") + else: + print("Isi Stok/Harga yang ingin diubah") + + elif aksi == 'hapus': + sub_aksi = input('\nApa yang mau dihapus? (monster/item): ') + if sub_aksi == 'monster': + tampilkan_shop('monster') + + id = input("\nMasukkan ID Monster: ") + confirm = input('Apakah anda yakin ingin menghapus Monster dari shop (y/n)? ') + + if confirm == 'y': + del load.monster_shop[(id)] + else: + next + elif sub_aksi == 'item': + tampilkan_shop('item') + + id = input("\nMasukkan ID Item: ") + confirm = input('Apakah anda yakin ingin menghapus Item dari shop (y/n)? ') + + if confirm == 'y': + del load.item_shop[(id)] + else: + next + + elif aksi == 'keluar': + exit = True + print('Dadah Mr. Monogram!') + +print('========== SELAMAT DATANG Mr. Monogram ==========') +while not exit: + shop_management()