data.py (4284B)
1 import random 2 3 class Minestryger(): 4 5 6 def __init__(self, w, h, b): 7 if type(w) != int: 8 raise TypeError("Bredden skal være af typen int (heltal)") 9 if type(h) != int: 10 raise TypeError("Højden skal være af typen int (heltal)") 11 if type(b) != int: 12 raise TypeError("Antallet af bomber skal være af typen int (heltal)") 13 14 if b+9 > w*h: 15 raise ValueError("Der kan ikke være flere bomber på pladen end pladens størrelse.") 16 self.w = w 17 self.h = h 18 self.b = b 19 self.grid = [[ -2 for _ in range(self.w)] for _ in range(self.h)] 20 self.flag = [[ 0 for _ in range(self.w)] for _ in range(self.h)] 21 #self.gen_grid() 22 self.state = 0 #når state = 0 er der ikke nogle bomber på spillepladen 23 #når state = 1 er spillet i gang 24 #når state = 2 er spillet tabt 25 #når state = 3 er spillet vundet 26 print("h: {}".format(self.h)) 27 print("w: {}".format(self.w)) 28 print("b: {}".format(self.w)) 29 #self.pg() 30 31 def uncover(self, x, y): 32 if self.on_grid(x, y): 33 if self.grid[y][x] < 0 and self.flag[y][x] != 1: 34 if self.grid[y][x] == -1: 35 print("Du døde") 36 self.state = 2 37 elif self.grid[y][x] == -2: 38 print("uncovering") 39 b = self.surrounding(x, y) 40 self.grid[y][x] = b 41 if b == 0: 42 for i in range(-1, 2): 43 for u in range(-1, 2): 44 self.uncover(x + u, y + i) 45 self.win_cond() 46 47 def mm_uncover(self, x, y): 48 if self.on_grid(x, y): 49 sflag = self.surrounding(x, y, f = True) #beregn omkringliggende flag 50 if sflag == self.grid[y][x]: 51 for i in range(-1, 2): 52 for u in range(-1, 2): 53 self.uncover(x + u, y + i) 54 55 def surrounding(self, x, y, f = False): 56 if f: 57 g = self.flag 58 c = 1 59 60 elif not f: 61 g = self.grid 62 c = -1 63 64 s = 0 65 for i in range(-1, 2): 66 for u in range(-1, 2): 67 dy = y + i 68 if dy < 0: 69 continue 70 dx = x + u 71 if dx < 0: 72 continue 73 try: 74 q = g[dy][dx] 75 if q == c: 76 s += 1 77 except: 78 q = 0 #hvis koordinatet falder uden for spillepladen 79 #self.pg() 80 return s 81 82 def pg(self): 83 for row in self.flag: 84 print(row) 85 for row in self.grid: 86 print(row) 87 88 def gen_grid(self, sx, sy): 89 # negative tal er undiscovered tiles, -1 for bombe, -2 for fri 90 # positive tal angiver antallet af omkringliggende bomber 91 # nul er discovered frit felt uden omkringliggende bomber 92 if self.on_grid(sx, sy): 93 miner = set() 94 print( sx -1, sx +1 ) 95 print( sy -1, sy +1) 96 while len(miner) < self.b: 97 rx = random.randint(0,self.w-1) 98 ry = random.randint(0,self.h-1) 99 if not (sx - 1 <= rx <= sx + 1 and sy - 1 <= ry <= sy + 1): 100 #if sx != rx or sy != ry: 101 self.grid[ry][rx] = -1 102 miner.add((rx,ry)) 103 self.state = 1 104 105 def set_flag(self, x, y): 106 if self.on_grid(x, y): 107 if self.flag[y][x] != 1 and not self.grid[y][x] >= 0: 108 self.flag[y][x] = 1 109 else: 110 self.flag[y][x] = 0 111 112 def get_remaining_bombs(self): 113 total = 0 114 for x in range(self.w): 115 for y in range(self.h): 116 total += self.flag[y][x] 117 118 return total 119 120 def on_grid(self, x, y): 121 if 0 <= x < self.w and 0 <= y < self.h: 122 return True 123 else: 124 return False 125 126 def win_cond(self): 127 for row in self.grid: 128 if -2 in row: 129 return 130 self.state = 3