From dc763f3042957e63e8f563dabb3444713ebe8af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=9D=BF=E5=93=B2?= <15683246+Azhe-D@user.noreply.gitee.com> Date: Mon, 20 Apr 2026 09:11:33 +0800 Subject: [PATCH] 7 --- Mines/bin/mines/StartFrame$1.class | Bin 555 -> 1216 bytes Mines/bin/mines/StartFrame$2.class | Bin 555 -> 1187 bytes Mines/bin/mines/StartFrame$3.class | Bin 555 -> 1935 bytes Mines/bin/mines/StartFrame$4.class | Bin 0 -> 2187 bytes Mines/bin/mines/StartFrame$5.class | Bin 0 -> 562 bytes Mines/bin/mines/StartFrame.class | Bin 2628 -> 6337 bytes Mines/src/mines/StartFrame.java | 293 +++++++++++++++++++++++++---- 7 files changed, 256 insertions(+), 37 deletions(-) create mode 100644 Mines/bin/mines/StartFrame$4.class create mode 100644 Mines/bin/mines/StartFrame$5.class diff --git a/Mines/bin/mines/StartFrame$1.class b/Mines/bin/mines/StartFrame$1.class index ed09786d63953c9e7849fe71b0b933d710a1a129..58b74f46e3807258813ab8d5bc908ef4843f3936 100644 GIT binary patch literal 1216 zcmZ`(TTc@~6#j-5w%xAK76BE(3sp)f6!3xyqNTL3^hU}ps7bSJN4li!lHEllzWaY9 z5fVv^&;AUbeDoI>&uo+ejZHdd=G?yToINw&e}DN3U>bQpLbxL%jJskPk`VFZ9`1`} zScVr-2_t?CA|{jLsD!wT0LEnaFfPmqp`H-CNeNRD9x`+|b={6kFobivy20(ls-sy> z#?p5A3|VJ&LwDvF#-gp}+>Z86OK1m9BBvdi`%Ydnv~6z9jBGG?Q)Z1bbmb^#VSl&6 ztu?LEAWi3jt_tO}g6p`!(0#`EAJWu#e$d_7ptKW>tbbxR~_;U z+T6L2f??_$;R`0)&EA?tR2iI4rm~Br;(B4BoGRvuB~mp>x?LwU|2B7)xV~MdQKIgs zG_z4vRYii~XeM(xpj9J0eMH&)!Zaf1sJbe57JY=Wsn?u3`M%W~jS`j0APFQFs{cPd z7v?0hCbR2(b+>X5F7mr7K@*t?GqgtuF={-64<0GOB4Jz z-~$vo1KHT<2|T0U;LXR6(0+uDV@Rj)Z3O~H@CRbYkUyRxuoc3O5PpX6>jcUPt`y>9 z$LNfEJmkbB)(-(MQx!)DOdQx8Q@q9vFGh3}(Ix}vkNGurP8`hXt#0sW}x z&JqOHz|NgL_nyO zWhi=$0iST6KWbl0gw+0dJW@616C-Bdh2y9rYC$aUYvjQ2NU|zB!%zjXcP(^3>^iWq z#gJ(VrLRJz8QkeBILILDU>gOx;B>Qe#NgDW6j5c!l@f{sVuwR6d;U#(AUdSE{jcdp zptK++!;ELFXO)TVl2W74yn4O9*TN2ko~F1hFxNFk=yN3Ku`x@iL#JJOkCF2J3lilw z%sdgwFh{##0vEK;Blk03MlznCFFzyUnpJp3@|R=B-74{GH0csQfd%BLCP`rtOEJQ* MPSyMfDXO%-0d&K44gdfE diff --git a/Mines/bin/mines/StartFrame$2.class b/Mines/bin/mines/StartFrame$2.class index e8c373431637bed9dfa3223a4035e21ae2ceb8be..a24ade95f888a0dca356762499001ea5a6388289 100644 GIT binary patch literal 1187 zcmZ`(ZBG+H5Pp^xj@FePrHYD0)GDQ|6!G1HT1!h0N=XDs_(ZPlrajW$)w|=(eCWuTJTtS;&i2pWAHM*+!dd_-rh*v7eFYB!c!-!>9tGjUV+GSe zD2U6=OppQ-QcFrLC6_01J1fCy1#=4K8HU`3;l$<`!ljmB3Makc>b6_3^_Iwxcfl|X z_Z>q#e$`#t)%W#uQ#b1bvJJDI(Pp+7{5h*87(yjVSKez?guSU(nq(Pi>xSv(tXA7H zh3PWfjCWJ$2X1=V*4quE>SSb!;D)tlS4F{)uu!j~Sy_=Rd9&KI9ICh`+=f+C@QfpZ z=M2MT;kZT1aXG>mlg1YeV_u*AMdp_jyyV2@TaFACI2J)?96686Sxw89==U5SkmdM@ z9LEy!90e?M6rpjfV3p$*ZWDEvnTrvzTr*8!=bF0X2!~>1^24-qKwYO-N_s^!8Pv-_ z247qfaK_9Pa>vhm{3OhpkgOMpR4SmZ=C^mUuHi?A5E z>6*h^+0y5H552QqmIL9{@>*E0?24*Ok*Xuy3n>`p`)=`q%ki>b%_0w|#5MY)HcS~k zzUiX+GI=I%7?iqj3znRh(fCa7Akst)DFp9&!+mJa>D3|drZ^;U%L@IiMfp4^@g0v2i1X>h9<8_K?(YyAMbusxHzO~db{KpvVU?}wy%C^tvQzIuB z?jVp#bP(*|nv{Hymg{P;*1S}eeytVpA+2D<7auHwh?hdGSNgt9S4~MbkX`F{30}YlKfsR? z&jz8OCS=cM&Y59$lFzUA4*uW1C^B*^i`9 z!L{b8K2CXG>`}KK$w==r%=&-Z)i#55m~;ihM3cC!hki$-H@p)YgoipxClG;{zV>M;(ZPkUBWXMvlyW&xkqK$wL~7<0umt8rd>Dl01@OoTy0Noe6!PbX_=D zVHjx%rB4&38NA;|a4~|Ci!xT}fWMm?I}C0^N|7GMTq&VQAafXVc^8~_dLksv^1r5= zkY3v#tL z*1aVD6-|1?&tVc%R4r1N#!QAV MEK)T;LV+q>--$(aSpWb4 diff --git a/Mines/bin/mines/StartFrame$3.class b/Mines/bin/mines/StartFrame$3.class index a7245047f275a767a7d12b56c5d364b6e50e152e..65dbd7a25ad687e493579cbd7a1341c9e93fc845 100644 GIT binary patch literal 1935 zcma)7ZBrXn6n-uw*(7X9puA{H5S8lkVpFNMDu@l?ZA&1Pq_hzgmh5e^bh8_GH-$Rm zN5}urFP(8lXKbC(GGp*=|NQtAz*T%4 z!2ps`BydT>s}W4#vRGb=q8+bCNq0qXS0%hDHdA7GJ9OyfJ+rOd(~_oUmB`95tkUGj8bcs$>zpB$A-I)VWs5s`ZObG{XH_#S zFKt(V67B}?;a4xxsBy(2Lv|U14=3d#>C1hm`;RZu^g}dIO z?Rqi>@thF8%W&3DxHa5~SqZB$a#)jb3%6wy@Scoyyf5Ped?;aq;lhzoiQARrs$H}6 zRbKR{Y$l(W9iFvoetANNjI3G~chaWjy4;nq2~Eb9ScXuPp+l7N2s3S)wj)$`WR$>V zl*LIy1h9>}GE7utSg<8jWqbrW>Vk5r;hu~g>{8!Pwte_AL$AO;Rbz(u$-@loifDSD z(mD;rm}3zWg5YW(Lc5CXZmW$0enFRaQCA;BUyN@aRqBFe1)_;1-A z!!(b($(6M#_lq75jHTMIewIH>oFFSE&osc9GA#?eN2VB!4g7%C6ST=55QP z#3V{gup;kf+P+e_iM8T;yu#3P2;$!k&2ISlx5y}C&u&~ECyfrS6nck65{GB{5B#^@ zI*nZ8`MKNqjf}dmnBPceGuc(jyBX_Yi#kNzZrJAil5LT5WnEown4dpt&FPt-*K2^T zYJkP#;yNI%js8P;9tU=P7MLgS-#NOgqAe?p|t*-5)-K>v(L2az7g^xH>g9Wgo(FLdFzF8tnw zKlah}Ka9Ew=WN?UD8fsRFd*7nN1vembvzS~5z`Sg!<%(HOKdbgs82UUR{|8|Ibjp} zIa+8>WD9{rJiM7L1QXI`)|d4LLOO{XBuIqhb(|N4X!8p(O-Tb^P~u+__Z9l_2yfsq zGWZ%5d_$MgxA+84@G1820Cg(aKArfUBtPI!JjF|79R~Xw4AC7Dd`5XtA3Z@1$^)W z{3!8k5QJ(%_H5>y8D=N>{CfWYu!~h2r2>XA;~SPM#67+5w?%r%+p$4-prb^di}Wr@ z`yymmt+aalf&2VX`{F@J?H^<#4YRKqG3O$=PXlonWdgrOwhWIX8#0I!70J$t(A^|- z;b4hjKl4@Ovib4qGc0eO?(h}4UyhS?Z-{?OlOFLcOk#>^jueWR P&Jc!qs^&)+rb^d0p$T=c diff --git a/Mines/bin/mines/StartFrame$4.class b/Mines/bin/mines/StartFrame$4.class new file mode 100644 index 0000000000000000000000000000000000000000..3c9ddd0739afe722f054579c478635d0857ceac9 GIT binary patch literal 2187 zcmZ`*Yf~Fl7=D&qmLv;=TU)?Z+6EgSG%X@(!P*cAq=Zld1*sQU$SGOa?BecnskeG< z)gRCq#~Nuk_-aq&sI*#wz4Iy0INzOU@UY_&5&--iO3W11!4NZ3J;*RANVA+O|=1=EJ8q8JvI z$K;iwXT4&^b zhAmh`w92{%LxcLNO{jNgAtg198F5uMO=e11g~nmmB&=gY!VMn9vv^Lz^LRnRi?}J_ zCA=)*6}&3qH3_fdmW11QgL+_p3xs-#oNPqRbs{l(d0^GDbV??;-_$M$)xWV=)%|^O zw3JnbX<5emWrSEV32Jm`W;T|dOvX~l*hDftEaFW<8)Y{H9N%q`y>1~=Q-jt`#Zp&? zcD-lE)4Y}Kz3d3a=a+~&vJ9Hc+5;h=yQ~5Cs7xFEAPVpA%0*_4QH!erTEgwN%?>#Z zH@1>Cv=cr=B|ucnn33l_Tr)8gA5Ra)GBdOB@zi*R!rV>R?h*p>W@TfU8I)IXzbJ3e z9j%Yz8DYv|jyi{qM3U^o$z+m;dM2Dm?1wuj;g){I%;>7Bukmdvi7C5-srF?I*&_RV zo+y>_&<1rlnpUz_PJk~wXg~JVaGj3sUeJl0yuxfy&-6%ga>&`;&TX%ulP*UQDd7ZN z2Lfu#`QRcVOQhf(ZCzRHwsOaLl5LQ4!;W)#qtYQQqSJL@(0wG}*p3}1o#PZWv{yrk zhcdZ}3l;BkbA)O1(hPh7H`>wRI0!mwAd*2v=Vx$@MK-8hRWre^THFaHwotu=n)JJvc3gsGF1A^JEj|cd zBQwXpvupn*PHI8wk-3j0_AO%YNx7tlh} zJr~@O0**Ji3pmm1;mZQczbUEasnPy&+3fFrymKW(CD$-f5K@{g`cGF*lZrpE6&f_x8%~a<) T3?oUHC+VF(Pt*U5S-0;$si-9Y literal 0 HcmV?d00001 diff --git a/Mines/bin/mines/StartFrame$5.class b/Mines/bin/mines/StartFrame$5.class new file mode 100644 index 0000000000000000000000000000000000000000..e61c86ae1e09cc7c13b19f9ac6ec84af35d769d8 GIT binary patch literal 562 zcmZuvU279T6g`uqZn90yHZf||8j(DtDRh02KBNeeehD!aQrhRq<|di2nT4H6#GfT- z1t0nY{5OKW7Vj*DLh8caJ9FmTbI;z{UpGIm0qo;t2?f-BtfA(kipL(Fc-ZprOyGf? zD${%;Q0>i?CKC>Jq+h5Fwl%C6B><}4Q zmFP1{$4NS;kwBx>o5`gN`jkSx-Oj#VabXJpUSvE-4C;>0LD z`ABw}j66Iqql6a%#XcE(niyM#hhiDq4y>+zPxGxn`GeM!c4KJ_8G#^k6iYn`KMiLT zS%K~Un(QfKi7UBeRaPM1a_$?(P40vTcd6`jKrzeF=unNvDq6($3tsUhtbvCL5d_XC z-%XC+5`0G2dG(t24)NQ&-yzyRko(FzcFmEiIR56ifrq#JCTGVlw!cAKA%DmAGyD&C e`O94^%*i3ZCg%eG05v?ykSd;XcHIk{`S}MiH+~lY literal 0 HcmV?d00001 diff --git a/Mines/bin/mines/StartFrame.class b/Mines/bin/mines/StartFrame.class index 754e2bd8da394983ee69b7303578605ad42e8182..5cd7180ccc819d3b1c3aed675dbdec415fabea3f 100644 GIT binary patch literal 6337 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 difficultyComboBox; + /** * StartFrame constructor */ public StartFrame() { + // Set UI defaults for modern look + setUIFont(new FontUIResource("Segoe UI", Font.PLAIN, 14)); + UIManager.put("ComboBox.background", CARD_COLOR); + UIManager.put("ComboBox.foreground", TEXT_COLOR); + UIManager.put("ComboBox.selectionBackground", PRIMARY_COLOR); + UIManager.put("ComboBox.selectionForeground", Color.WHITE); + UIManager.put("Button.arc", 15); + UIManager.put("Panel.background", BACKGROUND_COLOR); + setTitle("Minesweeper"); - setSize(400, 350); + setSize(450, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setResizable(false); + setBackground(BACKGROUND_COLOR); - JPanel mainPanel = new JPanel(new BorderLayout()); + // Main panel with gradient background + JPanel mainPanel = new JPanel(new BorderLayout()) { + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Subtle gradient background + GradientPaint gp = new GradientPaint(0, 0, BACKGROUND_COLOR, 0, getHeight(), + new Color(226, 232, 240)); + g2d.setPaint(gp); + g2d.fillRect(0, 0, getWidth(), getHeight()); + } + }; + mainPanel.setOpaque(true); + + // Title section + JPanel titlePanel = new JPanel(new BorderLayout()); + titlePanel.setOpaque(false); + titlePanel.setBorder(BorderFactory.createEmptyBorder(40, 0, 30, 0)); - // Title label - JLabel titleLabel = new JLabel("Minesweeper", JLabel.CENTER); - titleLabel.setFont(new Font("Arial", Font.BOLD, 36)); - titleLabel.setBorder(new javax.swing.border.EmptyBorder(40, 0, 20, 0)); - mainPanel.add(titleLabel, BorderLayout.NORTH); + // Custom title label with shadow effect + JLabel titleLabel = new JLabel("Minesweeper", JLabel.CENTER) { + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Draw shadow + g2d.setColor(new Color(0, 0, 0, 20)); + g2d.setFont(getFont()); + g2d.drawString(getText(), 2, getHeight() - 10); + + // Draw text + super.paintComponent(g); + } + }; + titleLabel.setFont(new Font("Segoe UI", Font.BOLD, 42)); + titleLabel.setForeground(PRIMARY_COLOR); + titlePanel.add(titleLabel, BorderLayout.CENTER); + + // Subtitle + JLabel subtitleLabel = new JLabel("Classic Game with Modern Design", JLabel.CENTER); + subtitleLabel.setFont(new Font("Segoe UI", Font.ITALIC, 14)); + subtitleLabel.setForeground(TEXT_LIGHT_COLOR); + subtitleLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + titlePanel.add(subtitleLabel, BorderLayout.SOUTH); + + mainPanel.add(titlePanel, BorderLayout.NORTH); + + // Content card panel + JPanel cardPanel = new JPanel(new GridBagLayout()); + cardPanel.setOpaque(true); + cardPanel.setBackground(CARD_COLOR); + cardPanel.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(0, 40, 0, 40), + BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(new Color(226, 232, 240), 1, true), + BorderFactory.createEmptyBorder(30, 30, 30, 30) + ) + )); - // Difficulty buttons panel - JPanel buttonPanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.insets = new Insets(10, 80, 10, 80); + gbc.insets = new Insets(10, 0, 10, 0); + + // Difficulty label + JLabel difficultyLabel = new JLabel("Select Difficulty:"); + difficultyLabel.setFont(new Font("Segoe UI", Font.BOLD, 16)); + difficultyLabel.setForeground(TEXT_COLOR); + gbc.insets = new Insets(0, 0, 15, 0); + cardPanel.add(difficultyLabel, gbc); - // Easy button - JButton btnEasy = new JButton("Easy (16x16)"); - btnEasy.setFont(new Font("Arial", Font.PLAIN, 16)); - btnEasy.setPreferredSize(new Dimension(200, 45)); - btnEasy.addActionListener(new ActionListener() { + // Difficulty ComboBox + difficultyComboBox = new JComboBox(DIFFICULTIES) { @Override - public void actionPerformed(ActionEvent e) { - startGame(EASY_ROWS, EASY_COLUMNS, EASY_MINES); + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Draw rounded background + g2d.setColor(getBackground()); + g2d.fill(new RoundRectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1, 15, 15)); + g2d.setColor(new Color(203, 213, 225)); + g2d.draw(new RoundRectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1, 15, 15)); + + // Draw selected item + if (getSelectedIndex() != -1) { + g2d.setColor(getForeground()); + g2d.setFont(getFont()); + g2d.drawString(getSelectedItem().toString(), 15, getHeight() / 2 + 5); + } + + // Draw arrow + int arrowX = getWidth() - 30; + int arrowY = getHeight() / 2; + g2d.setColor(TEXT_LIGHT_COLOR); + g2d.fillPolygon( + new int[]{arrowX, arrowX + 8, arrowX + 4}, + new int[]{arrowY - 3, arrowY - 3, arrowY + 3}, + 3 + ); } - }); - buttonPanel.add(btnEasy, gbc); + }; + difficultyComboBox.setPreferredSize(new Dimension(300, 45)); + difficultyComboBox.setFont(new Font("Segoe UI", Font.PLAIN, 15)); + difficultyComboBox.setBackground(CARD_COLOR); + difficultyComboBox.setForeground(TEXT_COLOR); + difficultyComboBox.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); + gbc.insets = new Insets(0, 0, 25, 0); + cardPanel.add(difficultyComboBox, gbc); - // Medium button - JButton btnMedium = new JButton("Medium (20x20)"); - btnMedium.setFont(new Font("Arial", Font.PLAIN, 16)); - btnMedium.setPreferredSize(new Dimension(200, 45)); - btnMedium.addActionListener(new ActionListener() { + // Start button with modern design + JButton startButton = new JButton("Start Game") { @Override - public void actionPerformed(ActionEvent e) { - startGame(MEDIUM_ROWS, MEDIUM_COLUMNS, MEDIUM_MINES); + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + // Draw gradient button + GradientPaint gp; + if (getModel().isArmed()) { + gp = new GradientPaint(0, 0, SECONDARY_COLOR.darker(), 0, getHeight(), + new Color(45, 150, 70)); + } else if (getModel().isRollover()) { + gp = new GradientPaint(0, 0, new Color(60, 180, 90), 0, getHeight(), + SECONDARY_COLOR.darker()); + } else { + gp = new GradientPaint(0, 0, SECONDARY_COLOR, 0, getHeight(), + new Color(45, 150, 70)); + } + g2d.setPaint(gp); + g2d.fill(new RoundRectangle2D.Double(0, 0, getWidth() - 1, getHeight() - 1, 20, 20)); + + // Draw text + g2d.setColor(Color.WHITE); + g2d.setFont(getFont()); + String text = getText(); + int textWidth = g2d.getFontMetrics().stringWidth(text); + int textHeight = g2d.getFontMetrics().getHeight(); + g2d.drawString(text, (getWidth() - textWidth) / 2, (getHeight() + textHeight / 2) / 2 + 2); } - }); - buttonPanel.add(btnMedium, gbc); - - // Hard button - JButton btnHard = new JButton("Hard (25x25)"); - btnHard.setFont(new Font("Arial", Font.PLAIN, 16)); - btnHard.setPreferredSize(new Dimension(200, 45)); - btnHard.addActionListener(new ActionListener() { + + @Override + public boolean isContentAreaFilled() { + return false; + } + }; + startButton.setFont(new Font("Segoe UI", Font.BOLD, 18)); + startButton.setPreferredSize(new Dimension(300, 50)); + startButton.setFocusPainted(false); + startButton.setBorderPainted(false); + startButton.setContentAreaFilled(false); + startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - startGame(HARD_ROWS, HARD_COLUMNS, HARD_MINES); + startGameWithSelectedDifficulty(); } }); - buttonPanel.add(btnHard, gbc); + gbc.insets = new Insets(0, 0, 0, 0); + cardPanel.add(startButton, gbc); + + // Add hint label + JLabel hintLabel = new JLabel("Tip: Left-click to reveal, Right-click to flag", JLabel.CENTER); + hintLabel.setFont(new Font("Segoe UI", Font.ITALIC, 12)); + hintLabel.setForeground(TEXT_LIGHT_COLOR); + gbc.insets = new Insets(20, 0, 0, 0); + cardPanel.add(hintLabel, gbc); + + // Wrap card panel in a container with shadow effect + JPanel cardContainer = new JPanel(new BorderLayout()); + cardContainer.setOpaque(false); + cardContainer.setBorder(BorderFactory.createEmptyBorder(0, 30, 30, 30)); + cardContainer.add(cardPanel, BorderLayout.CENTER); - mainPanel.add(buttonPanel, BorderLayout.CENTER); + mainPanel.add(cardContainer, BorderLayout.CENTER); add(mainPanel); setVisible(true); } + /** + * Start the game with selected difficulty + */ + private void startGameWithSelectedDifficulty() { + int selectedIndex = difficultyComboBox.getSelectedIndex(); + int rows, columns, minesNum; + + switch (selectedIndex) { + case 0: // Easy + rows = EASY_ROWS; + columns = EASY_COLUMNS; + minesNum = EASY_MINES; + break; + case 1: // Medium + rows = MEDIUM_ROWS; + columns = MEDIUM_COLUMNS; + minesNum = MEDIUM_MINES; + break; + case 2: // Hard + rows = HARD_ROWS; + columns = HARD_COLUMNS; + minesNum = HARD_MINES; + break; + default: // Default to Easy + rows = EASY_ROWS; + columns = EASY_COLUMNS; + minesNum = EASY_MINES; + } + + startGame(rows, columns, minesNum); + } + /** * Start the game with specified difficulty * @param rows number of rows @@ -112,7 +309,29 @@ private void startGame(int rows, int columns, int minesNum) { new MinesFrame(rows, columns, minesNum); } + /** + * Set the default UI font for all components + * @param font the font to set + */ + private static void setUIFont(FontUIResource font) { + java.util.Enumeration keys = UIManager.getDefaults().keys(); + while (keys.hasMoreElements()) { + Object key = keys.nextElement(); + Object value = UIManager.get(key); + if (value instanceof FontUIResource) { + UIManager.put(key, font); + } + } + } + public static void main(String[] args) { + // Use system look and feel for better integration + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + e.printStackTrace(); + } + new StartFrame(); } }