Kleines Computerspiel mit großen Zielen

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Miko

Ich möchte nun auch mal hier mein Projekt vorstellen.

Vorerst:
Wer schon zu diesem Zeitpunkt was Besonderes erwartet der wird nicht fündig. Also bevor flames losgehen bitte lieber ignorieren.

Ich programmiere mit einem Freund ein kleines Computerspiel. Früher hab ich selber dran gearbeitet aber 6 Monate lang nichts mehr gemacht. Nun haben wir es wieder aufgenommen.
Bis jetzt ist es noch nichts besonderes aber vielleicht unterhaltsames.

Ferne Ziele sind noch:
- Multiplayerfähigkeit
- Künstliche Intelligenz
- Mehrere Gegner

Vorerst werden wir uns mit ein paar grundlegenden dingen beschäftigen. Ein schöneres Kampfsystem etc.

Ich weis auch dass der Quellcode nicht immer Optimal ist. Es ist noch nichts fertig. Wir wollen selber daran entwickeln. Also bitte hier keine Tipps bezüglich des Quellcodes sondern nur zum Spiel.

Weitere Infos sowie der Download: http://physra.com

Es wird noch viel dran gearbeitet.
Funktioniert und Windows und Linux getestet mit Python 2.4.x bis 2.5

Schöne Grüße und viel Spass
Miko
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,

nach deinem Code klingt es so, als würdet ihr Ogame für arme nach programmieren. :D

Aber trotzdem schöner Project nur weiter so.
Miko

erstmal dank,
warum ogame für arme?


wir haben dieses jahr mit unserer edv ausbildung zum fachinformatiker begonnen und wollen aber unsere programmierwurzeln (python) nicht verlieren.

Meiner meinung nach ist python top für viele applikationen.

klar, es ist nichts besonderes. aber wir arbeiten aktiv dran und es macht schon jetzt kurzzeitig spass. vielleicht wirds ja mal ein richtig cooles textbasiertes spiel. sowas wie forschung etc. kommt auch noch rein.

man kann dann ja auch multiplayerfähigkeit auf einem rechner machen mit linux jedenfalls ^^. mehrere consolen eben.

zum code noch was:

das kampfsystem ist ja sehr schlecht in der erweiterbarkeit. in der nächsten version wird es entweder viele neue feature geben (mehr gebäude, forschung)

oder das kampfsystem wird überarbeitet.

bis zur ki ist noch ein schritt. aber wir wollen dem gegner spätestens bis version 0.2 ein ressourcenmanagment sehr eingeschränkt geben.
BlackJack

Miko hat geschrieben:Ich weis auch dass der Quellcode nicht immer Optimal ist. Es ist noch nichts fertig. Wir wollen selber daran entwickeln. Also bitte hier keine Tipps bezüglich des Quellcodes sondern nur zum Spiel.
Beim kurzen Blick in die `spiel.py` mit Importen die ausschliesslich * benutzen und 21 mal ``global`` in 4 Funktionen, fiele mir eigentlich auch kein Tip ein, wie man den Quelltext verbessern könnte... :shock:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Miko hat geschrieben:bitte hier keine Tipps bezüglich des Quellcodes
Hi Miko!

Pech! :twisted:

- Im Kopf der Datei "defin.py" steht zwar, dass diese "latin-1"-codiert sei, aber sie ist UTF-8. Also entweder den Kopf oder das Coding der Datei ändern.

- Leerzeichen und Tabulatoren werden zum Einrücken verwendet.

- SIEBEN (7) ``global``-Anweisungen untereinander. Das ist selten.

- ``from xxx import *`` --> ``import xxx`` (Sagt doch endlich mal den Professoren und Buchauthoren, dass sie endlich mal die Stern-Imports vom Unterricht und von den Büchern verbannen sollen.) :evil:

mfg
Gerold
:-)

Edit: ??? 21 mal ``global`` ???
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

gerold hat geschrieben:Edit: ??? 21 mal ``global`` ???

Code: Alles auswählen

>>> text.count('global')
21
ja 21 :D
Miko

danke,
aber soetwas müssen wir selber lernen. ich find es nett wenn ihr mir helfen wollt aber ihr tut es nicht wirklich.

wie gesagt der quelltext ist unsauber. durch selbst beigebrachtes wissen weis man eben nicht immer was besser ist.

zu den leerschritten und tabulatoren:
python 2.5 hat gemeckert. danach wurde das spiel auf einer linuxmaschine weiterprogrammiert. die leerschritte stammen noch aus windowszeiten.

import xxx werden wir das nächste mal verwenden

ich wüsste nicht wie ich global bei def wegbekomm.

das mit der codierung stammt auch noch aus meckernden 2.5 zeiten unter windows. linux ist ja um soviel ******

aber wie findet ihr unseren ansatz?
Miko

ach halt, das ist garstig von mir mit dem Helfen deswegen:

Danke für die Hilfen und die mühen eurerseits!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Miko hat geschrieben:aber soetwas müssen wir selber lernen. ich find es nett wenn ihr mir helfen wollt aber ihr tut es nicht wirklich.
Stimmt. Denn Hilfen von Leuten mit extensiver Erfahreng können ja nicht gut sein. Das Rad zu erfinden ist nämlich definitiv besser. Aha.
Miko hat geschrieben:wie gesagt der quelltext ist unsauber. durch selbst beigebrachtes wissen weis man eben nicht immer was besser ist.
Aber Hilfe wollt ihr keine? Bleibt man lieber bei einem schlechteren Zustand anstatt aus der Erfahrung anderer zu profitieren und es zu verbessern?
Miko hat geschrieben:zu den leerschritten und tabulatoren:
python 2.5 hat gemeckert. danach wurde das spiel auf einer linuxmaschine weiterprogrammiert. die leerschritte stammen noch aus windowszeiten.
Dann würde ich euch raten generell alle Tabs durch Spaces zu ersetzen. Ist ein Punkt aus dem PEP8.
Miko hat geschrieben:ich wüsste nicht wie ich global bei def wegbekomm.
Indem man das generelle Design so Modularisiert, dass Funktionen keine Nebenwirkungen zu haben brauchen, die global sind.
Miko hat geschrieben:das mit der codierung stammt auch noch aus meckernden 2.5 zeiten unter windows. linux ist ja um soviel ******
Das ist unter Windows oder Linux genau das gleiche. Man sollte, wenn man eine Datei als UTF-8 dekalriert auch als UTF-8 speichern.

P.S.: Außerdem verstehe ich euer Versionierungsschema nicht. Version 0.12 ist aktuell, aber du meinst, dass ein Feature in 0.2 implementiert wird. Die Logik würde sagen, dass 2 < 12 ist und daher das Feature schon implementiert ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Miko

das jetzt dieser flame kommt bin ich wohl auch selber mitschuld.

zu punkt 1: da hab ich mich entschuldigt

warum keine tabs mehr und nur spaces?
Indem man das generelle Design so Modularisiert, dass Funktionen keine Nebenwirkungen zu haben brauchen, die global sind.
soso aha, keine ahnung :D vielleicht indem ich die variablen nicht in der funktion schreib? aber dann wird der haupttext wieder länger
Das ist unter Windows oder Linux genau das gleiche. Man sollte, wenn man eine Datei als UTF-8 dekalriert auch als UTF-8 speichern.
unter linux hats funktioniert, unter windows nicht. zu dem zeitpunkt hat mich nicht mehr interessiert. somit war meine aussage einfach rausgehauen.
P.S.: Außerdem verstehe ich euer Versionierungsschema nicht. Version 0.12 ist aktuell, aber du meinst, dass ein Feature in 0.2 implementiert wird. Die Logik würde sagen, dass 2 < 12 ist und daher das Feature schon implementiert ist.
das ist das einzigste wo du falsch liegst.

2 ist kleiner als 12

aber 0.2 ist größer als 0.12

siehe 0.20 zu 0.12

die letzte null lässt man aber in der regel bei versionsnummer weg.

kommastellen werden quasi von "links nach rechts gelesen".

schöne grüße und danke für das feedback

miko
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Miko hat geschrieben:
Indem man das generelle Design so Modularisiert, dass Funktionen keine Nebenwirkungen zu haben brauchen, die global sind.
[...]
vielleicht indem ich die variablen nicht in der funktion schreib?
Hi miko!

So jetzt Ernst beiseite. :mrgreen: Ich erklär dir jetzt wie du weniger globale Variablen verwenden kannst und wie sich dadurch dein Programmdesign verbessert. Die anderen Sache erklärt dir sicher noch ein anderer hier im Board. :wink:

Globale Variablen haben mehrere Nachteile. Einer davon ist, dass eine Funktion etwas an einer globalen Variable ändern kann, ohne dass es für andere Funktionen ersichtlich ist. So kann ein Durcheinander rein kommen.

Stell dir vor, in einer Funktion, ganz am Anfang deines Quellcodes wird einer globalen Variablen etwas zugewiesen.

1000 Zeilen später, ändert ebenfalls eine Funktion etwas an einer globalen Variable. Du kennst deinen Quellcode nicht auswendig. Deshalb weißt du evt. schon gar nicht mehr, dass eine andere Funktion etwas mit der Variable gemacht hat, was vielleicht sogar wichtig gewesen wäre. Durch globale Variablen kommt eine Dynamik ins Programm, die sich negativ auf die Wartbarkeit und erweiterbarkeit des Programmes auswirkt.

Wie kannst du so etwas verhindern?

Übergib an eine Funktion alles was die Funktion so zum Arbeiten braucht als Parameter. Erwarte, dass die Funktion nichts ändert, aber Werte wieder per ``return`` zurück gibt.

So schlägst du mehre Fliegen mit einer Klappe. Erstens, brauchst du dann keine globale Variable und zweitens lässt sich jede Funktion unabhängig von der Umgebung testen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

wert1 = 10
wert2 = 20
ergebnis = None


# So nicht... :-(
def multipliziere_wert1_wert2():
    global ergebnis
    ergebnis = float(wert1) * float(wert2)

multipliziere_wert1_wert2()
print ergebnis
# Hier war nicht von außen ersichtlich, dass die Variable `ergebnis` 
# verändert wird.


# So schon... :-)
def multipliziere(wert1, wert2):
    return float(wert1) * float(wert2)

ergebnis = multipliziere(wert1, wert2)
print ergebnis
# Hier ist beim Aufruf sofort ersichtlich, dass die Variable `ergebnis`
# verändert wird.
In der ersten Funktion wird eine globale Variable verändert. Beim Testen muss darauf rücksicht genommen werden.

Die zweite Funktion läuft komplett unabhängig, macht nichts, was man beim Aufruf nicht erwarten würde.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...es gibt natürlich Ausnahmen,in denen es nicht sinnvoll ist, die Werte an die Funktion zu übergeben...

Z.B., wenn du eine Klasse erstellt hast, die z.B. eine ganz normale Rechnung darstellt. Also ein Objekt, in dem Artikel, deren Preise usw. gespeichert sind. Dann macht es auch keinen Sinn, wenn man an die Methode (Klassenfunktionen nennt man Methoden) ``get_sum`` alle Artikel übergeben müsste.

Bei Klassenmethoden ist es nicht überraschend, dass diese die Werte aus der Klasse verwenden und evt. auch mal Werte der Klasse verändern. Da es niemanden überrascht -- ist es OK. Die Klasse als Umgebung ist ja immer da. Also gibt es auch kein Problem mit dem Testen. Man testet einfach die Klasse und nicht nur eine Methode.

Brauchst du wirklich einmal eine globale Variable, dann empfehle ich, diese in eine Klasseninstanz zu schreiben, die *nur* für globale Variablen zuständig ist. So überrascht es auch niemanden, wenn sich der Wert man ändert.

Code: Alles auswählen

class GlobalVars(object):
    """Globale Variablen"""
    def __init__(self, filename = "", wertxy = ""):
        self.filename = filename
        self.wertxy = wertxy


gvar = GlobalVars()

gvar.filename = "C:/hallowelt.txt"
gvar.wertxy = "Wert XY"
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
Mike hat geschrieben:2 ist kleiner als 12
Ja, ok ...
Mike hat geschrieben:aber 0.2 ist größer als 0.12
... ähhh ...
Mike hat geschrieben:die letzte null lässt man aber in der regel bei versionsnummer weg.
Ist mir neu.
Mike hat geschrieben:kommastellen werden quasi von "links nach rechts gelesen".
Ich weiss ich wiederhole mich, aber ... ähhh ... ?

Nur mal interessehalber: Wie nennst du die Version, die Leonidas als 0.2 bezeichnen würde? 0.02?

Gruß, verwirrter mawe
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Hi Miko, schön, dass ihr ein Projekt gefunden habt, an dem ihr euch weiterbilden könnt. Du magst über die hier geäußerte Kritik überrascht sein, aber sie ist verständlich und du solltest sie ruhig als (etwas negativ anmutende) Hilfe verstehen und anwenden.

Hier sind Programmierer unterwegs, keine Spieledesigner - daher die Fokussierung auf technische Aspekte.

Auf eure Website habe ich nur einen flüchtigen Blick geworfen, aber in deinem ersten Beitrag lese ich:
Ferne Ziele sind noch:
- Multiplayerfähigkeit
- Künstliche Intelligenz
- Mehrere Gegner
Das ist wieder so ein Programmiererding. Bei Spielen ist aber an oberster Stelle wichtig, ein tolles Konzept zu haben. Obige Features machen ein schlechtes Spiel nicht gut, aber gute Spiele noch etwas besser. Wenn ihr mehr Wert auf das Spieldesign, die Story und aus dessen Umsetzung erschaffbare Atmosphäre setzt, haben die Spieler deutlich mehr davon. Der Rest kommt von allein.

Miko hat geschrieben:das ist das einzigste wo du falsch liegst.

2 ist kleiner als 12

aber 0.2 ist größer als 0.12

siehe 0.20 zu 0.12

die letzte null lässt man aber in der regel bei versionsnummer weg.

kommastellen werden quasi von "links nach rechts gelesen".
Da muss ich leider widersprechen: 0.2 ist definitiv kleiner als 0.12. Es gibt zahlreiche Beispiele in der Open Source-Welt (Closed Source-Produkte verwenden in der Regel keine derart Feingranularen Versionsnummern - vielleicht, weil sie denken, der gemeine Computerbild-Leser sei damit überfordert; daher kommen dann so "Versionsnummern" wie Paint Shop Pro 3/4/5/6/7..., oder schlimmer, Windows 2000/XP/Vista, Photoshop CS/CS2, ...), die eben korrekterweise so zählen, dass auf 0.9 dann 0.10 und 0.11 folgen.

Was du *meinst*, lässt sich durch 0.1.2 und 0.2 darstellen.
Miko

Antwort bevor ich den 2ten post gelesen habe:
---------------
erstmal danke für die kleine lektion in python.

aber so ganz ersichtlich ist es mir noch nicht.

ich dacht bei parametern von definierten funktionen könnt man keine variablen eintragen

Code: Alles auswählen

ergebnis = multipliziere(wert1, wert2)
da wird das aber gemacht. wenn das nämlich nicht geht wie übergeb ich dann die globalen werte wie metall?

also sollte ich lieber meine großen definitionen in mehrere häppchen aufteilen und dann jeweils per

GLOBALE_Variable = DEFINITION

berechnen lassen?

dann wird aber meine Steuerungs Sektion wieder länger da ich anstatt einem aufruf nun für jede variable eine zeile brauch.

Bitte habt verständniss dass jemand der sich in python noch nicht so gut auskennt eventuell nicht alles auf anhieb versteht.

aber wenn du heute abend keine lust mehr zum erklären hast ist auch kein thema. dann schau ich mir das noch ein paar mal an und verstehs dann schon.

schöne grüße
miko
---------------

ergänzung:

der 2te post machts nicht wirklich leichter für mich.
aber ich schau mir das morgen nochmal genauer an


-------------------------

zu den 2 letzten posts:
ich liebe jede sachliche kritik egal ob negativ oder positiv denn ich lern drauß.

zum thema 0.2 und 0.12
okay, kein ahnung ihr werdet recht haben.

ich bin da rein mathematisch vorgegangen und da ist ja 0,2 größer als 0,12

0,2 - 0,12 = 0,08 laut taschenrechner also 0,2 größer da positive zahl

naja meine durchnummerierung ist falsch ich werds ändern.


zum letzten:

naja technisch muss schon noch was mehr rein sonst würden wir ein text rpg machen. wir wollen ein strategiespiel was man immer wieder spielen kann weil es sich unterschiedlich entwickelt. ein textrpg spielt man nru einmal oder 2mal. danach kennt man es.
wir legen weniger wert auf storie und geskriptete sequenzen. aber story kommt natürlich noch. ist ja erst version 0.12 oder 0.1.2 oder was weis ich ^^

nochmals danke für das viele feedback find ich toll! ich hätte mehr erwarten jetzt schnauzen alle rum warum ich hier meinen kiddiecode poste. deswegen wollt ich garnichts schreiben aber mein teamkollege hat mich überedet.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Miko hat geschrieben:zu den 2 letzten posts:
ich liebe jede sachliche kritik egal ob negativ oder positiv denn ich lern drauß.
Genau das wollte ich hören :lol:
Miko hat geschrieben:zum thema 0.2 und 0.12
okay, kein ahnung ihr werdet recht haben.

ich bin da rein mathematisch vorgegangen und da ist ja 0,2 größer als 0,12

0,2 - 0,12 = 0,08 laut taschenrechner also 0,2 größer da positive zahl

naja meine durchnummerierung ist falsch ich werds ändern.
Versionsnummern sind keine Zahlen im mathematischen Sinne, sie sind eher eine Art Ordnung. Das ist zum Beispiel im Fall Firefox so: Firefox 1.0.0 wurde durch Firefox 1.5.0 ersetzt, jedoch wurde parallel dazu an Firefox immer noch gearbeitet und daher gab es Firefox 1.0.8. Du siehst, es gab also eine 1.0.x Serie und eine 1.5.x-Serie. Ebenso sieht es mit Python aus: 2.4.3 bezeichnet Python Version 2, Major Release 4 und Update 3. D.h. Python 2.4.0 und 2.4.3 sind so ziemlich identisch, jedoch wurden in letzterem paar Fehler ausgemerzt. Python 2.5.0 kann sich aber unter Umständen anders verhalten und viel mehr Änderungen haben. Der letzte vergleich ist der Linux Kernel, wo es die Serien 2.0, 2.2, 2.4 und 2.6 gibt, wobei 2.4 und 2.6 parrallel zueinander entwickelt werden. Du siehst, es ist eine Hierarchie, kein Wert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Miko

hm das war die erklärung die es mir beigebracht hat.

gut das mit den versionsnummern dürfte nun endgültig vom tisch sein.

aber für heut geh ich erstmal ins bett. morgen muss ich doch fitt für cobol sein. dann darf mir kein python im kopf rumspucken.

Cobol ist ja so schon kurz und bündig...................


night @ all
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Miko hat geschrieben:Cobol ist ja so schon kurz und bündig...................
Juhu, COBOL ist spassig genug, dass niemand einen freien Compiler unter Unices implementieren wollte :)

Lisp ist auch kurz und bündig.. dazu noch quasi syntaxfrei ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Miko

es gibt doch diesen tiny cobol. der ist doch frei. aber es stirbt eh aus.

wobei das jetzt nicht zum topic gehört. aber ein bisschen smalltalk muss ja auch sein. übersichtlich ist er eh nicht mehr.
BlackJack

Miko hat geschrieben:es gibt doch diesen tiny cobol. der ist doch frei. aber es stirbt eh aus.
Oder OpenCOBOL. Aber das mit dem Aussterben dauert wahrscheinlich noch eine Weile. Als dieses nette "Jahr 2000" Problem akut war, waren COBOL-Programmierer ziemlich begehrt. Es gab Studien laut denen damals ca. 60-70% der Unternehmenssoftware in COBOL geschrieben war.
wobei das jetzt nicht zum topic gehört. aber ein bisschen smalltalk muss ja auch sein. übersichtlich ist er eh nicht mehr.
SmallTalk, ja das muss sein. Ist auch hübscher als COBOL. ;-)
Antworten