求一个java扫雷游戏的程序源代码,尽量多点注释,要确实可用的!急急急急急急急急急急急急!!!!!

Python014

求一个java扫雷游戏的程序源代码,尽量多点注释,要确实可用的!急急急急急急急急急急急急!!!!!,第1张

import java.awt.BorderLayout

import java.awt.Container

import java.awt.Font

import java.awt.GridLayout

import java.awt.Insets

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.awt.event.MouseAdapter

import java.awt.event.MouseEvent

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JMenu

import javax.swing.JMenuBar

import javax.swing.JMenuItem

import javax.swing.JPanel

import javax.swing.Timer

public class ScanLei1 extends JFrame implements ActionListener{

private static final long serialVersionUID = 1L

private Container contentPane

private JButton btn

private JButton[] btns

private JLabel b1

private JLabel b2

private JLabel b3

private Timer timer

private int row=9

private int col=9

private int bon=10

private int[][] a

private int b

private int[] a1

private JPanel p,p1,p2,p3

public ScanLei1(String title){

super(title)

contentPane=getContentPane()

setSize(297,377)

this.setBounds(400, 100, 400, 500)

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

timer =new Timer(1000,(ActionListener) this)

a = new int[row+2][col+2]

initGUI()

}

public void initGUI(){

p3=new JPanel()

b=bon

JMenuBar menuBar=new JMenuBar()

JMenu menu1=new JMenu("游戏")

JMenu menu2=new JMenu("帮助")

JMenuItem mi1=new JMenuItem("初级")

JMenuItem mi2 = new JMenuItem("中级")

JMenuItem mi3 =new JMenuItem("高级")

mi1.addActionListener(this)

menu1.add(mi1)

mi2.addActionListener(this)

menu1.add(mi2)

mi3.addActionListener(this)

menu1.add(mi3)

menuBar.add(menu1)

menuBar.add(menu2)

p3.add(menuBar)

b1=new JLabel(bon+"")

a1=new int[bon]

btn =new JButton("开始")

btn.addActionListener(this)

b2=new JLabel("0")

b3=new JLabel("")

btns=new JButton[row*col]

p=new JPanel()

p.setLayout(new BorderLayout())

contentPane.add(p)

p.add(p3,BorderLayout.NORTH)

//combo=new JComboBox(new Object[]{"初级","中级","高级"} )

//加监听

/*combo.addItemListener(new ItemListener(){

}})*/

p1=new JPanel()

//在那个位置

//(( FlowLayout)p1.getLayout()).setAlignment( FlowLayout.RIGHT)

p1.add(b1)

p1.add(btn)

p1.add(b2)

p1.add(b3)

p.add(p3,BorderLayout.NORTH)

p.add(p1,BorderLayout.CENTER)

p2=new JPanel()

p2.setLayout(new GridLayout(row,col,0,0))

for(int i=0i<row*coli++){

btns[i]=new JButton("")

btns[i].setMargin(new Insets(0,0,0,0))

btns[i].setFont(new Font(null,Font.BOLD,25))

btns[i].addActionListener(this)

btns[i].addMouseListener(new NormoreMouseEvent())

p2.add(btns[i])

}

contentPane.add(p,BorderLayout.NORTH)

contentPane.add(p2,BorderLayout.CENTER)

}

public void go(){

setVisible(true)

}

public static void main(String[] args){

new ScanLei1("扫雷").go()

}

public void out(int[][] a,JButton[] btns,ActionEvent e,int i,int x,int y){

int p=1

if(a[x][y]==0){

a[x][y]=10

btns[i].setEnabled(false) //33

for(int l=y-1l<=y+1l++){

int m=x-1-1

int n=l-1

p=1

System.out.println(a[1][2])

if(n>-1&&n<col&&m>-1&&m<row)

{

for(int q=0q<row&&p==1q++){//col-->row

if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){

if(a[x-1][l]!=0&&a[x-1][l]!=10){

btns[n+col*q].setText(a[x-1][l]+"")

a[x-1][l]=10

btns[n+col*q].setEnabled(false)

}

else if(a[x-1][l]==0){

//a[x-1][l]=10

btns[n+col*q].setEnabled(false)

out(a,btns,e,n+col*q,x-1,l)////55////

a[x-1][l]=10

btns[n+col*q].setEnabled(false)

}

p=0

}

}

}

p=1

m=x

if(n>-1&&n<col&&m>-1&&m<col)

{

for(int q=0q<row&&p==1q++){

if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){

if(a[x+1][l]!=0&&a[x+1][l]!=10){

btns[n+col*q].setText(a[x+1][l]+"")

a[x+1][l]=10

btns[n+col*q].setEnabled(false)

}

else if(a[x+1][l]==0){

out(a,btns,e,n+col*q,x+1,l)///55////

a[x+1][l]=10

btns[n+col*q].setEnabled(false)

}

p=0

}

}

}

}

int m=x-1

int n=y-1-1

p=1

if(n>-1&&n<col&&m>-1&&m<col)

{

for(int q=0q<row&&p==1q++){

if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){

if(a[x][y-1]!=0&&a[x][y-1]!=10){

btns[n+col*q].setText(a[x][y-1]+"")

a[x][y-1]=10

btns[n+col*q].setEnabled(false)

}

else if(a[x][y-1]==0){

out(a,btns,e,n+col*q,x,y-1)

a[x][y-1]=10

btns[n+col*q].setEnabled(false)

}

p=0

}

}

}

p=1

m=x-1

n=y+1-1

if(n>-1&&n<col&&m>-1&&m<col)

{

for(int q=0q<row&&p==1q++){

if(((n+col*q)>=(m*col))&&((n+col*q)<(m+1)*col)){

if(a[x][y+1]!=0&&a[x][y+1]!=10){

btns[n+col*q].setText(a[x][y+1]+"")

a[x][y+1]=10

btns[n+col*q].setEnabled(false)

}

else if(a[x][y+1]==0){

out(a,btns,e,n+col*q,x,y+1)

a[x][y+1]=10

btns[n+col*q].setEnabled(false)

}

p=0

}

}

}

}

}

public void actionPerformed(ActionEvent e) {

if(e.getActionCommand()=="初级"){

row=9

col=9

bon=10

a1=new int[bon]

b=bon

//setSize(297,377)

a = new int[row+2][col+2]

this.remove(p2)

timer.stop()

b1.setText("10")

b2.setText("0")

b3.setText("")

btns=new JButton[row*col]

p2=new JPanel()

p2.setLayout(new GridLayout(row,col,0,0))

for(int i=0i<row*coli++){

btns[i]=new JButton(" ")

btns[i].setMargin(new Insets(0,0,0,0))

btns[i].setFont(new Font(null,Font.BOLD,25))

btns[i].addActionListener(this)

btns[i].addMouseListener(new NormoreMouseEvent())

p2.add(btns[i])

}

contentPane.add(p2,BorderLayout.CENTER)

//setSize(297,377)

this.pack()

for(int i=0i<row*coli++){

btns[i].setText(" ")

btns[i].setEnabled(true)

}

for(int i=0i<row+2i++){

for(int j=0j<col+2j++){

a[i][j]=0

}

}

}else if(e.getActionCommand()=="中级"){

row=16

col=16

bon=40

//setSize(33*col,33*row+80)

a1=new int[bon]

a = new int[row+2][col+2]

b=bon

this.remove(p2)

timer.stop()

b1.setText("40")

b2.setText("0")

b3.setText("")

btns=new JButton[row*col]

p2=new JPanel()

p2.setLayout(new GridLayout(row,col,0,0))

for(int i=0i<row*coli++){

btns[i]=new JButton("")

btns[i].setMargin(new Insets(0,0,0,0))

btns[i].setFont(new Font(null,Font.BOLD,25))

btns[i].addActionListener(this)

btns[i].addMouseListener(new NormoreMouseEvent())

p2.add(btns[i])

}

contentPane.add(p2,BorderLayout.CENTER)

this.pack()

//setSize(33*col,33*row+80)

for(int i=0i<row*coli++){

btns[i].setText("")

btns[i].setEnabled(true)

}

for(int i=0i<row+2i++){

for(int j=0j<col+2j++){

a[i][j]=0

}

}

}else if(e.getActionCommand()=="高级"){

row=16

col=32

bon=99

setSize(33*col,33*row+80)

a1=new int[bon]

a = new int[row+2][col+2]

b=bon

this.remove(p2)

timer.stop()

b1.setText("99")

b2.setText("0")

b3.setText("")

btns=new JButton[row*col]

p2=new JPanel()

p2.setLayout(new GridLayout(row,col,0,0))

for(int i=0i<row*coli++){

btns[i]=new JButton("")

btns[i].setMargin(new Insets(0,0,0,0))

btns[i].setFont(new Font(null,Font.BOLD,25))

btns[i].addActionListener(this)

btns[i].addMouseListener(new NormoreMouseEvent())

p2.add(btns[i])

}

contentPane.add(p2,BorderLayout.CENTER)

//setSize(33*col,33*row+80)

this.pack()

for(int i=0i<row*coli++){

btns[i].setText("")

btns[i].setEnabled(true)

}

for(int i=0i<row+2i++){

for(int j=0j<col+2j++){

a[i][j]=0

}

}

}

if(e.getSource()==btn){

timer.start()

b=bon

b3.setText("")

//System.out.println(bon)

//清空

for(int i=0i<row*coli++){

btns[i].setText("")

btns[i].setEnabled(true)

}

for(int i=0i<row+2i++){

for(int j=0j<col+2j++){

a[i][j]=0

}

}

//产生随机数

for(int i=0i<boni++)

{ int p=1

int m=(int)(Math.random()*row*col)

while(p==1){

int l=1

int j

for( j=0j<i&&l==1j++){

if(a1[j]==m){

m=(int)(Math.random()*row*col)

l=0

}

}

if(j==i){

a1[i]=m

p=0

}

}

}

b1.setText(bon+"")

b2.setText("0")

//布雷

for(int i=0i<boni++){

int x=(a1[i]/col+1)

int y=(a1[i]%col+1)

a[x][y]=100

}

for(int i=0i<row+2i++){

for(int j=0j<col+2j++){

if(i==0||j==0||i==row+1||j==col+1){

a[i][j]=0

}

}

}

for(int i=1i<=rowi++){

for(int j=1j<=colj++){

if(a[i][j]!=100){

for(int l=j-1l<=j+1l++){

if(a[i-1][l]==100){

a[i][j]++

}

if(a[i+1][l]==100){

a[i][j]++

}

}

if(a[i][j-1]==100){

a[i][j]++

}

if(a[i][j+1]==100){

a[i][j]++

}

}

}

}

}

if(e.getSource()==timer)

{

String time=b2.getText().trim()

int t=Integer.parseInt(time)

//System.out.println(t)

if(t>=600){

timer.stop()

}else{

t++

b2.setText(t+"")

}

}

for(int i=0i<col*rowi++){

if(btns[i].getText()!="★")

{

int x=i/col+1

int y=i%col+1

if(e.getSource()==btns[i]&&a[x][y]==100){

btns[i].setText("★")

btns[i].setEnabled(false)

a[x][y]=10

for(int k=0k<col*rowk++){

int m1=k/col+1

int n1=k%col+1

if(a[m1][n1]!=10&&btns[k].getText()=="★"){

btns[k].setText("*o*")

}

}

for(int j=0j<col*rowj++){

int m=j/col+1

int n=j%col+1

if(a[m][n]==100){

btns[j].setText("★")

btns[j].setEnabled(false)

b3.setText("你输了 !!")

}

btns[j].setEnabled(false)

a[m][n]=10

}

timer.stop()

}

else if(e.getSource()==btns[i]){

if(a[x][y]==0){

out(a,btns,e,i,x,y)

a[x][y]=10

btns[i].setEnabled(false)

}

if(a[x][y]!=0&&a[x][y]!=10){

btns[i].setText(a[x][y]+"")

btns[i].setEnabled(false)

a[x][y]=10

}

}

}else if(btns[i].getText()=="★"){

}

}

}

class NormoreMouseEvent extends MouseAdapter{

public void mouseClicked(MouseEvent e) {

System.out.println(b)

for(int i=0i<col*rowi++){

int x1=i/col+1

int y1=i%col+1

if(e.getSource()==btns[i]&&btns[i].getText()!="★"&&a[x1][y1]!=10)

{

if(e.getButton()==MouseEvent.BUTTON3){

btns[i].setText("★")

b--

if(b==0){

int flag=0

for(int j=0j<col*rowj++){

int x=j/col+1

int y=j%col+1

if(a[x][y]==100&&btns[j].getText()=="★"){

flag++

}

}

if(flag==bon){

timer.stop()

b3.setText("你赢了!")

}

}

b1.setText(b+"")

}

}else if(e.getSource()==btns[i]&&btns[i].getText()=="★"&&a[x1][y1]!=-1){

if(e.getButton()==MouseEvent.BUTTON3){

btns[i].setText("")

b++

if(b>bon){

b1.setText(bon+"")

}

else{

b1.setText(b+"")

}

btns[i].setEnabled(true)

}

}

}

}

}

}

"扫雷"小游戏C代码

#include<stdio.h>

#include<math.h>

#include<time.h>

#include<stdlib.h>

main( )

{char a[102][102],b[102][102],c[102][102],w

int i,j /*循环变量*/

int x,y,z[999] /*雷的位置*/

int t,s /*标记*/

int m,n,lei /*计数*/

int u,v /*输入*/

int hang,lie,ge,mo /*自定义变量*/

srand((int)time(NULL)) /*启动随机数发生器*/

leb1:  /*选择模式*/

printf("\n   请选择模式:\n   1.标准  2.自定义\n")

scanf("%d",&mo)

if(mo==2)  /*若选择自定义模式,要输入三个参数*/

{do

{t=0printf("请输入\n行数 列数 雷的个数\n")

scanf("%d%d%d",&hang,&lie,&ge)

if(hang<2){printf("行数太少\n")t=1}

if(hang>100){printf("行数太多\n")t=1}

if(lie<2){printf("列数太少\n")t=1}

if(lie>100){printf("列数太多\n")t=1}

if(ge<1){printf("至少要有一个雷\n")t=1}

if(ge>=(hang*lie)){printf("雷太多了\n")t=1}

}while(t==1)

}

else{hang=10,lie=10,ge=10}  /*否则就是选择了标准模式(默认参数)*/

for(i=1i<=gei=i+1)  /*确定雷的位置*/

{do

{t=0z[i]=rand( )%(hang*lie)

for(j=1j<ij=j+1){if(z[i]==z[j]) t=1}

}while(t==1)

}

for(i=0i<=hang+1i=i+1)  /*初始化a,b,c*/

{for(j=0j<=lie+1j=j+1) {a[i][j]='1'b[i][j]='1'c[i][j]='0'} }

for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1) {a[i][j]='+'} }

for(i=1i<=gei=i+1)  /*把雷放入c*/

{x=z[i]/lie+1y=z[i]%lie+1c[x][y]='#'}

for(i=1i<=hangi=i+1)  /*计算b中数字*/

{for(j=1j<=liej=j+1)

{m=48

if(c[i-1][j-1]=='#')m=m+1if(c[i][j-1]=='#')m=m+1

if(c[i-1][j]=='#')m=m+1 if(c[i+1][j+1]=='#')m=m+1

if(c[i][j+1]=='#')m=m+1 if(c[i+1][j]=='#')m=m+1

if(c[i+1][j-1]=='#')m=m+1if(c[i-1][j+1]=='#')m=m+1

b[i][j]=m

}

}

for(i=1i<=gei=i+1)  /*把雷放入b中*/

{x=z[i]/lie+1y=z[i]%lie+1b[x][y]='#'}

lei=ge /*以下是游戏设计*/

do

{leb2:  /*输出*/

system("cls")printf("\n\n\n\n")

printf("    ")

for(i=1i<=liei=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c  ",w)

}

printf("\n   |")

for(i=1i<=liei=i+1){printf("---|")}

printf("\n")

for(i=1i<=hangi=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c |",w)

for(j=1j<=liej=j+1)

{if(a[i][j]=='0')printf("   |")

else printf(" %c |",a[i][j])

}

if(i==2)printf(" 剩余雷个数")

if(i==3)printf(" %d",lei)

printf("\n   |")

for(j=1j<=liej=j+1){printf("---|")}

printf("\n")

}

scanf("%d%c%d",&u,&w,&v) /*输入*/

u=u+1,v=v+1

if(w!='#'&&a[u][v]=='@')

goto leb2

if(w=='#')

{if(a[u][v]=='+'){a[u][v]='@'lei=lei-1}

else if(a[u][v]=='@'){a[u][v]='?'lei=lei+1}

else if(a[u][v]=='?'){a[u][v]='+'}

goto leb2

}

a[u][v]=b[u][v]

leb3:  /*打开0区*/

t=0

if(a[u][v]=='0')

{for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=1i<=hangi=i+1)

{for(j=liej>=1j=j-1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1   if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=hangi>=1i=i-1)

{for(j=1j<=liej=j+1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=hangi>=1i=i-1)

{for(j=liej>=1j=j-1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1  if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=1i<=hangi=i+1)  /*检测0区*/

{for(j=1j<=liej=j+1)

{if(a[i][j]=='0')

{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1

if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1

if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1

if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1

if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1

if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1

if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1

if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1

}

}

}

if(t==1)goto leb3

}

n=0 /*检查结束*/

for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1)

{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1}

}

}

while(a[u][v]!='#'&&n!=(hang*lie-ge))

for(i=1i<=gei=i+1)  /*游戏结束*/

{x=z[i]/lie+1y=z[i]%lie+1a[x][y]='#'}

printf("    ")

for(i=1i<=liei=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c  ",w)

}

printf("\n   |")

for(i=1i<=liei=i+1){printf("---|")}

printf("\n")

for(i=1i<=hangi=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c |",w)

for(j=1j<=liej=j+1)

{if(a[i][j]=='0')printf(" |")

else  printf(" %c |",a[i][j])

}

if(i==2)printf(" 剩余雷个数")

if(i==3)printf(" %d",lei)printf("\n   |")

for(j=1j<=liej=j+1) {printf("---|")}

printf("\n")

}

if(n==(hang*lie-ge)) printf("你成功了!\n")

else printf("    游戏结束!\n")

printf("    重玩请输入1\n")

t=0

scanf("%d",&t)

if(t==1)goto leb1

}

/*注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/

用TC自己玩一下吧

/*5.3.4 源程序*/

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFTPRESS 0xff01

#define LEFTCLICK 0xff10

#define LEFTDRAG 0xff19

#define MOUSEMOVE 0xff08

struct

{

int num/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/

int roundnum/*统计格子周围有多少雷*/

int flag/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/

}Mine[10][10]

int gameAGAIN=0/*是否重来的变量*/

int gamePLAY=0/*是否是第一次玩游戏的标志*/

int mineNUM/*统计处理过的格子数*/

char randmineNUM[3]/*显示数字的字符串*/

int Keystate

int MouseExist

int MouseButton

int MouseX

int MouseY

void Init(void)/*图形驱动*/

void MouseOn(void)/*鼠标光标显示*/

void MouseOff(void)/*鼠标光标隐藏*/

void MouseSetXY(int,int)/*设置当前位置*/

int LeftPress(void)/*左键按下*/

int RightPress(void)/*鼠标右键按下*/

void MouseGetXY(void)/*得到当前位置*/

void Control(void)/*游戏开始,重新,关闭*/

void GameBegain(void)/*游戏开始画面*/

void DrawSmile(void)/*画笑脸*/

void DrawRedflag(int,int)/*显示红旗*/

void DrawEmpty(int,int,int,int)/*两种空格子的显示*/

void GameOver(void)/*游戏结束*/

void GameWin(void)/*显示胜利*/

int MineStatistics(int,int)/*统计每个格子周围的雷数*/

int ShowWhite(int,int)/*显示无雷区的空白部分*/

void GamePlay(void)/*游戏过程*/

void Close(void)/*图形关闭*/

void main(void)

{

Init()

Control()

Close()

}

void Init(void)/*图形开始*/

{

int gd=DETECT,gm

initgraph(&gd,&gm,"c:\\tc")

}

void Close(void)/*图形关闭*/

{

closegraph()

}

void MouseOn(void)/*鼠标光标显示*/

{

_AX=0x01

geninterrupt(0x33)

}

void MouseOff(void)/*鼠标光标隐藏*/

{

_AX=0x02

geninterrupt(0x33)

}

void MouseSetXY(int x,int y)/*设置当前位置*/

{

_CX=x

_DX=y

_AX=0x04

geninterrupt(0x33)

}

int LeftPress(void)/*鼠标左键按下*/

{

_AX=0x03

geninterrupt(0x33)

return(_BX&1)

}

int RightPress(void)/*鼠标右键按下*/

{

_AX=0x03

geninterrupt(0x33)

return(_BX&2)

}

void MouseGetXY(void)/*得到当前位置*/

{

_AX=0x03

geninterrupt(0x33)

MouseX=_CX

MouseY=_DX

}

void Control(void)/*游戏开始,重新,关闭*/

{

int gameFLAG=1/*游戏失败后判断是否重新开始的标志*/

while(1)

{

if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/

{

GameBegain()/*游戏初始画面*/

GamePlay()/*具体游戏*/

if(gameAGAIN==1)/*游戏中重新开始*/

{

gameAGAIN=0

continue

}

}

MouseOn()

gameFLAG=0

if(LeftPress())/*判断是否重新开始*/

{

MouseGetXY()

if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)

{

gameFLAG=1

continue

}

}

if(kbhit())/*判断是否按键退出*/

break

}

MouseOff()

}

void DrawSmile(void)/*画笑脸*/

{

setfillstyle(SOLID_FILL,YELLOW)

fillellipse(290,75,10,10)

setcolor(YELLOW)

setfillstyle(SOLID_FILL,BLACK)/*眼睛*/

fillellipse(285,75,2,2)

fillellipse(295,75,2,2)

setcolor(BLACK)/*嘴巴*/

bar(287,80,293,81)

}

void DrawRedflag(int i,int j)/*显示红旗*/

{

setcolor(7)

setfillstyle(SOLID_FILL,RED)

bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5)

setcolor(BLACK)

line(198+j*20,95+i*20,198+j*20,95+i*20+10)

}

void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/

{

setcolor(color)

setfillstyle(SOLID_FILL,color)

if(mode==0)/*没有单击过的大格子*/

bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8)

else

if(mode==1)/*单击过后显示空白的小格子*/

bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7)

}

void GameBegain(void)/*游戏开始画面*/

{

int i,j

cleardevice()

if(gamePLAY!=1)

{

MouseSetXY(290,70)/*鼠标一开始的位置,并作为它的初始坐标*/

MouseX=290

MouseY=70

}

gamePLAY=1/*下次按重新开始的话鼠标不重新初始化*/

mineNUM=0

setfillstyle(SOLID_FILL,7)

bar(190,60,390,290)

for(i=0i<10i++)/*画格子*/

for(j=0j<10j++)

DrawEmpty(i,j,0,8)

setcolor(7)

DrawSmile()/*画脸*/

randomize()

for(i=0i<10i++)/*100个格子随机赋值有没有地雷*/

for(j=0j<10j++)

{

Mine[i][j].num=random(8)/*如果随机数的结果是1表示这个格子有地雷*/

if(Mine[i][j].num==1)

mineNUM++/*现有雷数加1*/

else

Mine[i][j].num=2

Mine[i][j].flag=0/*表示没红旗标志*/

}

sprintf(randmineNUM,"%d",mineNUM)/*显示这次总共有多少雷数*/

setcolor(1)

settextstyle(0,0,2)

outtextxy(210,70,randmineNUM)

mineNUM=100-mineNUM/*变量取空白格数量*/

MouseOn()

}

void GameOver(void)/*游戏结束画面*/

{

int i,j

setcolor(0)

for(i=0i<10i++)

for(j=0j<10j++)

if(Mine[i][j].num==1)/*显示所有的地雷*/

{

DrawEmpty(i,j,0,RED)

setfillstyle(SOLID_FILL,BLACK)

fillellipse(200+j*20,100+i*20,7,7)

}

}

void GameWin(void)/*显示胜利*/

{

setcolor(11)

settextstyle(0,0,2)

outtextxy(230,30,"YOU WIN!")

}

int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/

{

int nNUM=0

if(i==0&&j==0)/*左上角格子的统计*/

{

if(Mine[0][1].num==1)

nNUM++

if(Mine[1][0].num==1)

nNUM++

if(Mine[1][1].num==1)

nNUM++

}

else

if(i==0&&j==9)/*右上角格子的统计*/

{

if(Mine[0][8].num==1)

nNUM++

if(Mine[1][9].num==1)

nNUM++

if(Mine[1][8].num==1)

nNUM++

}

else

if(i==9&&j==0)/*左下角格子的统计*/

{

if(Mine[8][0].num==1)

nNUM++

if(Mine[9][1].num==1)

nNUM++

if(Mine[8][1].num==1)

nNUM++

}

else

if(i==9&&j==9)/*右下角格子的统计*/

{

if(Mine[9][8].num==1)

nNUM++

if(Mine[8][9].num==1)

nNUM++

if(Mine[8][8].num==1)

nNUM++

}

else if(j==0)/*左边第一列格子的统计*/

{

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

}

else if(j==9)/*右边第一列格子的统计*/

{

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

}

else if(i==0)/*第一行格子的统计*/

{

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

}

else if(i==9)/*最后一行格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

}

else/*普通格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

}

return(nNUM)/*把格子周围一共有多少雷数的统计结果返回*/

}

int ShowWhite(int i,int j)/*显示无雷区的空白部分*/

{

if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/

return

mineNUM--/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/

if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/

{

DrawEmpty(i,j,1,7)

Mine[i][j].num=0

}

else

if(Mine[i][j].roundnum!=0)/*输出雷数*/

{

DrawEmpty(i,j,0,8)

sprintf(randmineNUM,"%d",Mine[i][j].roundnum)

setcolor(RED)

outtextxy(195+j*20,95+i*20,randmineNUM)

Mine[i][j].num=0/*已经输出雷数的格子用0表示已经用过这个格子*/

return

}

/*8个方向递归显示所有的空白格子*/

if(i!=0&&Mine[i-1][j].num!=1)

ShowWhite(i-1,j)

if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1)

if(j!=9&&Mine[i][j+1].num!=1)

ShowWhite(i,j+1)

if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1)

if(i!=9&&Mine[i+1][j].num!=1)

ShowWhite(i+1,j)

if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1)

if(j!=0&&Mine[i][j-1].num!=1)

ShowWhite(i,j-1)

if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1)

}

void GamePlay(void)/*游戏过程*/

{

int i,j,Num/*Num用来接收统计函数返回一个格子周围有多少地雷*/

for(i=0i<10i++)

for(j=0j<10j++)

Mine[i][j].roundnum=MineStatistics(i,j)/*统计每个格子周围有多少地雷*/

while(!kbhit())

{

if(LeftPress())/*鼠标左键盘按下*/

{

MouseGetXY()

if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/

{

MouseOff()

gameAGAIN=1

break

}

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20/*x坐标*/

i=(MouseY-90)/20/*y坐标*/

if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/

continue

if(Mine[i][j].num!=0)/*如果格子没有处理过*/

{

if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/

{

MouseOff()

GameOver()/*游戏失败*/

break

}

else/*鼠标按下的格子不是地雷*/

{

MouseOff()

Num=MineStatistics(i,j)

if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/

ShowWhite(i,j)

else/*按下格子周围有地雷*/

{

sprintf(randmineNUM,"%d",Num)/*输出当前格子周围的雷数*/

setcolor(RED)

outtextxy(195+j*20,95+i*20,randmineNUM)

mineNUM--

}

MouseOn()

Mine[i][j].num=0/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/

if(mineNUM<1)/*胜利了*/

{

GameWin()

break

}

}

}

}

}

if(RightPress())/*鼠标右键键盘按下*/

{

MouseGetXY()

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20/*x坐标*/

i=(MouseY-90)/20/*y坐标*/

MouseOff()

if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/

{

DrawRedflag(i,j)

Mine[i][j].flag=1

}

else

if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/

{

DrawEmpty(i,j,0,8)

Mine[i][j].flag=0

}

}

MouseOn()

sleep(1)

}

}

}