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)