merge because i dont know really
commit
fa2509343b
@ -1,337 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#TODO: show controls, restartable, command line flags like "easy, hard"
|
||||
|
||||
import random, io, sys, time, os
|
||||
|
||||
import curses
|
||||
from curses import wrapper
|
||||
|
||||
NOTHING = 0
|
||||
MINE = -1
|
||||
FLAG = -2
|
||||
UNKNOWN = -3
|
||||
FLAG_MINE = -4
|
||||
|
||||
score_x, score_y = 0, 0
|
||||
OFFSET = 11
|
||||
|
||||
STARTTIME = 0
|
||||
|
||||
SCREEN = 0
|
||||
|
||||
firstmove = False
|
||||
FIELD_GENERATED = False
|
||||
|
||||
CURSOR_POSITION=[0,0]
|
||||
FIELDS_CLEARED = 0
|
||||
|
||||
width, height = 9, 9
|
||||
MINECOUNT = 10
|
||||
FLAGCOUNT = 0
|
||||
|
||||
difficulty = 'medium'
|
||||
|
||||
param_error = 'minebash: Invalid parameters. See \'minebash ?\' for help '
|
||||
helpstr = '''Usage: minebash [easy|medium|hard] [width height minecount]
|
||||
|
||||
Difficulty presets:
|
||||
easy: 5x5 4 mines
|
||||
medium: 9x9 15 mines
|
||||
hard: 12x12 35 mines
|
||||
Specify your own:
|
||||
4 4 4 4x4 4 mines
|
||||
8 8 10 8x8 10 mines
|
||||
|
||||
Controls:
|
||||
Arrow Keys: Move Cursor
|
||||
Spacebar: Try field
|
||||
F: Place flag
|
||||
'''
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
if len(sys.argv) == 2: #param is string like easy, hard
|
||||
if sys.argv[1] == '?':
|
||||
print(helpstr)
|
||||
sys.exit(0)
|
||||
if sys.argv[1] == 'easy':
|
||||
width = 5
|
||||
height = 5
|
||||
MINECOUNT = 4
|
||||
elif sys.argv[1] == 'medium':
|
||||
width = 9
|
||||
height = 9
|
||||
MINECOUNT = 15
|
||||
elif sys.argv[1] == 'hard':
|
||||
width = 12
|
||||
height = 12
|
||||
MINECOUNT = 35
|
||||
else:
|
||||
print(param_error)
|
||||
sys.exit(0)
|
||||
difficulty = sys.argv[1]
|
||||
elif len(sys.argv) == 4: #this means the user has specified width, height and minecount
|
||||
width = int(sys.argv[1])
|
||||
height = int(sys.argv[2])
|
||||
if int(sys.argv[3]) < width*height:
|
||||
MINECOUNT = int(sys.argv[3])
|
||||
difficulty = 'custom'
|
||||
else:
|
||||
print('Minecount muss be less than width x height.')
|
||||
system.exit(0)
|
||||
else:
|
||||
print(param_error)
|
||||
sys.exit(0)
|
||||
playfield = [[UNKNOWN for x in range(width)] for y in range(height)]
|
||||
|
||||
|
||||
#stdscr = curses.initscr()
|
||||
#curses.noecho()
|
||||
#curses.cbreak()
|
||||
headline = '.'
|
||||
midline = '|'
|
||||
tailline = '\''
|
||||
|
||||
def setup_strings(colcount):
|
||||
#setup lines to print
|
||||
for i in range(colcount):
|
||||
global headline, midline, tailline
|
||||
headline += '---.'
|
||||
midline += '---|'
|
||||
tailline += '---\''
|
||||
|
||||
def endgame(msg=''):
|
||||
# curses.nocbreak()
|
||||
# stdscr.keypad(False)
|
||||
# curses.echo()
|
||||
#curses.endwin()
|
||||
if msg != '':
|
||||
print(msg)
|
||||
sys.exit(0)
|
||||
|
||||
def calculate_hint(col, row):
|
||||
hint = 0
|
||||
if playfield[row][col] != MINE:
|
||||
for x in range(col-1, col+2):
|
||||
if x >= 0 and x < len(playfield):
|
||||
for y in range(row-1, row+2):
|
||||
if y >= 0 and y < len(playfield[0]):
|
||||
if playfield[y][x] == MINE or playfield[y][x] == FLAG_MINE:
|
||||
hint+=1
|
||||
else:
|
||||
hint = MINE
|
||||
return hint
|
||||
|
||||
def setup_playfield(w, h, x, y):
|
||||
#do this only once [AFTER THE FIRST GUESS] -> Done
|
||||
#randomly distribute mines across the field
|
||||
global playfield, FIELD_GENERATED, STARTTIME
|
||||
|
||||
minesleft = MINECOUNT
|
||||
while minesleft > 0:
|
||||
randx = random.randint(0, width-1)
|
||||
randy = random.randint(1, height-1)
|
||||
if playfield[randy][randx] != MINE and randx != x and randy != y:
|
||||
playfield[randy][randx] = MINE
|
||||
minesleft -= 1
|
||||
FIELD_GENERATED = True
|
||||
STARTTIME = time.time()
|
||||
|
||||
def gameover(win):
|
||||
SCREEN.clear()
|
||||
if not win:
|
||||
SCREEN.addstr(0, 0, ' ________________')
|
||||
SCREEN.addstr(1, 0, ' ____/ ( ( ) ) \___')
|
||||
SCREEN.addstr(2, 0, ' /( ( ( ) _ )) ) )\ ')
|
||||
SCREEN.addstr(3, 0, ' (( ( )( ) ) ( ) )')
|
||||
SCREEN.addstr(4, 0, ' ((/ ( _( ) ( _) ) ( () ) )')
|
||||
SCREEN.addstr(5, 0, ' ( ( ( (_) (( ( ) .((_ ) . )_')
|
||||
SCREEN.addstr(6, 0, ' ( ( ) ( ( ) ) ) . ) ( )')
|
||||
SCREEN.addstr(7, 0, ' ( ( ( ( ) ( _ ( _) ). ) . ) ) ( )')
|
||||
SCREEN.addstr(8, 0, ' ( ( ( ) ( ) ( )) ) _)( ) ) )')
|
||||
SCREEN.addstr(9, 0, ' ( ( ( \ ) ( (_ ( ) ( ) ) ) ) )) ( )')
|
||||
SCREEN.addstr(10, 0, ' ( ( ( ( (_ ( ) ( _ ) ) ( ) ) )')
|
||||
SCREEN.addstr(11, 0, ' ( ( ( ( ( ) (_ ) ) ) _) ) _( ( )')
|
||||
SCREEN.addstr(12, 0, ' (( ( )( ( _ ) _) _(_ ( (_ )')
|
||||
SCREEN.addstr(13, 0, ' (_((__(_(__(( ( ( | ) ) ) )_))__))_)___)')
|
||||
SCREEN.addstr(14, 0, ' ((__) \\||lll|l||/// \_))')
|
||||
SCREEN.addstr(15, 0, ' ( /(/ ( ) ) )\ )')
|
||||
SCREEN.addstr(16, 0, ' ( ( ( ( | | ) ) )\ )')
|
||||
SCREEN.addstr(17, 0, ' ( /(| / ( )) ) ) )) )')
|
||||
SCREEN.addstr(18, 0, ' ( ( ((((_(|)_))))) )')
|
||||
SCREEN.addstr(19, 0, ' ( ||\(|(|)|/|| )')
|
||||
SCREEN.addstr(20, 0, ' ( |(||(||)|||| )')
|
||||
SCREEN.addstr(21, 0, ' ( //|/l|||)|\\ \ )')
|
||||
SCREEN.addstr(22, 0, ' (/ / // /|//||||\\ \ \ \ _)')
|
||||
SCREEN.addstr(23, 0, ' You lose! Press q to quit.')
|
||||
else:
|
||||
now = time.time()
|
||||
elapsed = now - STARTTIME
|
||||
mins = elapsed / 60
|
||||
secs = elapsed % 60
|
||||
winstr = 'You win! It took you {}:{} to bash the field!'.format(int(mins), str(round(secs, 2)).zfill(5))
|
||||
SCREEN.addstr(0, 0, ' /$$ /$$ /$$ /$$ /$$$$$$$ /$$')
|
||||
SCREEN.addstr(1, 0, '| $$ /$ | $$ | $$| $$ | $$__ $$ | $$')
|
||||
SCREEN.addstr(2, 0, '| $$ /$$$| $$ /$$$$$$ | $$| $$ | $$ \ $$ /$$$$$$ /$$$$$$$ /$$$$$$ | $$')
|
||||
SCREEN.addstr(3, 0, '| $$/$$ $$ $$ /$$__ $$| $$| $$ | $$ | $$ /$$__ $$| $$__ $$ /$$__ $$| $$')
|
||||
SCREEN.addstr(4, 0, '| $$$$_ $$$$| $$$$$$$$| $$| $$ | $$ | $$| $$ \ $$| $$ \ $$| $$$$$$$$|__/')
|
||||
SCREEN.addstr(5, 0, '| $$$/ \ $$$| $$_____/| $$| $$ | $$ | $$| $$ | $$| $$ | $$| $$_____/ ')
|
||||
SCREEN.addstr(6, 0, '| $$/ \ $$| $$$$$$$| $$| $$ | $$$$$$$/| $$$$$$/| $$ | $$| $$$$$$$ /$$')
|
||||
SCREEN.addstr(7, 0, '|__/ \__/ \_______/|__/|__/ |_______/ \______/ |__/ |__/ \_______/|__/')
|
||||
SCREEN.addstr(10, 0, winstr)
|
||||
SCREEN.addstr(11,0, 'Press q to quit!')
|
||||
while True:
|
||||
key = SCREEN.getch()
|
||||
if key == ord('q'):
|
||||
endgame()
|
||||
#if key == ord('r'):
|
||||
# os.execl(sys.executable, sys.executable, *sys.argv)
|
||||
|
||||
def print_playfield(playfield, screen):
|
||||
global score_x, score_y
|
||||
currentline = 0
|
||||
screen.addstr(currentline, 10, headline, curses.color_pair(1))
|
||||
currentline +=1
|
||||
#print headline
|
||||
for rowindex, row in enumerate(playfield):
|
||||
screen.addstr(currentline, 10, '|')
|
||||
pos = OFFSET
|
||||
for colindex, cell in enumerate(row):
|
||||
# is the cell selected?
|
||||
selected = False
|
||||
if [colindex, rowindex] == CURSOR_POSITION:
|
||||
screen.addstr(currentline, pos, '[')
|
||||
selected = True
|
||||
else:
|
||||
screen.addstr(currentline, pos, ' ')
|
||||
pos += 1
|
||||
# did we find a hint?
|
||||
if cell > 0:
|
||||
if cell == 1: color = curses.color_pair(3) #cyan
|
||||
elif cell == 2: color = curses.color_pair(4) #blue
|
||||
else: color = curses.color_pair(5) #yellow
|
||||
screen.addstr(currentline, pos, str(cell), color)
|
||||
elif cell == 0:
|
||||
screen.addstr(currentline, pos, ' ')
|
||||
elif cell == UNKNOWN or cell == MINE:
|
||||
screen.addstr(currentline, pos, '#', curses.color_pair(7)) #rowstring+= '#'
|
||||
elif cell == FLAG_MINE or cell == FLAG:
|
||||
screen.addstr(currentline, pos, 'P', curses.color_pair(2)) #rowstring += 'P'
|
||||
#elif cell == MINE:
|
||||
# rowstring += 'X'
|
||||
pos += 1
|
||||
if selected:
|
||||
screen.addstr(currentline, pos, ']|')
|
||||
else:
|
||||
screen.addstr(currentline, pos, ' |')
|
||||
pos += 2
|
||||
currentline +=1
|
||||
if(rowindex < len(row)-1):
|
||||
screen.addstr(currentline, 10, midline)
|
||||
currentline +=1
|
||||
screen.addstr(currentline, 10, tailline)
|
||||
currentline +=1
|
||||
score_y = currentline
|
||||
score_x = int(pos/2)
|
||||
#print tailline
|
||||
|
||||
def hit(x, y, recursive_call=False):
|
||||
global playfield, FIELDS_CLEARED
|
||||
if playfield[y][x] == UNKNOWN:
|
||||
hint = calculate_hint(x, y)
|
||||
playfield[y][x] = hint
|
||||
FIELDS_CLEARED += 1
|
||||
if not recursive_call and hint == NOTHING:
|
||||
for i in range(x-1, x+2):
|
||||
for j in range(y-1, y+2):
|
||||
if i >= 0 and i < width:
|
||||
if j >= 0 and j< height:
|
||||
if playfield[j][i] == UNKNOWN:
|
||||
hint = calculate_hint(i, j)
|
||||
if hint > 0 and hint<3:
|
||||
hit(i,j, True)
|
||||
if hint == 0:
|
||||
hit(i,j)
|
||||
elif playfield[y][x] == MINE:
|
||||
gameover(False)
|
||||
|
||||
def check_score():
|
||||
if FIELDS_CLEARED == (width*height)-MINECOUNT:
|
||||
gameover(True)
|
||||
|
||||
def place_flag(x, y):
|
||||
global playfield, FLAGCOUNT
|
||||
#playfield[y][x] = playfield[y][x]
|
||||
if playfield[y][x] == MINE:
|
||||
playfield[y][x] = FLAG_MINE
|
||||
FLAGCOUNT += 1
|
||||
elif playfield[y][x] == UNKNOWN:
|
||||
playfield[y][x] = FLAG
|
||||
FLAGCOUNT += 1
|
||||
elif playfield[y][x] == FLAG_MINE:
|
||||
playfield[y][x] = MINE
|
||||
FLAGCOUNT -= 1
|
||||
elif playfield[y][x] == FLAG:
|
||||
playfield[y][x] = UNKNOWN
|
||||
FLAGCOUNT -=1
|
||||
|
||||
def handle_input(k):
|
||||
global CURSOR_POSITION, firstmove
|
||||
if k == curses.KEY_LEFT:
|
||||
if CURSOR_POSITION[0] > 0:
|
||||
CURSOR_POSITION[0] -=1
|
||||
elif k == curses.KEY_RIGHT:
|
||||
if CURSOR_POSITION[0] < width-1:
|
||||
CURSOR_POSITION[0] +=1
|
||||
elif k == curses.KEY_UP:
|
||||
if CURSOR_POSITION[1] > 0:
|
||||
CURSOR_POSITION[1] -=1
|
||||
elif k == curses.KEY_DOWN:
|
||||
if CURSOR_POSITION[1] < height-1:
|
||||
CURSOR_POSITION[1] +=1
|
||||
elif k == ord('f'):
|
||||
if FIELD_GENERATED:
|
||||
place_flag(CURSOR_POSITION[0], CURSOR_POSITION[1])
|
||||
elif k == ord(' '):
|
||||
if not firstmove:
|
||||
firstmove = True
|
||||
else:
|
||||
hit(CURSOR_POSITION[0], CURSOR_POSITION[1])
|
||||
|
||||
def print_score(screen):
|
||||
scorestr = 'Mines: {} Flags: {} Difficulty: {}'.format(MINECOUNT, FLAGCOUNT, difficulty)
|
||||
xpos = int((score_x) - (len(scorestr)/2)) + int(OFFSET/2)
|
||||
screen.addstr(score_y, xpos, scorestr)
|
||||
|
||||
def setup_colors():
|
||||
curses.start_color()
|
||||
curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLACK)
|
||||
curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
|
||||
curses.init_pair(3, curses.COLOR_CYAN, curses.COLOR_BLACK)
|
||||
curses.init_pair(4, curses.COLOR_BLUE, curses.COLOR_BLACK)
|
||||
curses.init_pair(5, curses.COLOR_YELLOW, curses.COLOR_BLACK)
|
||||
curses.init_pair(7, curses.COLOR_WHITE, curses.COLOR_WHITE)
|
||||
|
||||
|
||||
def main(stdscr):
|
||||
global SCREEN
|
||||
SCREEN = stdscr
|
||||
stdscr.clear()
|
||||
setup_strings(width)
|
||||
setup_colors()
|
||||
#generate mines:
|
||||
#TODO: user input
|
||||
while(True):
|
||||
print_playfield(playfield, stdscr)
|
||||
key = stdscr.getch()
|
||||
handle_input(key)
|
||||
if (firstmove) and not (FIELD_GENERATED):
|
||||
setup_playfield(width, height, CURSOR_POSITION[0], CURSOR_POSITION[1])
|
||||
handle_input(key)
|
||||
STARTTIME = time.time()
|
||||
check_score()
|
||||
print_score(stdscr)
|
||||
stdscr.refresh()
|
||||
#stdscr.getkey()
|
||||
if __name__ == "__main__":
|
||||
wrapper(main)
|
||||
|
Loading…
Reference in New Issue