I'm making a simple game in python using Tkinter. The game is the tron bike game which, if you are not familiar with, the point is to destroy the other bike by making it cross your path. I had it all working fine with just one bike. However, when I tried to add another bike to be controlled by another playing using the same keyboard I had a control issue where moving one bike moves both. I thought it would be very easy to add another bike using the same method as I did for the first, but as you can see I'm having problems. Maybe someone knows a better way to tackle the multiplayer element? It might be a very simple fix but it's escaping me right now.
import random
from Tkinter import *
def mousePressed(event):
redrawAll()
def keyPressed(event):
canvas.data.ignoreNextTimerEvent = True
if (event.char == "q"):
gameOver()
elif (event.char == "r"):
init()
elif (event.char == "d"):
canvas.data.inDebugMode = not canvas.data.inDebugMode
if (canvas.data.isGameOver == False):
if (event.keysym == "Up"):
moveBike(-1, 0)
elif (event.keysym == "Down"):
moveBike(+1, 0)
elif (event.keysym == "Left"):
moveBike(0,-1)
elif (event.keysym == "Right"):
moveBike(0,+1)
elif (event.keysym == "a"):
moveBike2(0,-1)
elif (event.keysym == "s"):
moveBike2(+1,0)
elif (event.keysym == "w"):
moveBike2(-1,0)
#elif (event.keysym == "d"):
moveBike2(0, +1)
redrawAll()
def moveBike2(drow, dcol):
canvas.data.bike2Drow = drow
canvas.data.bike2Dcol = dcol
tronBoard = canvas.data.tronBoard
rows = len(tronBoard)
cols = len(tronBoard[0])
bike2Row = canvas.data.bike2Row
bike2Col = canvas.data.bike2Col
newBike2Row = bike2Row + drow
newBike2Col = bike2Col + dcol
canvas.data.path2.append((newBike2Row, newBike2Col))
if ((newBike2Row < 0) or (newBike2Row >= rows) or
(newBike2Col < 0) or (newBike2Col >= cols)):
gameOver()
elif (tronBoard[newBike2Row][newBike2Col] > 0):
gameOver()
elif (tronBoard[newBike2Row][newBike2Col] == 0):
tronBoard[newBike2Row][newBike2Col] = tronBoard[bike2Row][bike2Col] - 1
canvas.data.bike2Row = newBike2Row
canvas.data.bike2Col = newBike2Col
## else:
## tronBoard[newBike2Row][newBike2Col] = 1 + tronBoard[bike2Row][bike2Col]
## canvas.data.bike2Row = newBike2Row
## canvas.data.bike2Col = newBike2Col
def moveBike(drow, dcol):
canvas.data.bikeDrow = drow
canvas.data.bikeDcol = dcol
tronBoard = canvas.data.tronBoard
rows = len(tronBoard)
cols = len(tronBoard[0])
bikeRow = canvas.data.bikeRow
bikeCol = canvas.data.bikeCol
newBikeRow = bikeRow + drow
newBikeCol = bikeCol + dcol
canvas.data.path1.append((newBikeRow, newBikeCol))
if ((newBikeRow < 0) or (newBikeRow >= rows) or
(newBikeCol < 0) or (newBikeCol >= cols)):
gameOver()
elif (tronBoard[newBikeRow][newBikeCol] > 0):
gameOver()
elif (tronBoard[newBikeRow][newBikeCol] == 0):
tronBoard[newBikeRow][newBikeCol] = 1 + tronBoard[bikeRow][bikeCol];
canvas.data.bikeRow = newBikeRow
canvas.data.bikeCol = newBikeCol
## else:
## tronBoard[newBikeRow][newBikeCol] = 1 + tronBoard[bikeRow][bikeCol];
## canvas.data.bikeRow = newBikeRow
## canvas.data.bikeCol = newBikeCol
#removeTail()
def gameOver():
canvas.data.isGameOver = True
def timerFired():
tronBoard = canvas.data.tronBoard
ignoreThisTimerEvent = canvas.data.ignoreNextTimerEvent
canvas.data.ignoreNextTimerEvent = False
if ((canvas.data.isGameOver == False) and
(ignoreThisTimerEvent == False)):
drow = canvas.data.bikeDrow
dcol = canvas.data.bikeDcol
moveBike(drow, dcol)
moveBike2(drow, dcol)
redrawAll()
delay = 50
drawBikePath()
drawBike2Path()
print tronBoard[canvas.data.bike2Row][canvas.data.bike2Col]
canvas.after(delay, timerFired)
def redrawAll():
#drawBikePath1()
cx = canvas.data.canvasWidth/2
cy = canvas.data.canvasHeight/2
if (canvas.data.isGameOver == True):
canvas.create_text(cx, cy, text="Game Over!", fill = "red",
font=("Helvetica", 32, "bold"))
def drawBikePath():
row,col = canvas.data.path1[-1]
margin = canvas.data.margin
cellSize = canvas.data.cellSize
left = margin + col *cellSize
right = left + cellSize
top = margin + row*cellSize
bottom = top + cellSize
canvas.create_rectangle(left, top, right, bottom, fill="green")
def drawBike2Path():
row,col = canvas.data.path2[-1]
margin = canvas.data.margin
cellSize = canvas.data.cellSize
left = margin + col *cellSize
right = left + cellSize
top = margin + row*cellSize
bottom = top + cellSize
canvas.create_rectangle(left, top, right, bottom, fill="purple")
def drawTronBoard():
tronBoard = canvas.data.tronBoard
rows = len(tronBoard)
cols = len(tronBoard[0])
for row in range(rows):
for col in range(cols):
drawTronCell(tronBoard, row, col)
def drawTronCell(tronBoard, row, col):
margin = canvas.data.margin
cellSize = canvas.data.cellSize
bikeRow = canvas.data.bikeRow
bikeCol = canvas.data.bikeCol
left = margin + col * cellSize
right = left + cellSize
top = margin + row * cellSize
bottom = top + cellSize
canvas.create_rectangle(left, top, right, bottom, fill="black", outline="brown")
if (tronBoard[row][col] > 0):
canvas.create_rectangle(left, top, right, bottom, fill="green")
## elif (tronBoard[row][col] < 0):
## canvas.create_rectangle(left, top, right, bottom, fill="green")
## if (tronBoard[row][col]==tronBoard[bikeRow][bikeCol]):
## canvas.create_rectangle(left, top, right, bottom, fill = "purple")
if (canvas.data.inDebugMode == True):
canvas.create_text(left+cellSize/2,top+cellSize/2,
text=str(tronBoard[row][col]),font=("Helvatica", 14, "bold"))
def loadTronBoard():
rows = canvas.data.rows
cols = canvas.data.cols
tronBoard = [ ]
for row in range(rows): tronBoard += [[0] * cols]
tronBoard[rows/2][cols/8] = 1
tronBoard[rows/2][cols-cols/8] = -1
canvas.data.tronBoard = tronBoard
findBike()
findBike2()
#placeBoost()
def placeBoost():
tronBoard = canvas.data.tronBoard
rows = len(tronBoard)
cols = len(tronBoard[0])
while True:
row = random.randint(0,rows-1)
col = random.randint(0,cols-1)
if (tronBoard[row][col] == 0):
break
tronBoard[row][col] = -1
def findBike():
tronBoard = canvas.data.tronBoard
rows = len(tronBoard)
cols = len(tronBoard[0])
bikeRow = 0
bikeCol = 0
for row in range(rows):
for col in range(cols):
if (tronBoard[row][col] > tronBoard[bikeRow][bikeCol]):
bikeRow = row
bikeCol = col
canvas.data.bikeRow = bikeRow
canvas.data.bikeCol = bikeCol
def findBike2():
tronBoard = canvas.data.tronBoard
rows = len(tronBoard)
cols = len(tronBoard[0])
bike2Row = 0
bike2Col = 0
for row in range(rows):
for col in range(cols):
if (tronBoard[row][col] < tronBoard[bike2Row][bike2Col]):
bike2Row = row
bike2Col = col
canvas.data.bike2Row = bike2Row
canvas.data.bike2Col = bike2Col
def printInstructions():
print "Press 'd' for debug mode."
print "Press 'r' to restart."
def init():
printInstructions()
loadTronBoard()
canvas.data.inDebugMode = False
canvas.data.isGameOver = False
canvas.data.path1 = []
canvas.data.path2 = []
canvas.data.bikeDrow = +1
canvas.data.bikeDcol = 0
canvas.data.bike2Drow = -1
canvas.data.bike2Dcol = 0
canvas.data.ignoreNextTimerEvent = False
drawTronBoard()
redrawAll()
########### copy-paste below here ###########
def run(rows, cols):
# create the root and the canvas
global canvas
root = Tk()
margin = 5
cellSize = 15
canvasWidth = 2*margin + cols*cellSize
canvasHeight = 2*margin + rows*cellSize
canvas = Canvas(root, width=canvasWidth, height=canvasHeight)
canvas.pack()
# Store canvas in root and in canvas itself for callbacks
root.canvas = canvas.canvas = canvas
# Set up canvas data and call init
class Struct: pass
canvas.data = Struct()
canvas.data.margin = margin
canvas.data.cellSize = cellSize
canvas.data.canvasWidth = canvasWidth
canvas.data.canvasHeight = canvasHeight
canvas.data.rows = rows
canvas.data.cols = cols
init()
# set up events
root.bind("<Button-1>", mousePressed)
root.bind("<Key>", keyPressed)
timerFired()
# and launch the app
root.mainloop() # This call BLOCKS (so your program waits until you close the window!)
run(40,40)

New Topic/Question
Reply



MultiQuote






|