Ameisen als Spielthema

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Weisser
User
Beiträge: 13
Registriert: Mittwoch 24. April 2013, 16:47

Ich habe dieses hier geschrieben und würde mich über Kommentare freuen.
(Bin Anfänger) .:?

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-


from random import *
from pickle import *
import pickle
import time
import random
import sys



tot = False
game_data = {
"essen":9,
"koll":True,
"arbeiter":1,
"krieger":0,
"stufe":1,
"hunger":0
}


BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
FOREGROUND = 30
RESET_SEQ = "\033[0m"
COLOR_SEQ = "\033[1;%dm"




def colored(text,color):
    """ Faerbt den ausgabe text ein.

    >>>colored(‘whatever‘,RED)
    whatever  #wuede dann in Rot erscheinen
    """
    start = COLOR_SEQ % (FOREGROUND + color)
    return start + text + RESET_SEQ



def start():
    """
    Anfang des Spieles, 
    Laden von Spielstaenden 
    und Andmincode.
    """
    global game_data
    global essen 
    global koll 
    global arbeiter 
    global krieger 
    global stufe 
    global hunger 
    global koeniginnename
    print(colored("Wilkommen in der Welt der Welt der Ameisen!",BLUE))
    print()
    print(colored("                   ANTWORLD!",BLUE))
    print "\n\n"
    load = raw_input("Laden?").lower()
    if load ==  "ja":
        files = open("/Users/nundn/save.dat","rb")
        game_data = pickle.load(files)
        files.close()
    koeniginnename = raw_input("Wie heißt die Koenigin?")
    if koeniginnename == "couven":
        pasw = raw_input("Passwort:")
        if pasw == "100200000500000100":
            game_data = {
            "essen":100000000000000,
            "koll":False,
            "arbeiter":1000000000000,
            "krieger":100000000000,
            "stufe":1000000000000000000000000000000000000000000,
            "hunger":0
            }
            print "Hi Admin!"
            print "Dein Stand wude mit Adminrechten ausgetatet!"
        else:
            print "Ungueltiges Passwort!"
    print("Dann los\n")
    essen = game_data["essen"]
    koll = game_data["koll"]
    arbeiter = game_data["arbeiter"]
    krieger = game_data["krieger"]
    stufe = game_data["stufe"]
    hunger = 0

def sammeln(arg):
    """
    Aendert die Varable essen um arbeiter*2+stufe.
    """
    global arbeiter
    global essen
    global stufe
    dauert = 5
    print("Essen wird gesammelt")
    print("Das dauert {} Sekunden".format(dauert))
    for i in range(1,dauert):
        sys.stdout.write("Noch {} Sekunden\r".format(dauert - i))
        sys.stdout.flush()
        time.sleep(1)
    print("Essen gesamelt!")
    print("Du hast {} Essen gesammelt".format(arbeiter*2+stufe))
    essen = essen + arbeiter*2+stufe
    print("Du hast jetzt {} Essen".format(essen))
 

def kol(arg):
    """
    pass
    """
    global koll
    global essen
    if koll:
        if essen > 9:
            print("Kollonie erstellen")
            print("Das dauert 10 Sekunden und kostet 10 Essen")
            essen = essen - 10
            for i in range(1,10):
               sys.stdout.write("Noch {} Sekunden\r".format(10 - i))
               sys.stdout.flush()
               time.sleep(1)
            print("Kollonie erstellt")
            koll = False
        else:
            print(colored("Nicht genug Essen!",RED))
    else:
        print(colored("Du hast schon eine Kollonie!",RED))
   

def amer(arg):
    """
    Erhoet Arbeiter oder wahlweise Krieger um 
    einen angegebenen Wert sofern dieser 
    mit der emomaentigen menge essen belahlbar ist.
    """
    global essen
    global krieger
    global arbeiter
    print("Erstellen")
    print("Deine Ameisen:  \nArbeiter:{0}\nKrieger:{1}\n".format(arbeiter,krieger))
    wahl = raw_input("Welche willst du erstellen?").lower()
    if wahl == "arbeiter":
        print "Du kannst {} Arbeiter erstellen".format(essen//2)
        menge = raw_input("Wie viele?")
        menge = int(menge)
        if menge <= essen//2:
            essen = essen - menge*2
            arbeiter += menge
            print "{} Arbeiter erstellt!".format(menge) 
        else:
            print colored("Nicht genug Esssen!",RED)
    elif wahl == "krieger":
        print "Du kannst {} Krieger erstellen".format(essen//5)
        menge = raw_input("Wie viele?")
        menge = int(menge)
        if menge <= essen//5:
            essen = essen - menge*2
            krieger += menge
            print "{} Krieger erstellt!".format(menge) 
        else:
            print colored("Nicht genug Esssen!",RED)
        

def ameri(arg):
    """
    Prueft ob der Spieler eine Kollonie hat.
    wen Ja: wird amer ausgeführt.
    wen Nein: wird eine Fehlermeldung ausgegeben.
    """
    global koll
    if koll:
        print(colored("Du brauchst eine Kollonie!",RED))
    else:
        amer(arg)

def hilfe(arg):
    """
    Gibt die emomentigen Komandos aus.
    """
    print("Hilfe:\n")
    for i in commands:
        print(i)
    print("\n")      



def angriff(arg):
    """
    Anhant der zahl der krieger wird
    eine aenderung des essenswertes vorgenommen.
    """
    global essen
    global krieger
    print "Angriff!"
    sieg = randint(0,krieger+1)
    if sieg != 0:
        print colored("Du hast gewonnen!",GREEN)
        stolen_essen = randint(1,stufe * 20)
        print "Du hast {} Essen gestolen!".format(stolen_essen)
        essen += stolen_essen
    else:
        print colored("Du hast verloren!",RED)
        stolen_essen = randint(1,stufe * 10)
        print "Es wurde dir {}  Essen gestolen!".format(stolen_essen)
        essen -= stolen_essen


def debug(arg):
    global tot
    dateiw = open("/Users/nundn/Ant.py","r")
    text = dateiw.read()
    print text
    dateiw.close()
    tot = True

def shop(arg):
    """
    Ermoeglicht 
    den zugriff auf ameri(arg) und ein nicht funktionierendes
    Angebot an Essen.
    """
    print "Shop:"
    kauf = raw_input("Was willst du kaufen?").lower()
    if kauf == "essen":
        print "1:10000000 Essen  0.99€"
        print "2:1000000000 Essen 4.99€"
        print "3:100000000000 Essen 9.99€"
        print "4:100000000000000000000 Essen 99.99€"
        raw_input("Waehle ein Angebot(Nummer eigeben)")
        print colored("Nicht genug Guthaben!",RED)
    elif kauf == "ameisen":
        ameri(arg)
    elif kauf == "anderes":
        pass  
    print


def fuetern(arg):
    """Setzt hunger auf 0
    und aendert essen um arbeiter+krieger//2"""
    global essen
    global hunger
    global arbeiter
    global krieger
    hunger = 0
    essen = essen - ((arbeiter+krieger)//2)
    print "Ameisen gefuetert !"

def abfrage(arg):
    """Gibt die Werte von 
    eesn,arbeiter,krieger,stufe und hunger aus.
    """
    global essen
    global arbeiter
    global krieger
    global stufe
    global hunger
    print"Dein Essen:",essen
    print"Deine Arbeiter:",arbeiter
    print"Dein Krieger:",krieger
    print"Dein Level:",stufe
    print"Dein Hunger:",hunger
    

def aus(arg):
    """Bended das Spiel 
    und ermoglicht das Speichern von 
    Spielstaenden.
    """
    global tot
    global game_data
    global essen 
    global koll 
    global arbeiter 
    global krieger 
    global stufe 
    global hunger 
    global koeniginnename
    tot = True
    sp = raw_input("Speichern?").lower()
    if sp == "ja":
        game_data = {
        "essen":essen,
        "koll":koll,
        "arbeiter":arbeiter,
        "krieger":krieger,
        "stufe":stufe,
        "hunger":hunger
        }
        files = open("/Users/nundn/save.dat","wb")
        dump(game_data,files)
        files.close()
    print("Auf wiedersehen!")

commands = {
    "sammeln":sammeln,
    "end":aus,
    "kollonie":kol,
    "eier":ameri,
    "help":hilfe,
    "info":abfrage,
    "angreifen":angriff,
    "shop":shop,
    "feed":fuetern,
    "debug":debug
    }



def update(arg):
    """
    Ueberprueft eine Reihe von bedingungen
    und führt darufhin Funktionen aus.
    """
    global stufe
    global essen
    global hunger
    global arbeiter
    global krieger
    hunger += 1
    if essen > stufe * 100+ stufe*100:
        stufe = stufe + 1
        print("\n\n\n")
        print(colored("!!Level up!!",MAGENTA))
        print"Dein neuer Level:",stufe
        print("\n\n\n")
    num = randint(1,17)
    if hunger > 17:
        print colored("Deine Kollonie ist verhungert!",RED)
        aus(arg)
    elif hunger > 9:
        print colored("Es sind {} Ameisen verhungert!".format(randint(0,arbeiter)),RED)
        arbeiter = arbeiter - randint(0,stufe//2)
    elif hunger > 6:
        print colored("Deine Ameisen haben Hunger!",RED)
        
    if arbeiter+krieger < 1:
        print "Deine Kollonie wurde zerstoert!"
        aus(arg)
    if num == 1:
        angriff(1)
        

def isCMD(command):
    """
    Ueberprueft aub das Kommando
    in Commands vorkommt.
    """
    if command in commands:
        return True
    else:
        return False

def runCMD(command,args):
    """
    Fuehrt ein Kommando aus.
    """
    commands[command](args)
    

def auswahl():
    """Nimmt die eingabe auf.
     """
    while tot == False:
        update(1)
        akk = raw_input("Was willst du machen?\n")
        akk = akk.split()
        akk.append("unused")
        if isCMD(akk[0]):
            runCMD(akk[0],"")    
start() 
auswahl()


#Bestergebnis:
#Dein Essen: 513038986592039626739052808209877647373
#Deine Arbeiter: 28117496345729821217529063402185206202
#Dein Krieger: 31055633242310176200259541157656998114
#Dein Level: 100000000000000000000000000140
#Dein Hunger: 7

Was halted ihr davon?
Zuletzt geändert von Weisser am Mittwoch 24. April 2013, 22:36, insgesamt 1-mal geändert.
Kabelsalat ist gesund!
BlackJack

@Weisser: Ich halte nix von ``global``. Falls das die Frage beantwortet. Das wäre das erste was man loswerden sollte.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Weisser,
das Verwenden von »global« macht Dein Programm sehr unübersichtlich (wie jedes andere auch). Am besten wäre es, wenn Du die ganze Spielzustände ein einer Klasse kapselst.

»isCMD« und »runCMD« sind so trivial, dass sie keine eigenen Funktionen sein müßten.
Weisser
User
Beiträge: 13
Registriert: Mittwoch 24. April 2013, 16:47

Könnt ihr mir ein Beispiel geben wie man das mit den Variablen besser machen könnte? :K
Kabelsalat ist gesund!
Weisser
User
Beiträge: 13
Registriert: Mittwoch 24. April 2013, 16:47

@Sirius3
Sirius3 hat geschrieben:Hallo Weisser,
das Verwenden von »global« macht Dein Programm sehr unübersichtlich (wie jedes andere auch). Am besten wäre es, wenn Du die ganze Spielzustände ein einer Klasse kapselst.
Wie meinst du das? :K
Kabelsalat ist gesund!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

nur als erster Schritt:

Code: Alles auswählen

class AntWorld:
    def __init__(self):
        self.tot = False
        self.essen = 9
        usw.

    def sammeln(self):
        usw.
Weisser
User
Beiträge: 13
Registriert: Mittwoch 24. April 2013, 16:47

Ok ich glaube ich verstehe was du meinst. :)
Kabelsalat ist gesund!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Weisser hat geschrieben:Was halted ihr davon?
Abstand.

Als Ergänzung zu dem was schon gesagt wurde: Die Sternchen-Importe sind auch äußerst unschön. Du müllst dir im Endeffekt nur den Namensraum zu.

Was mir noch auffiel ist, dass du mit game_data bereits angefangen hast die Daten in Strukturen unterzubringen - nur um sie dann völlig überflüssigerweise wieder in einzelne Bestandteile zu zerlegen. Mit der von BlackJack angesprochenen Verwendung einer Klasse wird sich das wohl hoffentlich erledigen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

für text-basierte Interaktion finde ich das cmd-Modul aus der Standardinstallation von Python immer extrem praktisch. Das würde sich auch zur Umsetzung dieses Spiels stark anbieten. Zumal dann auch Hilfstexte einfach und effektiv integriert werden können.

Gruß, noisefloor
Antworten