From 877ea522a05b6443d8168bfb5f4abf22c4cfbef2 Mon Sep 17 00:00:00 2001 From: filifa Date: Tue, 19 Mar 2024 20:38:20 -0500 Subject: [PATCH] Initial commit --- board.py | 157 ++++++++++++++++++++++++++++ main.py | 48 +++++++++ png/Minesweeper_0.png | Bin 0 -> 262 bytes png/Minesweeper_1.png | Bin 0 -> 518 bytes png/Minesweeper_2.png | Bin 0 -> 1511 bytes png/Minesweeper_3.png | Bin 0 -> 921 bytes png/Minesweeper_4.png | Bin 0 -> 954 bytes png/Minesweeper_5.png | Bin 0 -> 709 bytes png/Minesweeper_6.png | Bin 0 -> 1246 bytes png/Minesweeper_7.png | Bin 0 -> 1264 bytes png/Minesweeper_8.png | Bin 0 -> 1119 bytes png/Minesweeper_flag.png | Bin 0 -> 798 bytes png/Minesweeper_questionmark.png | Bin 0 -> 1189 bytes png/Minesweeper_unopened_square.png | Bin 0 -> 328 bytes png/bomb.png | Bin 0 -> 9680 bytes square.py | 69 ++++++++++++ 16 files changed, 274 insertions(+) create mode 100644 board.py create mode 100644 main.py create mode 100644 png/Minesweeper_0.png create mode 100644 png/Minesweeper_1.png create mode 100644 png/Minesweeper_2.png create mode 100644 png/Minesweeper_3.png create mode 100644 png/Minesweeper_4.png create mode 100644 png/Minesweeper_5.png create mode 100644 png/Minesweeper_6.png create mode 100644 png/Minesweeper_7.png create mode 100644 png/Minesweeper_8.png create mode 100644 png/Minesweeper_flag.png create mode 100644 png/Minesweeper_questionmark.png create mode 100644 png/Minesweeper_unopened_square.png create mode 100644 png/bomb.png create mode 100644 square.py diff --git a/board.py b/board.py new file mode 100644 index 0000000..acfc06a --- /dev/null +++ b/board.py @@ -0,0 +1,157 @@ +import pygame +import random +from square import Square + +class Board: + def __init__(self, size, square_size, surface): + self.surface = surface + self.size = size + self.square_size = square_size + self.game_lost = False + self.game_won = False + self.total_flags = 0 + self.coords = (0,50) + + self.unclicked_squares = size[0] * size[1] + self.total_mines = round(.2*self.unclicked_squares) + + # Makes a 2D list of Square objects + start_x = self.coords[0] + start_y = self.coords[1] + end_x = start_x + self.square_size*size[1] + end_y = start_y + self.square_size*size[0] + self.squares = [[Square(self, i, j) + for i in range(start_x, end_x, self.square_size)] + for j in range(start_y, end_y, self.square_size)] + + # Font object for mine counter and timer + self.game_font = pygame.font.Font('freesansbold.ttf', 48) + + def update_mine_counter(self): + # Makes the mine counter the right size + self.mine_counter = self.game_font.render("99", True, (255,0,0)) + self.counter_loc = self.mine_counter.get_rect() + self.counter_loc.bottomleft = self.coords + + # Makes the background of the counter black + self.mine_counter.fill((0,0,0)) + self.surface.blit(self.mine_counter, self.counter_loc) + + mines_left = str(self.total_mines - self.total_flags) + if len(mines_left) == 1: + mines_left = "0" + mines_left + self.mine_counter = self.game_font.render(mines_left, True, (255,0,0)) + self.counter_loc = self.mine_counter.get_rect() + self.counter_loc.bottomleft = self.coords + self.surface.blit(self.mine_counter, self.counter_loc) + + def check_for_win(self): + only_mines_left = self.total_mines == self.unclicked_squares + if not self.game_lost and only_mines_left: + self.game_won = True + self.flag_remaining_mines() + + def show_unflagged_mines(self): + for row in self.squares: + for s in row: + if s.is_mine and not s.is_flagged: + s.reveal() + elif not s.is_mine and s.is_flagged: + s.draw_line() + + def flag_remaining_mines(self): + for row in self.squares: + for s in row: + if s.is_mine and s.is_questioned: + s.cycle_flag() + if s.is_mine and not s.is_flagged: + s.cycle_flag() + + def get_clicked_square(self, mousepos): + mousex, mousey = mousepos + for row in self.squares: + for s in row: + sx, sy = s.coords + too_far_right = sx+self.square_size < mousex + too_far_up = sy+self.square_size < mousey + too_far_down = sy > mousey + if not (too_far_right or too_far_up or too_far_down): + return s + return None + + def get_index(self, s): + for row in self.squares: + if s in row: + return (self.squares.index(row), row.index(s)) + + # Places mines in such a way that the first space clicked will be a 0 space + # Returns False if a mine was clicked, returns True otherwise + def place_mines(self, mousepos): + square = self.get_clicked_square(mousepos) + if square is None: + return True + adj_squares = self.squares_adjacent_to(square) + free_spaces = self.unclicked_squares-self.total_mines-1-len(adj_squares) + is_mine = ([True]*self.total_mines + [False]*free_spaces) + random.shuffle(is_mine) + for row in self.squares: + for s in row: + if s is not square and s not in adj_squares: + s.is_mine = is_mine.pop() + for row in self.squares: + for s in row: + adj_squares = self.squares_adjacent_to(s) + total_adj_mines = sum([i.is_mine for i in adj_squares]) + s.mines_touching = total_adj_mines + return False + + def squares_adjacent_to(self, s): + x, y = self.get_index(s) + adj_indices = [(x-1,y-1), (x,y-1), (x+1,y-1), + (x-1,y), (x+1,y), + (x+1,y+1), (x,y+1), (x-1,y+1)] + adj_squares = [self.squares[i[0]][i[1]] for i in adj_indices + if 0 <= i[0] < self.size[0] and 0 <= i[1] < self.size[1]] + return adj_squares + + def open(self, s): + if s.is_clicked or s.is_flagged: + return + s.reveal() + if s.is_clicked: + self.unclicked_squares -= 1 + if s.is_mine and s.is_clicked: + self.game_lost = True + self.show_unflagged_mines() + elif not s.is_mine and s.is_clicked and s.mines_touching == 0: + self.open_squares_adjacent_to(s) + + def open_squares_adjacent_to(self, square): + adj_squares = self.squares_adjacent_to(square) + counter = 0 + for s in adj_squares: + if s.is_flagged: + counter += 1 + if counter != square.mines_touching: + return + for s in adj_squares: + self.open(s) + + def left_click(self, mousepos): + square = self.get_clicked_square(mousepos) + if square is None: + return + elif square.is_clicked: + self.open_squares_adjacent_to(square) + return + self.open(square) + + def right_click(self, mousepos): + square = self.get_clicked_square(mousepos) + if square is None: + return + square.cycle_flag() + if square.is_flagged: + self.total_flags += 1 + elif square.is_questioned: + self.total_flags -= 1 diff --git a/main.py b/main.py new file mode 100644 index 0000000..9d54105 --- /dev/null +++ b/main.py @@ -0,0 +1,48 @@ +import pygame +import sys +from pygame.locals import * +from square import Square +from board import Board + +pygame.init() +# Pygame/ALSA has a bug that results in high CPU usage. This line reduces the +# CPU usage +pygame.mixer.quit() + +DISPLAYSURF = pygame.display.set_mode((1280, 720)) +DISPLAYSURF.fill((185,185,185)) +pygame.display.set_caption("Minesweeper") + +board = Board((16, 31), 40, DISPLAYSURF) +# board = Board((9, 10), 48, DISPLAYSURF) + +# Prevents mouse movement from counting as an event, reducing CPU usage +pygame.event.set_blocked(MOUSEMOTION) + +first_left_click = True +while True: + board.update_mine_counter() + board.check_for_win() + pygame.display.update() + + # TODO: Add options to play again + if board.game_lost: + print("You lose") + break + elif board.game_won: + print("You win") + break + + # Program waits here until a non-mouse movement event is read + event = pygame.event.wait() + + if event.type == QUIT: + pygame.quit() + sys.exit() + elif event.type == MOUSEBUTTONUP and event.button == 1: + # FIXME: Need a check to make sure a square was actually clicked + if first_left_click: + first_left_click = board.place_mines(event.pos) + board.left_click(event.pos) + elif event.type == MOUSEBUTTONUP and event.button == 3: + board.right_click(event.pos) diff --git a/png/Minesweeper_0.png b/png/Minesweeper_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9481b3d54c8ca225e5ef4b8b8b964ad95d9d93fc GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1|*M957Y)yY)RhkEujv*Dd-rm{Bd%%E$;h@E*j5SBf z-lT<>WvT}4x)XjyJtK3brJn6Ow-4*~wRJ2gT(K%=#$*;Y9ti_RW(1kQ1Y$$U11umm zlx*Mxv7scRFo+E$nbkmSDEaODH~H&dmxq|WxvZ8i%AsfSptum|JO)o!KbLh*2~7a+ CrcIy# literal 0 HcmV?d00001 diff --git a/png/Minesweeper_1.png b/png/Minesweeper_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab7880c67a7b90d72a92bb1a1a12d05502ae453 GIT binary patch literal 518 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1|*M957Y)yY)RhkE_!T4`?nv3!G?7Q#6)F!(}u79s*_xihiia`bY8=3q2r@!2y-rnq~x?YusH&VySXnwg$ zAMdjbTSQrWCUS-Gt$8K7Mq~z;=o+3GTB16#K3ln_aV<+?^=1y<+SJ;-GVY+$!IBjT zi3z(x49X4eYR%A|(I1$0S7 zK~#9!?VMjolU*Fgznk0Cwax8y%s2n6>HEG=fdrXJ5kVzUQA9)#M8rV5FqL^>QCCGb zMW%*WfpsAU5qeQUR-_bR|HHy2M&>q`bGlczxy`w`XWM%f#0%-OJ!jkFINz&X?D=t? z&wl5e@9%dG6Erq9MnT0|LW&?ZiGF^ltgNIomQY_`AI&g2B`Gipi~^&;sMy(xc;sO` zchR1W<~VP>EGoD_e^SWd+KVWe^L*$ptnao=5j&H||g0 z$3l34x7iRy6t0j9u8<2RzX`pLUT88kIF^45yEVHZjAMeu{Dj$W#wp_|+?~A3YgoUN zBj`YjxdmrN&cGdVCl;8|YlLCg0DHi`;@6@f&kzj52Dn15!~nAeY`F040s@gh+AQGq zpdIJGokuVdBoD0F)C>>fNxNO|tM4oBP2M95?6vDPj9z2fT7@2a4`vo;$N_sa{V1)y zRWK4n|4cs_U_Qo&&z{d|Z%AJ`Uy<=)mIVu#D8qR`S;8z7WEaHceU{4(Tfl~JG|VZ^ zn12jWL?M8H8!%_c$@!%YuRaWYk)D&oUP`Wz3zxrN#wX9GxMMI;2JVm>DzS>&l=L!Q zPA{`gwhqV&}p0F_vUbN`$}rZAIJ95zNa;l+2UqIB6bCn1GMff8v6rx8gLGv&C(WEd--=N%PGVDy#46~Y%Vm1>*Lq)V)g~m zxLZ_PaQ5%BtgDd~0qni|JzCAJm|dJDSAhs6I9_-hM^+z+sdVEtFfZdpyQLk^XP*;| zyI!^)4J8fGW@}@9mbbv(xZdEJ`C81UI?GukeUTmq@(#q^5a1m!ALGOAAGgu#=p`Dr zLRo=YT`e@38cuO|1?+?S16s|ktPdpENF`RGN?V0WHJKZhBEDqRP3uiO`}Y~qxO+5v zP+e3FnMg(~rYIe=N-a^tP;5ZCvYhyMQwGc*_M^kvfya)=tlBDUwLNz`>UH&yixN}x zrv%vG+#p)aEpP-KMAxeN;(BaVZB6LdlL{;t3F6Mg9dz5fiDy-vt_}*3BH{0lG+@Kt zVO%v`g)Lws7E>u!qE1(bZGUV_+K(<;$yrsat3{3|C#lOxLV=C=M$k0Ygo(fev6!+9 z8ESMj*rnc;lFce1z!oEm=$hz4kG+RjzX||0D>uVXY(TCgH)S@6IIu6?FK9Kj63r^P zNRFB{HQ1@%nR1g&449Acq082V2U8D-u2tpAau|vYP)pRjDBp+xdpY|O?c?o4yP&Hw zR-sB;g?*ZRylM_`0yY(#LYt)xAKf2`4r)`*CNz{Z@FuG`0}DsPcsTtKofDlzubxXY zq^QzZ?4Rk!m9Z;CcR*=|6t%kAl$p?k0W-zV5r2ZWj7jDz;0P@5q0bUU|q1{;^;+QWzW(4qtF-Wm;BDM*PYxUHwNbhLB$f7 z(Q70+71JKr^x`z76bmpm7iB51U&Q8C9tHO6HYyNNO0fWw2qlzKEWomb*_2W&!1#P2 zm;y_OT5^M81D;kqrKH$q7!?IZfl*)-7zIXwQN`%Pe*RA>70ocB`VV$c@P5^vf(rlu N002ovPDHLkV1i+=sA&KI literal 0 HcmV?d00001 diff --git a/png/Minesweeper_3.png b/png/Minesweeper_3.png new file mode 100644 index 0000000000000000000000000000000000000000..04c03e9320eb26aaa2e96dd7573e5fea6c12c005 GIT binary patch literal 921 zcmV;K17`e*P)xL22ng)#AUr=0TRKf( ztZ7fD(Z93=`^^o3vBq2~;oIseEX5*$v4+cJ(6_ZkU`pbRM&U>%35+!cSw{EaA%Q80 z=j;rSWddW3HJ=BU&8pY9mfdb-hK5>mwi88syt;xlpKlmV=;%-ftQZX9=gLa!)*(qk zaB~y>gM+${VJQ^!b4ki36E5cFAb30t6@OjTFxhBCDHzng1iYu>U9(sStmSSpL_lB! zMqmWi8fjx3ZwL&4R2h4?rhz$< zN%Su+w(JV6@H`cLC1cgS&qrXaDfacD%5en7n!B+v>cd!5_IPkNJWOD$Nl#3mX0;L+ zYr2n)U=&3HW1bFjIe1S`2~0`4PEH6+N%+f47zKgAn8&MX6?Vq4jlllJ%(#oEX|ts0 zbRs=Dsrqq0h$8rli@G<+y?i2uulDDG(qqMQCO-fwfu)jKBztz_hFSGJz=xm&r8Lmgox18IOZ+;6d(_)2ZHQ zWGNIBZT@fSHw}^mK9RuZ{e2i}wfbjWmrFgcPv_@v^7oR=SZ+7-{#d$80>};w0D7xo zjTHOz_&D`pthpN<#h>0@0%M8L*@?^9S?cszQsH_0SYKz}wWDjW`<@>++ zCOtt(HXD*tQ%FT3s4CbVpc^pBW<%NK!h_$BTsVweD1?gL-q10bz%qk_I5|G1hKBFA?r<6h~Ox64aMsnpOG@0;Q00000NkvXXu0mjf#eSQ1 literal 0 HcmV?d00001 diff --git a/png/Minesweeper_4.png b/png/Minesweeper_4.png new file mode 100644 index 0000000000000000000000000000000000000000..7df136708ab70ecc70b108a887682b7d06e9084d GIT binary patch literal 954 zcmV;r14aCaP)4jw9~LmiSL5B&iV^oMlFqF+Kp z9*QUe!A>6P5ENY`B4X86Yu(l|?T6azL4t+aWqhaIoPD3~X&8LQ@#8z=Gvlkm#KeRQ zisFbwkYA+d1)I%A8h?n-=c5ruha`a!7=aNOMOj<%H?y)5!Qx_=x!&QhU}&i3#rn<7 zOH56DVcu?EUlqp2>I!Rw#p7vsJQ3!4qftVCe-%H6tVN7@N?34xkAWh*{|(KM{6NT0v}+9hd0>Yzh{tPlr@( z!|AMrAb<}rulF0y&Qi?v9UY(1*7k{y#`W$l3%C26xn2-}kr4|&oxaBt#nn}sxxTB* zgr=qvKEPtJN35+ynd@~r5e`S;j;=QcTUZF={{D%%zPHy5vsuRn*y(8sJ3HT*>kS48 z0|V9k+^v|M4MA4%{nOxJHOk5)KEQT&<2X3DVXilsbm-|ZLkm$2md(nTpI6tU4i8(P z*Nc3BZEam57`$h$Z)hli&1QmDq6+NxHiPBmh^ieJ9j%3^q5Hn7c6DVXg6nJcCbhM- z3>_UtXerEK(dYvG5`>&Xvw5Ujc z!%+h*ChtyBmI0S5sH#b|+bd9CU;OSbKAFrQ5_x#BzOqvP+Yh3=!TkOo2n3RURzvPaBNJ59+}(8TCyn0Gym8q1EJd4qIQpcy$Q#6vbePLQmqxOjI~?2FKNalG$6}8Nh1hRin$0>`EFWK@NMinAf&h$ig%|PU~aitI#fe{#i5g36{2#ml8jKBztLSO_&U<5{B1V$k+0(;j;|HF$g7$g9> zsSLmV{3f>^5JjM*qzFK6y6E$AV`DL2VBOtjba$KSkfd`Mfe{#mzzB@MG~Kv9|4%7} cM%bI?Cjx!*u?666zyJUM07*qoM6N<$f}@GGL;wH) literal 0 HcmV?d00001 diff --git a/png/Minesweeper_5.png b/png/Minesweeper_5.png new file mode 100644 index 0000000000000000000000000000000000000000..aec0d37fe4cab9bce011bee237e06d143d44eba1 GIT binary patch literal 709 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 literal 0 HcmV?d00001 diff --git a/png/Minesweeper_flag.png b/png/Minesweeper_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..1f732fd688e292185acda313e486569dbda44862 GIT binary patch literal 798 zcmV+(1L6FMP)-k1R2aOhh)r!v6sCLKi}t=!Rw|Vum<$#Gg2`YJOcIM=l2`)-%GjRwIwWg?q} zbA27}Zf;C_n=l2K?e-Sau^60*1kf_~^UR)uy*)XBClbLc-5R@zo`DV5YVbrNaGai6 zs#X{drnFjkpGaVOZx6P+JInPjL&3(%Wz24F;!UAo+2U#lnAxj>slX<(S?w6vB^<4g7UF2_~AWxjCeFcTrqgLepj=m`Iw#!zeB<+ zf{Eo0z$XA70h|#`Jih?=2qu?Df^jcNFos|RBN)L5#t^K#82*r5(=_DsdEw)e$zKsI2;HB0_FxgK0Zb+mowyQtEviBRokw6Jf3F<<46*WU<4x=Yen~2TwH|L>ovv6 z+3j{~fN>-lg1y*C7K=q_nl=y^y1+kII)Xj*;vSA9vAP2zmIN5FB*2Iz0Y)qdFk(r7 c5lb%r0Cxx$yxw(FA^-pY07*qoM6N<$g1C%Tr~m)} literal 0 HcmV?d00001 diff --git a/png/Minesweeper_questionmark.png b/png/Minesweeper_questionmark.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2be79cf1658f673715ad5898b9f1ab959aa9ee GIT binary patch literal 1189 zcmV;W1X}xvP)Xe|0ER!LyV zWD@asyehy-xlbCB5`(}9jKE|SDmio_olfKO@)D6q1c^if&(F`uX0y<0wct1o27>`M zn+-Ob4IIZ+FIYSthu`nV!NCFE-`|V=y;7-!!{LC_>4e2%sU9#v5U{ni1)tAX64Xb$ zy}cn63Lz8me1$mcDr$WeEh9;c6WEd^E^Br57cUPWls8nAYgHE z@!MD*5s5_L^?D%)LS;T-o12?BJUnFP6bc1;dwVf3FaVRu1cgF@R4Rq5t1Im7?IE2` zGe389bcF5gZ8)9IU%3ZGu`~VnZTv^JMm*2M<#HjP&llu4j>F8%40?Kcn4it%a#&ki zLm&`f<~feT#>NJ;TJ5(Np)F@9$^kGnou_ zc6KUf4&!+qr>CdP+}PL{>~?$cp`cK}<#LIxiel}TC0H;RWKPT)jRvEmqb0Ya*Xz;Q z*~!dZUtc4W$y5f|+1VNMdS723>g($zwPm$hMOWa*$H(#q%jI&S6KO|BhvfE}nwms& zPft(f5BBizAX?40wY5oZueP>UG$&=(AX~7{zV)w^0m)=iG}qYJSpJ18$8m5t9L$_f zr<2^?`T4o%lV>y<%OA{Qv0!#~_D9-^#bUU)xM1e&b~`j0O=ayRzZ2PP7Aq?&qVv?y z&`{-VzP}o;udi^s-H1k`%zRf@m*_5_>cBpZgT!h%olb|Tsj135-uWul$;k;bUsqR$ z`T2Pm3%`e#_Oe8T*GKVDv53a*>YW-Ki& zeY*Lsx+hE!1m^2TTCElf3k!daB|EU2n;Yh4eSCZzCX-1PeUud#tCH90bQl~QluaLH z1$K9LS8%PnyBjq%H3Y_rL?Tge&1SR7YEhCEST>tw)?IQ6S(OznEiDCa` zPEJDZL2n=u7=aNOfe{#m?8}PV+gk*K!Gi00y&fYYBLw#UxWB(=p0Zl4R#}13kR&hy zBQRPee;_!HWB&h;*=&{-*sr~(Uk)Lw_w;EFBQOdABQOH1ygDovi-G6)s=!F4Qr`nB z_QO3iBnj(lV1y+BjIbnt5taln!jb?+SQ5YpOIrK`ug$qI{^u=100000NkvXXu0mjf D2QL-0 literal 0 HcmV?d00001 diff --git a/png/Minesweeper_unopened_square.png b/png/Minesweeper_unopened_square.png new file mode 100644 index 0000000000000000000000000000000000000000..c400f033b6af3a7323bc846a441d4620fa5093d3 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1|*M957Y)yY)RhkEjpER&{aF!Z|@xBZ3^INc$jskUNJ>j zj-Bm5Rr?FJPhIZ&>KoMlPKv9(z5TE7tE>vX!s8eEP5YELaD}-rtWIFmPJ$y>7n?q| zC)UdGm7Hr<`r2>Yb>LcQZ{<9F#%r6GPu5}MkuXR&(7=gAG75u4pd_;zhz%v#d_Zg{ z$uk4Q29k4MelYgR)}5BRlf^CVAA8xC9mhQnS+TRNWX}$-w5;|gQu&X J%Q~loCIHCfX`uiB literal 0 HcmV?d00001 diff --git a/png/bomb.png b/png/bomb.png new file mode 100644 index 0000000000000000000000000000000000000000..3f73cb5e5b95823534a6561c52a5d55bc8b7a9c3 GIT binary patch literal 9680 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 S_C%@x0000