Simples Schach Game to dive into Python

Fragen zu Tkinter.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Leonidas hat geschrieben: Genug. Was mich an Tkinter auch stört, wofür aber Tkinter selbst nichts kann ist, dass viele Quellcodes die Tkinter nutzen nicht PEP8-konform
Ich persönlich kenne nicht sehr viele Leute die damit ein Problem haben.
( höchstens 2 aus diesem Forum )
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

pyStyler hat geschrieben:[...]
( höchstens 2 aus diesem Forum )
Da sind aber noch ein par mehr hier im Forum, denen non-PEP8 konformer Code stört.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Leonidas hat geschrieben:
skypa hat geschrieben:ich könnte Canvas ja beibehalten oder nicht? :shock:
Du meinst, das Canvas-Widget in anderen Toolkits zu verwenden? Nein, das geht nicht.

Nein ich meinte damit, dass ich es von dir so verstanden habe, das Canvas (sprich Tkinter) für mein Vorhaben voll und ganz ausreichen...

wobei ich imho nicht weiß wie ich den rest damit erstelle der noch fehlt.. sprich Figuren...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

skypa hat geschrieben:Nein ich meinte damit, dass ich es von dir so verstanden habe, das Canvas (sprich Tkinter) für mein Vorhaben voll und ganz ausreichen...
Ich finde ja.

Was die Figuren betrifft:
Entweder du zeichnest die Figuren und lädst die Bilder in Tkinter (wurde hier im Forum schon mehrmals gezeigt, such mal ;))
Oder, wenns nur einfache Grafiken sein sollen, könnte man das auch so ähnlich machen:

Code: Alles auswählen

import Tkinter as tk

def draw_rook( canvas, x, y, size, color="black" ):
    coords = [
        x         , y,
        x + 5*size, y,
        x + 5*size, y - 2*size,
        x + 4*size, y - 2*size,
        x + 4*size, y - 6*size,
        x + 5*size, y - 6*size,
        x + 5*size, y - 8*size,
        x + 4*size, y - 8*size,
        x + 4*size, y - 7*size,
        x + 3*size, y - 7*size,
        x + 3*size, y - 8*size,
        x + 2*size, y - 8*size,
        x + 2*size, y - 7*size,
        x + size  , y - 7*size,
        x + size  , y - 8*size,
        x         , y - 8*size,
        x         , y - 6*size,
        x + size  , y - 6*size,
        x + size  , y - 2*size,
        x         , y - 2*size
    ]
    canvas.create_polygon( coords, fill=color)

root = tk.Tk()
c = tk.Canvas()
c.pack()
draw_rook(c, 100, 100, 10)

root.mainloop()
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Ahh ! :D

Ich glaub damit kann ich was anfangen...
Demzufolge erstell ich für jede Figur so eine Klasse, die das Aussehen beeinhaltet...?!

Die Bewegung der Figuren ist mir noch ein Rätsel, aber ich test mich da mal weiter Schritt für Schritt ran.

Bin nun auch etwas im Klareren über OOP, in den nächsten Tagen release ich dann mal ein Zwischenergebnis.

Und vielen Dank für eure Anteilnahme! :roll:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

pyStyler hat geschrieben:Ich persönlich kenne nicht sehr viele Leute die damit ein Problem haben.
( höchstens 2 aus diesem Forum )
Wow. Dann schau mal in die Mailingliste, die Newsgroup und den IRC-Channel. Wenn den meisten Leuten PEP8 scheinbar so egal wäre wie dir - warum sind dann viele Python-Programme exakt so geschrieben, wie im Styleguide steht?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

@mawe:

Ich hab soeben mal dein Beispiel ausprobiert... ehm gibts noch andere grafische Lösungen??? :lol:

Das Game soll zwar simple sein, aber etwas anspruchsvoll schon :roll:


Weil das ist nicht grad die "hübscheste" Lösung... was kann man sonst noch machen?
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

skypa hat geschrieben:@mawe:

Ich hab soeben mal dein Beispiel ausprobiert... ehm gibts noch andere grafische Lösungen??? :lol:

Das Game soll zwar simple sein, aber etwas anspruchsvoll schon :roll:
[...]
KlBMT05LKg==
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sape hat geschrieben:KlBMT05LKg==
OK, sape - jetzt hatten wir unseren Spaß, jetzt können wir das für einige Zeit sein lassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Code: Alles auswählen

from Tkinter import *
from thread import*
import Image
import ImageTk
import array

# 0,0: Turm		T
# 0,1: Pferd		P
# 0,2: Läufer		L
# 0,3: Dame		D
# 0,4: König		K
# 0,5: Läufer
# 0,6: Pferd		P
# 0,7: Turm		T 
# 1,0 - 1,7: Bauer	B
# 6,0 - 6,7: Bauer
# 7,0: Turm
# 7,1: Pferd
# 7,2: Läufer
# 7,3: Dame
# 7,4: König
# 7,5: Läufer
# 7,6: Pferd
# 7,7: Turm 

"""
ursprung = [
['T', 'P', 'L', 'D', 'K', 'L', 'P', 'T'],
['B' for x in range(8)],
['0' for x in range(8)],
['0' for x in range(8)],
['0' for x in range(8)],
['0' for x in range(8)],
['B' for x in range(8)],
['T', 'P', 'L', 'D', 'K', 'L', 'P', 'T']
]
"""

root = Tk()
img_bauer = PhotoImage(file="bauer.gif")
img_bg = PhotoImage(file="bg.gif")

class Spielfigur(object):
	def __init__(self, pid, startpos, canvas, spieler):
		self.pid = pid
		self.pos = startpos
		self.spieler = spieler
		self.canvas = canvas
		self.dead = False
		if pid == "B":
			self.image = canvas.create_image(self.pos, image=img_bauer, anchor=NW)
		else:
			self.image = 0
	
	def GetPosition(self):
		return self.pos
	
	def GetImage(self):
		return self.image
	
	def SetPosition(self, new_pos):
		self.pos = new_pos
		self.canvas.coords(self.image, self.pos)
		
	def AllowedMove(self, previous_pos, new_pos):
		if self.pid == 'B':
			if self.spieler == 'oben':
				bewegung_y = new_pos[1] - previous_pos[1]
				if previous_pos[0] != new_pos[0] or bewegung_y != 50:
					return False
			elif self.spieler == 'unten':
				bewegung_y = new_pos[1] - previous_pos[1]
				if previous_pos[0] != new_pos[0] or bewegung_y != -50:
					return False
			
		return True
	
	def Kill(self):
		if self.dead == False:
			if self.image != 0:
				self.canvas.delete(self.image)
			self.dead = True
		
	def IsDead(self):
		return self.dead


class Application:
	def __init__(self):
		self.clicked_figur = False
		self.canvas = Canvas(root, width=400, height=400)
		self.canvas.bind("<ButtonPress>", self.click)
		self.canvas.bind("<Motion>", self.move)
		self.canvas.bind("<ButtonRelease>", self.release)
		self.canvas.pack()

		# bilder für die figuren laden
		
		bg = self.canvas.create_image(0, 0, image=img_bg, anchor=NW)
		self.canvas.coords(bg,0,0)
		self.spielfiguren = []
		
		spieler_weiss = [
		['T', 'P', 'L', 'D', 'K', 'L', 'P', 'T'],
		['B' for x in range(8)],
		]
		
		for x in range(8):
			for y in range(2):
				if spieler_weiss[y][x] != "0":
					figur = Spielfigur(spieler_weiss[y][x], (x*50, y*50), self.canvas, 'oben')
					self.spielfiguren.append(figur)

		spieler_schwarz = [
		['B' for x in range(8)],
		['T', 'P', 'L', 'D', 'K', 'L', 'P', 'T']
		]
		
		for x in range(8):
			for ty in range(2):
				y = ty + 6
				if spieler_schwarz[ty][x] != "0":
					figur = Spielfigur(spieler_schwarz[ty][x], (x*50, y*50), self.canvas, 'unten')
					self.spielfiguren.append(figur)

	def KillFigureOnPosition(self, position):
		for figur in range(32):
			if self.spielfiguren[figur].GetPosition() == position:
				print figur
				self.spielfiguren[figur].Kill()

	def click(self, event):
		for figur in range(32):
			if self.spielfiguren[figur].IsDead() == False:
				pos = self.spielfiguren[figur].GetPosition()
				if event.x > pos[0] and event.x < pos[0]+50 and event.y > pos[1] and event.y < pos[1]+50:
					self.clicked_figur = figur
					self.previous_pos = pos
					self.abstand_x = event.x % 50
					self.abstand_y = event.y % 50
	
	def move(self, event):
		if self.clicked_figur != False:
			#print self.clicked_figur
			self.spielfiguren[self.clicked_figur].SetPosition((event.x-self.abstand_x, event.y-self.abstand_y))

	def release(self, event):
		if self.clicked_figur != False:
			pos = self.spielfiguren[self.clicked_figur].GetPosition()
			pos = (pos[0]+25, pos[1]+25)
			new_pos = (pos[0]- ((pos[0])%50), pos[1] - ((pos[1])%50))
			print new_pos
			if self.spielfiguren[self.clicked_figur].AllowedMove(self.previous_pos, new_pos) and self.previous_pos != new_pos:
				self.KillFigureOnPosition(new_pos)
				self.spielfiguren[self.clicked_figur].SetPosition(new_pos)
			else:
				self.spielfiguren[self.clicked_figur].SetPosition(self.previous_pos)
			self.clicked_figur = False


app = Application()
root.mainloop()

Soweit war ich gekommen, vlt intressierts ja einen.

Wenn jemand Lust hat daran weiter zu arbeiten mit mir, soll sich melden?! ;)
Antworten