Neueinsteiger plant Dart-Software

Du hast eine Idee für ein Projekt?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist einfach lineare Algebra, „die Spalten der Matrix sind die Bilder der Basisvektoren“. Musste ich halt im Studium machen. Wenn du das nicht hattest, ist es auch nicht in 2 Minuten erklärt, und letztlich ja auch nicht so wichtig.
thludwig
User
Beiträge: 21
Registriert: Dienstag 23. Juni 2020, 06:39

So, getestet.....wenn ich deine Matrix verwende, sind die Achsen getauscht, aber die Y-Achse ist ebenso wie die X-Achse invertiert

Wenn ich dann wieder das - vor die 1 setze, hängt der Mauspfeil am oberen Rand fest

Wenn ich in meiner ursprünglichen Matrix das - vor der 1 entferne, hängt er am unteren.

:?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wo setzt du die -1 hin? Da kommt’s schon auf das Detail an.
thludwig
User
Beiträge: 21
Registriert: Dienstag 23. Juni 2020, 06:39

0 1 0
-1 0 1
0 0 1
"Meine Variante": X-/Y-Achsen korrekt, X-Achse invertiert

0 1 0
1 0 0
0 0 1
Deine Variante: X-/Y-Achsen korrekt, aber beide invertiert

0 1 0
-1 0 0
0 0 1
Deine Variante mit - vor der 1: Maus hängt am oberen Rand fest

0 1 0
1 0 1
0 0 1
"Meine" Variante ohne - vor der 1: Maus hängt am unteren Rand fest
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann muß es wohl
0 -1 1
-1 0 1
0 0 1
heißen.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

thludwig hat geschrieben: Mittwoch 15. Juli 2020, 14:02 Ist das irgendwo besser (einfacher) erklärt, warum deine Änderung jetzt die zwei Achsen tauscht?
https://www.youtube.com/watch?v=WrntVIgRCbI

Ich weiß nicht, ob das komplett ohne Vorkenntnisse verständlich ist, aber er erklärt das finde ich sehr schön und vielleicht wird damit zumindest die "Mechanik" klar, mit der man Matrizen anwendet, um Punkte/Vektoren auf andere abzubilden. Auf diese Weise kannst du für eine Matrix von Hand ausrechnen, ob das Ergebnis herauskommt, das heraus kommen müsste. (Mir ist nicht ganz klar, warum man bei einem 2D Bildschirm 3 Koordinaten hat; einfach nur, damit es generisch ist und der unterste Wert ist immer 0/1?)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@nezzcarth wie verschiebst du denn mit einer 2x2 Matrix einen Punkt? Gerade auch den 0-Punkt?

Aus dem gleichen Grund sind Matrizen in 3D 4x4.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

@__deets__
Da endet wohl dann mein übrig gebliebenes WIssen aus der Schule ;). Ich hätte gesagt, durch Multiplikation mit einer Abbildungsmatrix gar nicht, sondern durch Addition mit einem Verschiebungsvektor. Danke für den Hinweis.
thludwig
User
Beiträge: 21
Registriert: Dienstag 23. Juni 2020, 06:39

Sirius3 hat geschrieben: Mittwoch 15. Juli 2020, 18:09 Dann muß es wohl
0 -1 1
-1 0 1
0 0 1
heißen.
Ja Mann, das isses Bild

Vielen Dank!!

Kalibrierung hab ich auch mal durchlaufen und ein paar Korrekturparameter bekommen (an die Ränder komme ich noch nicht).

shit, wenn das klappt, muss ich ja doch programmieren lernen :mrgreen: :wink:

Ich werde mal noch versuchen, mir die Kombinationen aufzuschreiben, vielleicht steige ich ja doch noch dahinter, wie das funktioniert.


Gruß
Thorsten
Kanaax
User
Beiträge: 17
Registriert: Mittwoch 5. August 2020, 09:15

Moin,
so eine idee hatte ich selbst auch schon :). Es gibt aber auch schon sehr gute mobile Apps. ist es nicht einfacher sich ein tablet zu kaufen und dort dann zu spielen? Ansonsten würde ich mich dir gerne anschließen, da ich eine ähnliche idee habe und Python lernen möchte.
Benutzeravatar
Briter
User
Beiträge: 4
Registriert: Freitag 14. August 2020, 18:31

thludwig hat geschrieben: Mittwoch 15. Juli 2020, 14:02 Wie gesagt, ich hatte das so aus dem Netz übernommen und die Achsen waren zumindest so, dass bei hoch/runter bzw. links/rechts der Mauspfeil sich auch in der entsprechenden Achse bewegt hat.
Da ich nicht gecheckt habe, wie das mit der Matrix funktioniert, konnte ich weiter nichts tun.
Dann stellt sich heraus, dass die änderung der beiden Parameter der Achse in diesem Fall unvermeidlich ist?
NewJoX
User
Beiträge: 10
Registriert: Samstag 30. Januar 2021, 17:04

Moinsen,

ich habe mir das gleiche Projekt ausgesucht. Ich schreibe das Programm mit kivy und ich habe es schon so weit geschafft, das es von 501 runter rechnen kann. ich möchte nun den Average berechnen lassen wie kriege ich das am besten programmiert?

Ich denke mal es ist am Besten die Versuche in einer Liste einzufügen und diese dann berechnen zu lassen mit sum[ ] und teilen durch len[ ].
Dies klappt auch mit einer Funktion aber wie kann man die Ergebnisse einer Funktion speichern lassen, denn ich kriege aktuell nur die einzelne Werte in die Liste unter und der vorherige Wert wird dann vergessen.

Gruß Jan
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wie ist denn dein Programm aufgebaut? Kannst du nicht ein Dictonary erstellen, in der du für jeden Spieler das Ergebnis deiner Funktion abspeicherst und dann, je nach dem wann es gebraucht wird, rufst du es von dort wieder ab?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
NewJoX
User
Beiträge: 10
Registriert: Samstag 30. Januar 2021, 17:04

Ich habe jetzt hin und her probiert und es klappt nun auch mit Average aber eigentlich möchte ich das so machen wie du es vorgeschlagen hast. Doch dies bekomme ich nicht hin.

def button_pressed(self, button):
if self.root.ids.outputLabel5.text == "0":
self.root.ids.outputLabel5.text = button.text
else:
self.root.ids.outputLabel5.text += button.text

def berechne2(self):
a = int(self.root.ids.outputLabel5.text)
b = int(self.root.ids.outputLabel1.text)
c = b-a
c = str(c)
d = str(a)
f = int(self.root.ids.outputLabel2.text)
g = f+a
h = str(g)

self.root.ids.outputLabel1.text = c
self.root.ids.outputLabel5.text = d
self.root.ids.outputLabel2.text = h

def reset(self):
self.root.ids.outputLabel5.text = "0"

def Anzahldarts(self):
Anzahl = int(self.root.ids.outputLabel3.text)
Anzahl1 = Anzahl + 3
Anzahl2 = str(Anzahl1)
self.root.ids.outputLabel3.text = Anzahl2

def Average(self):
Versuche = int(self.root.ids.outputLabel3.text)
Versuche1 = Versuche/3
Punkte = int(self.root.ids.outputLabel2.text)
Average = Punkte/Versuche1
Average1 = int(Average)
Average2 = str(Average1)
self.root.ids.outputLabel4.text = Average2

Ich hatte dann probiert es mit Listen zu machen aber ich weiß nicht wie ich das Ergebnis speicher wie du es meinst wie ich das machen müsste.

Ich hatte es so vor:
def Average(self):
Versuche = int(self.root.ids.outputLabel5.text)
Versuche1 = [ ]
Versuche1.append(Versuche)

Er fügt den Versuch in die Liste aber behält diesen nicht.
Bild

Die Anzeige ist aktuell

Name, Punkte Rest, Erzielte Punkte, Anzahl Versuche, Average, Eingabe.

Der Code ist schlecht geschrieben ich weiß... jeder Anfang ist schwer :D
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

tut mir leid, aber das ist mir zu undurchsichtig. So viele Buchstaben und Label's von denen man(ich) nicht versteht zu was sie da sind.

Schau mal unter 5.5 https://docs.python.org/3/tutorial/datastructures.html so etwas habe ich gemeint.

Beispiel:

Code: Alles auswählen

from random import randint

def calculate_average(score, throws):
    if score > 0:
        average = round(score / throws, 2)
    else:
        average = 0
    return average

def simulate_game():
    score = randint(0, 180)
    throws = 3
    return score, throws

def main():
    averages =dict([('Hans', 0), ('Karle', 0), ('Horst', 0), ('Eugen', 0)])
    for player in averages:
        score, throws = simulate_game()
        average = calculate_average(score, throws)
        averages[player] = average
    print(averages)
    print(averages['Karle'])

if __name__ == '__main__':
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@NewJoX: Die Namen sind teilweise sehr schlecht gewählt. Ein Name soll dem Leser vermitteln was der Wert dahinter bedeutet. Einbuchstabige Namen oder irgendwelche supergenerischen nummerierten Namen tun das so überhaupt nicht.

Du bindest auch deutlich zu viele belanglose Zwischenergebnisse an Namen. Nehmen wir mal `berechne2()`. Da wird `a` an den Inhalt von `outputLabel5` in eine Zahl gewandelt gebunden, dann `d` wieder an eine Zeichenkettendarstellung dieser Zahl, um die dann wieder in dem Label anzuzeigen. Da wird also die Zahl angezeigt die da sowieso schon angezeigt wurde. Warum? Wenn man das und die ganzen Zwischenergebnisse weglässt:

Code: Alles auswählen

    def berechne2(self):
        a = int(self.root.ids.outputLabel5.text)
        b = int(self.root.ids.outputLabel1.text)
        c = b-a
        c = str(c)
        d = str(a)
        f = int(self.root.ids.outputLabel2.text)
        g = f+a
        h = str(g)

        self.root.ids.outputLabel1.text = c
        self.root.ids.outputLabel5.text = d
        self.root.ids.outputLabel2.text = h
    
    # =>
    
    def berechne2(self):
        a = int(self.root.ids.outputLabel5.text)
        self.root.ids.outputLabel1.text = str(
            int(self.root.ids.outputLabel1.text) - a
        )
        self.root.ids.outputLabel2.text = str(
            int(self.root.ids.outputLabel2.text) + a
        )
Selbst mit den bescheidenen Namen sieht man hier leichter was passiert. Und das man da theoretisch eine Methode herausziehen könnte die eine Zahl in einem Textlabel um einen Betrag verändert. Aaaber, das was da passiert ist nicht gut. Man verwendet eine GUI zur Ein- und Ausgabe von Werten, nicht um Zahlwerte in Textlabeln zu speichern. Das ist furchtbar umständlich und man hat so überhaupt gar keine Trennung zwischen GUI und Programmlogik.

Funktions- und Methodennamen beschreiben üblicherweise die Tätigkeit die sie durchführen. Auch damit sie einfacher von eher passiven Werten unterscheiden kann. `average` wäre ein guter Name für einen Durchschnitts*wert*, aber nicht für eine Methode die den berechnet.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
NewJoX
User
Beiträge: 10
Registriert: Samstag 30. Januar 2021, 17:04

Danke für die Kritik, mir ist bewusst das dort unnötige Schritte drin sind.
Ich weiß das es so ist kann es aber nicht beheben, da mir einfach noch das Wissen fehlt.

Ich hab meinen groben Fehler selber entdeckt das mit der Liste hat nicht geklappt da es nur local in der Funktion war und deswegen wurden die Daten nicht behalten. (Böser Anfängerfehler) Jetzt kann ich mir das mit den meisten Labels sparen und arbeite mit der Liste.

Zur meiner Person ich mache beruflich was anderes als programmieren und bin auch kein Informatikstudent oder sonstiges . Ich lerne das programmieren mit einer App und mir macht es viel Spaß dies zu lernen. Leider fehlt mir dadurch das ich beruflich was anderes mache, die Möglichkeit mich mit anderen auszutauschen deswegen benutze ich dieses Forum.

In den meisten Sachen muss ich mich einfach noch reinfuchsen doch vielleicht könntet ihr mir noch bei einem Problem helfen und zwar wie ich die Ergebnisse speichern kann. Dies wurde in der App nicht beschrieben und bei Google habe ich dazu nichts passendes gefunden. Ich müsste dazu ja irgendwie eine externe Datei kreieren um dort Ergebnisse abspeichern zu können, denn ich möchte die Ergebnisse natürlich behalten, wenn ich die App schließe.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wie wäre es mit einer *.csv-Datei?
https://docs.python.org/3/library/csv.html
NewJoX hat geschrieben: Mittwoch 10. März 2021, 05:01 Zur meiner Person ich mache beruflich was anderes als programmieren und bin auch kein Informatikstudent oder sonstiges .
Dito, "einfach" am Ball bleiben. Ich hatte auch schon einige "Nervenzusammenbrüche" :lol:


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Falls 2D-Daten/eine Tabelle nicht ausreicht zur Strukturierung kommt oft auch das JSON-Format in Betracht, mit dem `json`-Modul aus der Standardbibliothek.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
NewJoX
User
Beiträge: 10
Registriert: Samstag 30. Januar 2021, 17:04

Moinsen,
leider benötige ich nochmal eure Hilfe , denn ich komm nicht weiter. Da ich mehrere Screens benötige habe ich nun mit Screenmanager mehrere Screens erschaffen doch das Problem ist nun das ich auf den einzelnen Screens einfach keinen Zugriff mehr auf die Id´s finde.
Ich habe dafür ein Testprogramm erschaffen um dort herumzuprobieren ob ich Zugriff finde, doch es klappt nicht.

class ScreenOne(Screen):
pass


class ScreenTwo(Screen):
pass


class ScreenThree(Screen):
pass


class ScreenFour(Screen):
pass


class ScreenFive(Screen):
pass

screen_manager = ScreenManager()

screen_manager.add_widget(ScreenOne(name="screen_one"))
screen_manager.add_widget(ScreenTwo(name="screen_two"))
screen_manager.add_widget(ScreenThree(name="screen_three"))
screen_manager.add_widget(ScreenFour(name="screen_four"))
screen_manager.add_widget(ScreenFive(name="screen_five"))

class ScreenApp(App):

def build(self):
return screen_manager

def reset(self):
self.root.OutputLabel.text = "1"

def Definition(a,b,c,d):
for x in [a,b,c,d]:
print(x)

<ScreenFive>:
BoxLayout:
Label:
id: OutputLabel
text: "500"
Button:
text: "Go to Screen 1"
background_color : 1, 0, 0, 1
on_press:
root.manager.transition.direction = 'right'
root.manager.current = 'screen_one'
TextInput:
id: my_textinput
Button:
text: "Test"
on_release: app.Definition(self,root,app)

<__main__.ScreenApp object at 0x00000203752C6908>
<kivy.uix.button.Button object at 0x00000203752C66D8>
<Screen name='screen_five'>
<__main__.ScreenApp object at 0x00000203752C6908>

das wäre die Ausgabe für app.Definition. Das Problem liegt wohl das root (Screen name='screen_five') zurück gibt was vorher nicht der Fall war.
Antworten