#!/usr/bin/env python
'''slidepuzzle.py
A sliding puzzle game
by Nick Loadholtes
No warranty provided with this code. Use at your own risk.
version 1.3
'''
import random, cmath, curses, curses.wrapper, curses.ascii
side = "|"
newline = "\n"
_topborder = "_"
topb = ""
newscreen = "\n\n\n\n\n\n\n\n\n"
actual = []
size = 3
keypress = ""
stdscr = ""
gameinplay = 1
gamewon = 0
spacelocation = 0
def makeTopBorder():
sizeofboard = (size * 3) +1
pos = 0
global topb
topb = ""
while pos < sizeofboard:
topb += _topborder
pos += 1
#
#works
def displayBoard():
global stdscr, actual
sizeofboard = (size * size) -1
y = 0
x = 0
number = 0
output = newline + topb + newline
while y < size:
while x < size:
if(number < len(actual)):
output += side + "%(#)2s" % {"#":str(actual[number])}
number += 1
x += 1
else :
break
output += newline + topb + newline
x = 0
y += 1
stdscr.clear()
curses.init_pair(3, 7, 4)
stdscr.addstr(0, 0, output, curses.color_pair(3))
stdscr.refresh()
#
# Returns a "random" number from the range of size^2
def getNumberFromRange():
return random.randrange(1, (size * size) )
#
# Generates a randomized board
def generateBoard():
global actual, spacelocation
sizeofboard = (size * size)
x = 0
actual = []
while x < sizeofboard -1:
num = getNumberFromRange()
while checkBoard(num) != 0:
num = getNumberFromRange()
actual.append(num)
x += 1
actual.append(" ")
spacelocation = sizeofboard - 1
#
#
def checkBoard(num):
for x in actual:
if x == num:
return 1
return 0
#
# Checks to see if there is a win condition
def checkForWin():
global size, actual, gameinplay, stdscr, gamewon
sizeofboard = (size * size) - 1
broken = 0
if( (actual[sizeofboard]) == " "):
y = 1
for x in actual:
if(x != y):
if(x != " "):
broken = 1
break
y = y + 1
if (broken == 0):
gameinplay = 0
gamewon = 1
#
# Request a size from the user. Size can be 1-9 (but
# should be 2-9)
def getSize():
global size, stdscr
msg = "\nThe default size is " + str(size) + "\nWhat size board would you like?"
size = "a"
while (not curses.ascii.isdigit(size) ):
stdscr.addstr(msg)
stdscr.refresh()
size = stdscr.getch()
size = size- 48
#
# Get the user input (during the game) and either quit or
# attempt to move the space.
def getInput():
global keypress, stdscr, gameinplay
stdscr.addstr("Press an arrow key to move the space (q to quit)?")
stdscr.refresh()
keypress = stdscr.getch()
if(keypress == curses.KEY_UP):
doMovement(2)
elif(keypress == curses.KEY_DOWN):
doMovement(1)
elif(keypress == curses.KEY_LEFT):
doMovement(4)
elif(keypress == curses.KEY_RIGHT):
doMovement(3)
elif(keypress == 81 or keypress ==113):
gameinplay = 0
stdscr.refresh()
#
# Attempt to move the space. If it can't be move, nothing
# happens and the game loop re-prompts for a move.
def doMovement(direction):
global actual, spacelocation, size, stdscr
row = spacelocation / size
if(direction == 1):
newlocation = spacelocation + size
elif(direction == 2):
newlocation = spacelocation - size
elif(direction == 3):
newlocation = spacelocation + 1
newrow = newlocation / size
if(newrow != row):
newlocation -= 1
elif(direction == 4):
newlocation = spacelocation - 1
newrow = newlocation / size
if(newrow != row):
newlocation += 1
if(newlocation > -1 and newlocation < (size*size)):
tmp = actual[newlocation]
actual[spacelocation] = tmp
actual[newlocation] = " "
spacelocation = newlocation
#
# The main loop of the game.
def gameLoop(screen):
global stdscr, gameinplay, gamewon
curses.echo()
stdscr = screen
stillplaying = 1
while stillplaying :
gameinplay = 1
getSize()
generateBoard()
makeTopBorder()
while gameinplay:
displayBoard()
getInput()
checkForWin()
if gamewon:
displayBoard()
stdscr.addstr("\n\n\t\tYOU WON!!!!!!!!!\n\n")
stdscr.refresh()
stdscr.addstr("\nWould you like to play another game? (y to continue): ")
stdscr.refresh()
stillplaying = stdscr.getch()
if(stillplaying == 89 or stillplaying == 121): # Q or q
stillplaying = 1
else:
stillplaying = 0
#
# The main method to start the game.
if __name__ == "__main__":
print "Welcome to the slide puzzle!\n"
curses.wrapper(gameLoop)
print "Good bye!"