Snake

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
abstract2411
User
Beiträge: 1
Registriert: Donnerstag 22. Oktober 2020, 00:09

Hallo,

ich bin neu im Forum und will mich zunächst einmal vorstellen:
Ich bin 14 Jahre alt und bin gerade dabei mir das Programmieren beizubringen. :geek:
Als Einstiegsprogrammiersprache habe ich deswegen Python gewählt.

Ich habe mir vorgenommen das Spiel Snake zu programmieren um mein logisches Denken zu erweitern und mich
hinsichtlich meiner Programmierkenntnisse zu erweitern.
Ich will mein erstes Spiel vorstellen und würde mich auf Verbesserungsvorschläge freuen.
Mir ist bei meinem Spiel jedoch aufgefallen, dass meine CPU sehr schnell überhitzt.
Könnte es daran liegen, weil ich Threads benutze oder ist es ein anderer.

Vielen Dank!

Code: Alles auswählen

import pygame
import threading
import random


pygame.init()

fenster = pygame.display.set_mode([500,500])
pygame.display.set_caption("Mein Spiel")

hoehe = 25
breite = 25
go = True
rechtsgedrueckt= False
linksgedrueckt = False
obengedrueckt = False
untengedrueckt = False
schlange = [[7,5],[6,5],[5,5],[4,5],[3,5],[2,5],[1,5]]
schlangenkopf = schlange[0]
startevent=False
kollision = False
futter = [12,12]


def ereignis():
	global kollision, schlangenkopf, rechtsgedrueckt, linksgedrueckt
	while go:
		i = len(schlange) - 1

		if rechtsgedrueckt == True:

			while(i>0):
				schlange[i][0] = schlange[i-1][0]
				schlange[i][1] = schlange[i-1][1]
				i = i - 1
			schlangenkopf[0]+=1
		
		if linksgedrueckt == True:
			
			while(i>0):
				schlange[i][0] = schlange[i-1][0]
				schlange[i][1] = schlange[i-1][1]
				i = i - 1
			schlangenkopf[0]-=1
		
		if obengedrueckt == True:
			while(i>0):
				schlange[i][0] = schlange[i-1][0]
				schlange[i][1] = schlange[i-1][1]
				i = i - 1
			schlangenkopf[1]-=1

		if untengedrueckt == True:
			while(i>0):
				schlange[i][0] = schlange[i-1][0]
				schlange[i][1] = schlange[i-1][1]
				i = i - 1
			schlangenkopf[1]+=1


		##################################################################
		m = 1

		while(m<len(schlange)):
			if((schlangenkopf[0]==schlange[m][0] and schlangenkopf[1]==schlange[m][1])
				or (schlangenkopf[0]>19 or schlangenkopf[0]<0 or schlangenkopf[1]<0
					or schlangenkopf[1]>19)):
				kollision = True
				break
			m = m + 1

		if kollision == True:
			break

		##################################################################
		f = 0


		if (schlangenkopf[0] == futter[0] and schlangenkopf[1] == futter[1]):
			schlange.insert(0,[futter[0],futter[1]])
			schlangenkopf = schlange[0]
			futter[0] = int(random.random() *20)
			futter[1] = int(random.random() *20)
			while(f < len(schlange)):
				if(schlange[f][0]==futter[0] and schlange[f][1]==futter[1]):
					futter[0] = int(random.random() *20)
					futter[1] = int(random.random() *20)
				f = f + 1



		fenster.fill((0,0,0))

		for a in schlange:
			pygame.draw.rect(fenster, (255,80,9),(a[0]*25,a[1]*25,hoehe,breite))

		pygame.draw.rect(fenster, (100,89,8),(futter[0]*25,futter[1]*25,25,25))

		pygame.display.update()
		pygame.time.delay(100)


while go:

	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			go = False

	keys = pygame.key.get_pressed()

	if linksgedrueckt == False:
		if keys[pygame.K_RIGHT]:
			rechtsgedrueckt = True
			linksgedrueckt = obengedrueckt = untengedrueckt = False

	if rechtsgedrueckt == False:
		if keys[pygame.K_LEFT]:
			linksgedrueckt = True
			rechtsgedrueckt = obengedrueckt = untengedrueckt = False

	if untengedrueckt == False:
		if keys[pygame.K_UP]:
			obengedrueckt = True
			linksgedrueckt = rechtsgedrueckt = untengedrueckt = False

	if obengedrueckt == False:
		if keys[pygame.K_DOWN]:
			untengedrueckt = True
			linksgedrueckt = obengedrueckt = rechtsgedrueckt = False

	pygame.time.delay(20)

	if startevent == False:
		startevent = True
		t = threading.Thread(target = ereignis)
		t.daemon = True
		t.start()


pygame.quit()

Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@abstract2411: Egal woran es liegt, Du kannst da so keine Threads verwenden. Die greifen beide auf Pygame zu und das nicht threadsicher. Dass das überhaupt läuft ist also eher Glück/Zufall und nicht garantiert.

Ich sehe auch gar keinen Grund das hier auf zwei Threads zu verteilen.

Sonstige Anmerkungen: Eingerückt wird in Python mit vier Leerzeichen pro Ebene, nicht mit Tabs.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Vergiss bitte gleich wieder, dass es ``global`` überhaupt gibt.

Edit: ``while`` ist keine Funktion, das sollte man also nicht so schreiben als wäre es eine. Die Klammern gehören da nicht um die Bedingungen.

Dann solltest Du schauen welche Deiner ``while``-Schleifen eigentlich ``for``-Schleifen sein sollten. Und welche davon dann nicht über einen Index sondern direkt über die Objekte aus einer Liste.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten