Alien Warfare
Publicado por Artur Rabelo (última atualização em 23/04/2021)
[ Hits: 1.458 ]
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()
Cup - um gerenciador de notas simples
run_update - Atualizador de Sabayon
Calculadora para números complexos
Gerador de PIS/PASEP em Python
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta