Alien Warfare
Publicado por Artur Rabelo (última atualização em 23/04/2021)
[ Hits: 1.805 ]
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()
Compartilhe suas configurações gconf
Mudar wallpaper por um aleatorio
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Pergunta: Meu teclado não está respondendo direito como e consertar? (0)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)
Secure boot, artigo interessante, nada técnico. (5)









