minesweeper

Minesweeper in Python and pygame
Log | Files | Refs | README

minestryger.py (5304B)


      1 #!/usr/bin/env python3
      2 import pygame as pg 
      3 from data import Minestryger
      4 import argparse
      5 import sys
      6 
      7 #commandline parametre
      8 parser  = argparse.ArgumentParser(description = "Minestryger")
      9 parser.add_argument('-d', action='store_true', help='Slå demotilstand til der gør at bomber vises')
     10 parser.add_argument('-wh', nargs=2, metavar=('W', 'H'), type=int, help='Bredde og højde')
     11 parser.add_argument('-b', type=int, help='Antal bomber')
     12 parser.add_argument('-c', type=int, help='Cellestørrelse')
     13 parser.add_argument('--overwrite-recursion-limit', metavar='limit', type=int, help='Til store spilleplader med relativt få bomber. Eget ansvar.')
     14 
     15 oargs = parser.parse_args() #oprindelige argumenter
     16 
     17 args = vars(oargs) #dict til argumenter
     18 print(args)
     19 print(len(sys.argv))
     20 
     21 if len(sys.argv) == 1: #hvis programmet køres uden parametre 
     22     spil = Minestryger(9, 9, 10) 
     23 else:
     24     spil = Minestryger(args["wh"][0], args["wh"][1], args["b"]) #giver fejl hvis parametrene mangler eller er forkerte
     25 
     26 if oargs.c:
     27     cs = args["c"] #cellestørrelse
     28 else:
     29     cs = 20
     30 
     31 if oargs.overwrite_recursion_limit:
     32     sys.setrecursionlimit(oargs.overwrite_recursion_limit) #til store spilleplader med relativt få bomber
     33 
     34 #opsætning af pygame
     35 pg.init()
     36 screen = pg.display.set_mode(( 500 if spil.w * cs < 500 else spil.w * cs, spil.h * cs +50)) #bredden er mindst 500px
     37 screen.fill((0,0,0))
     38 clock = pg.time.Clock()
     39 
     40 #fonts
     41 font = pg.font.SysFont(None, int(cs*1.8))
     42 text = []
     43 farver = [(255,255,255),(0,0,255), (0,123,0), (255,0,0), (0,0,123), (123,0,0), (0,123,123), (0,0,0), (123,123,13)] 
     44 for i in range(9):
     45     tal = font.render(str(i), True, farver[i])
     46     text.append(tal)
     47 
     48 font2 = pg.font.SysFont(None, 25)
     49 
     50 tab_text = font2.render("Desværre tabte du spillet. Tryk her for at starte forfra.", True, (255,255,255))
     51 vind_text = font2.render("Tillykke! Du vandt spillet. Tryk her for at starte forfra.", True, (255,255,255))
     52 
     53 
     54 def draw_game():
     55     pg.draw.rect(screen, (255,255,255), pg.Rect(0, 0, pg.display.get_window_size()[0], pg.display.get_window_size()[1])) 
     56     for x in range(spil.w):
     57         for y in range(spil.h):
     58             if spil.grid[y][x] < 0:
     59                 pg.draw.rect(screen, (120,120,120), pg.Rect(x * cs, y * cs, cs, cs))
     60 
     61             if spil.grid[y][x] == 0:
     62                 pg.draw.rect(screen, (255,255,255), pg.Rect(x * cs, y * cs, cs, cs))
     63 
     64             if oargs.d:
     65                 if spil.grid[y][x] == -1:
     66                     pg.draw.rect(screen, (12,120,120), pg.Rect(x * cs, y * cs, cs, cs))
     67             
     68             if spil.flag[y][x] == 1:
     69                 pg.draw.rect(screen, (120,0,0), pg.Rect(x * cs, y * cs, cs, cs))
     70 
     71             if spil.grid[y][x] > 0:
     72                 t = spil.grid[y][x]
     73                 screen.blit(text[t], (x * cs,y * cs))
     74                 #pg.draw.rect(screen, (0,0,255), pg.Rect(x*80, y*80, 80, 80))
     75 
     76     pg.draw.rect(screen, (0,0,0), pg.Rect(0, cs * spil.h, pg.display.get_window_size()[0], 50)) #underbaren
     77     tb = spil.get_remaining_bombs()
     78     tbt = font2.render("{} / {}".format(tb, spil.b), True, (255,255,255))
     79     screen.blit(tbt, (0,spil.h * cs+25))
     80 
     81 
     82 def draw_bombs():
     83     for x in range(spil.w):
     84         for y in range(spil.h):
     85             if spil.grid[y][x] == -1:
     86                 pg.draw.rect(screen, (12,12,12), pg.Rect(x * cs, y * cs, cs, cs))
     87             if spil.flag[y][x] == 1 and spil.grid[y][x] == -1:
     88                 pg.draw.rect(screen, (50,110,255), pg.Rect(x * cs, y * cs, cs, cs))
     89             elif spil.flag[y][x] == 1:
     90                 pg.draw.rect(screen, (255,0,0), pg.Rect(x * cs, y * cs, cs, cs))
     91 
     92 def draw_loss():
     93     pg.draw.rect(screen, (0,0,0), pg.Rect(0, cs * spil.h, pg.display.get_window_size()[0], 50)) #underbaren
     94     screen.blit(tab_text, (0,spil.h * cs))
     95 
     96 def draw_win():
     97     pg.draw.rect(screen, (0,0,0), pg.Rect(0, cs * spil.h, pg.display.get_window_size()[0], 50)) #underbaren
     98     screen.blit(vind_text, (0, spil.h * cs))
     99 
    100 draw_game()
    101 while spil.state != -1: #game loop
    102 #tilstandsmaskine
    103     pg.display.update()
    104     events = pg.event.get()
    105     for event in events: #håndtér input
    106         if event.type == pg.MOUSEBUTTONUP:
    107             mx, my = pg.mouse.get_pos()
    108             cx = mx // cs # x-koordinat på celle
    109             cy = my // cs # y-koordinat på celle
    110             if event.button == 1: #venstreklik
    111                 if spil.state == 0:
    112                     spil.gen_grid(cx, cy)
    113                 if spil.state == 1:
    114                     spil.uncover(cx, cy)
    115                 if spil.state == 2 or spil.state == 3:
    116                     if my > spil.h *cs:
    117                         if len(sys.argv) == 1:
    118                             spil = Minestryger(9, 9, 10) #hvis programmet køres uden parametre 
    119                         else:
    120                             spil = Minestryger(args["wh"][0], args["wh"][1], args["b"])
    121 
    122             if event.button == 3: #højreklik
    123                 if spil.state == 1:
    124                     spil.set_flag(cx, cy)
    125 
    126             if event.button == 2: #middleklik
    127                 if spil.state == 1:
    128                     spil.mm_uncover(cx, cy)
    129             draw_game()
    130 
    131     if event.type == pg.QUIT:
    132         spil.state = -1
    133 
    134     if spil.state == 2:
    135         draw_loss()
    136         draw_bombs()
    137     
    138     if spil.state == 3:
    139         draw_bombs()
    140         draw_win()
    141 
    142     clock.tick(60)