Alien Warfare
Publicado por Artur Rabelo (última atualização em 23/04/2021)
[ Hits: 1.642 ]
Homepage: https://github.com/artrabelo
Um jogo simples em Python inspirado em batalha naval onde você deve defender Marte dos invasores terráqueos.
Mais informações no repositório no GitHub: https://github.com/artrabelo/alien-warfare
import os #import logging import argparse from time import sleep from colorama import Fore, init from random import randint letters_to_numbers = { "A": 0, "B": 1, "C": 2, "D": 3, "E": 4, "F": 5, "G": 6, "H": 7, "I": 8, "J": 9 } def argparser(): global args parser = argparse.ArgumentParser( description="Simple battleship game where you have to protect Mars from an Earth attack.", epilog="Have fun!") parser.add_argument("--no-nerd", action="store_true", help="disable nerd stuff on intro") parser.add_argument("--no-ascii", action="store_true", help="disable ascii art") parser.add_argument("--mini", action="store_true", help="run game in minimal mode, without fancy stuff") parser.add_argument("--hack", dest="hack", action="store_true", help="display ships locations") args = parser.parse_args() if args.mini: args.no_nerd = True args.no_ascii = True return args class Invader: def __init__(self, size=5): self.size = size self.ships = [] self.board = [[" " for _ in range(self.size)] for _ in range(self.size)] self.random_ships(size*2-5) """ Board reference: A B C D E 1 | (0,0), (0,1), (0,2), (0,3), (0,4) 2 | (1,0), (1,1), (1,2), (1,3), (1,4) 3 | (2,0), (2,1), (2,2), (2,3), (2,4) 4 | (3,0), (3,1), (3,2), (3,3), (3,4) 5 | (4,0), (4,1), (4,2), (4,3), (4,4) """ def print_board(self, reveal=False): if reveal: self.reveal_ships() letters = "ABCDEFGHIJ" headers = [letters[i] for i in range(self.size)] print(" " + " ".join(headers)) for index, row in enumerate(self.board): if index == 0: print(" ." + "-----."*self.size) print(f"{index+1:<2} | {' | '.join(row)} |") print(" |" + "-----|"*self.size) def reveal_ships(self): for ship in self.ships: y, x = ship self.board[y][x] = f"{Fore.RED}*\033[m" if not args.mini else "*" def cell_check(self, y, x): return self.board[y][x] def create_ship(self, y, x): self.ships.append((y, x)) if args.hack: self.board[y][x] = "*" #logging.info(f"Ship created at {y, x}") def destroy_ship(self, y, x): self.ships.remove((y, x)) self.board[y][x] = "X" #logging.info(f"Ship destroyed at {y, x}") def random_ships(self, number_of_ships=5): """ Populates the board with n random ships. """ for _ in range(number_of_ships): while True: x = randint(0, len(self.board)-1) y = randint(0, len(self.board[0])-1) if not (y, x) in self.ships: self.create_ship(y, x) break else: #logging.warning(f"Ship already created at {y, x} - trying again") continue class Game: """ Creates the main engine. """ def run(self): self.intro() self.lvl = self.difficulty() if not args.no_nerd: self.nerd_stuff() self.play() def intro(self): if args.no_ascii: print("Alien Warfare\nProtect Mars from Earth attack!\n") else: print(r""" ___ _ _ _ _ __ / _ \| (_) | | | | / _| / /_\ \ |_ ___ _ __ | | | | __ _ _ __| |_ __ _ _ __ ___ | _ | | |/ _ \ '_ \ | |/\| |/ _` | '__| _/ _` | '__/ _ \ | | | | | | __/ | | | \ /\ / (_| | | | || (_| | | | __/ \_| |_/_|_|\___|_| |_| \/ \/ \__,_|_| |_| \__,_|_| \___| Protect Mars from Earth attack! """) def difficulty(self): while True: try: size = int(input("Choose board size (5-10): ")) if 5 <= size <= 10: return size else: print("Invalid value.", end=" ") continue except ValueError: print("Please enter a number.", end=" ") continue def nerd_stuff(self): messages = ( f"{Fore.GREEN}[+]\033[m Syncing with Area 51 backdoor...OK", f"{Fore.GREEN}[+]\033[m Spoofing satellite signal...OK", f"{Fore.RED}[-]\033[m Enumerating targets positions...FAILED", f"{Fore.GREEN}[+]\033[m Gathering targets maximum range...OK", f"{Fore.GREEN}[+]\033[m Building virtual grid...OK" ) sleep(0.5) for item in messages: print(item) sleep(1.2) def clear(self): """Get OS name and run command to clear the screen.""" if os.name == "nt": os.system("cls") elif os.name == "posix": os.system("clear") def translate(self, coord): """Translates board input, as 'A2', to cartesian points.""" if len(coord) == 2 and coord[0].isalpha() and coord[1].isdigit(): y = int(coord[1])-1 x = letters_to_numbers[coord[0].upper()] return y, x def slow_type(self, message, speed=0.05): for char in message: print(char, end="", flush=True) sleep(speed) def win(self): self.slow_type("\nCongratulations, you destroyed all earthling ships!") sleep(0.5) self.slow_type("\nAnyone who challenge us will die!") sleep(0.5) self.slow_type("\nMars is safe... For now.\n") def gameover(self): self.slow_type("\nYou lost your chance to protect Mars, Captain.", 0.07) sleep(0.5) self.slow_type("\nThe earthlings will reign over us.", 0.07) sleep(0.5) self.slow_type("\nMars will be gone... And so should you.\n", 0.07) def play(self): # Initial variables max_turns = self.lvl * 2 - 2 turns = max_turns y, x = None, None enemy = Invader(self.lvl) # Game begins while turns > 0: # Update screen self.clear() enemy.print_board() # If enemy has no ships, he's done if not enemy.ships: self.win() break print(f"\n{len(enemy.ships)} enemy ships remaining") print(f"Turn: {turns} / {max_turns}") coord = input("Target: ") try: y, x = self.translate(coord) if enemy.cell_check(y, x): if (y, x) in enemy.ships: enemy.destroy_ship(y, x) print("Ship destroyed!") else: target = enemy.board[y][x] if target == " ": enemy.board[y][x] = "o" print("You missed!") turns -= 1 else: print("You already guessed that spot.") except: print("What are you aiming at? Try again.") sleep(0.8) else: self.clear() sleep(0.2) enemy.print_board(reveal=True) sleep(0.8) self.gameover() if __name__ == "__main__": #logging.basicConfig(level=logging.INFO) init(autoreset=True) argparser() game = Game() game.run()
Conversor de Temperaturas Kelvin Celsius e Fahrenheit
QFacil 0.2 - Qemu simplificado.
ISOsync_pt-BR.py - Um Baixador Automático de ISOs de Sabayon, escrito em Python
Jogo da Velha com IA (Inteligencia Artificial)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Como gerar um podcast a partir de um livro em PDF
Automatizando digitação de códigos 2FA no browser
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Organizando seus PDF com o Zotero
Erro no realm join [Resolvido]
Um programa para baixar vídeos: Parabolic
Como Definir o Painel Principal em Múltiplos Monitores no Linux Mint
Como fazer para mudar a frequência da GPU ou pelo menos da CPU no term... (1)
tentando instalar em um notebook antigo o Linux LegacyOS_2023... (4)
Atalhos duplicados (sobras de instalações anteriores) (2)