minesweeper

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

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