如何用java写一个小游戏?

包mybase.programe

/*

*连连看整体算法思路:由两个按钮决定。如果这两个按钮的数量相等,开始寻找它们连接的路径。找到穿过这里的路。

*有三种情况:(从下面三种情况可以知道需要三次测试,这三次测试分别检测一条直路。所以会有

*三条路。如果三条路都是空按钮,那么连接两个按钮的只是三种直线(两个转折点)

* 1.邻近的

*

* 2.如果它们不相邻,首先在第一个按钮的对等体中找到一个空按钮。1).找到后,再横向看第二个按钮到这个空按钮。

*列中是否有按钮。2).如果没有,看第一个按钮和与之同行的空按钮之间是否有按钮。3).如果不是,那么从

*与第一个按钮同行的空按钮与第二个按钮同行垂直,看是否有按钮。如果没有,路就通了,可以淘汰。

*

* 3.如果2失败,在与第一个按钮相同的列中找到一个空按钮。1).找到后,看第二个按钮是否垂直于这个空按钮所在的线。

* 2).如果没有,看同一列第一个按钮和空按钮之间是否有按钮。3).如果不是,则与第一个按钮在同一列。

*空按钮与第二个按钮水平同列,看是否有按钮。如果没有,路就通了,可以淘汰。

*

*如果上述三个步骤都失败,这两个按钮就无法擦除。

*/

导入javax . swing . *;

导入Java . awt . *;

导入Java . awt . event . *;

公共类连连看实现ActionListener {

JFrame主机;//主面板

容器thisContainer

JPanel centerPanel,southPanel,northPanel//子面板

JButton diamonds button[][]= new JButton[6][5];//游戏按钮数组

JButton exitButton,resetButton,newlyButton//退出、重新排序和重新启动按钮

JLabel fractional able = new JLabel(" 0 ");//分数标签

JButton firstButton,secondButton//分别记录两次选中的按钮。

//存储游戏按钮的位置(其实这里只有6行5列。但是我们使用了8行7列。等于围绕这个面板按钮。

//一层按钮为0,这样可以消除靠近面板边缘的两个按钮)

int grid[][]= new int[8][7];

静态布尔表达式信息=假;//判断按钮是否被选中。

int x0 = 0,y0 = 0,x = 0,y = 0,fristMsg = 0,secondMsg = 0,validateLV//游戏按钮的位置坐标

int i,j,k,n;//消除方法控制

public void init() {

MainFrame = new JFrame(“JKJ连连看”);

this container = mainframe . getcontentpane();

this container . set layout(new BorderLayout());

center panel = new JPanel();

south panel = new JPanel();

north panel = new JPanel();

thisContainer.add(centerPanel," Center ");

thisContainer.add(southPanel," South ");

thisContainer.add(northPanel," North ");

center panel . set layout(new GridLayout(6,5));

for(int cols = 0;cols & lt6;cols++) {

for(int rows = 0;行数& lt5;rows++) {

diamondsButton[cols][rows] =新的JButton(String

。value of(grid[cols+1][rows+1]);

菱形按钮[列][行]。addActionListener(this);

center panel . add(diamonds button[cols][rows]);

}

}

exit button = new JButton(" exit ");

exit button . addactionlistener(this);

reset button = new JButton(" regroup ");

reset button . addactionlistener(this);

NewlyButton = new JButton("再来一局");

newly button . addactionlistener(this);

south panel . add(exit button);

south panel . add(reset button);

south panel . add(newly button);

fraction lable . settext(string . value of(integer . parse int(fraction lable

。getText()))));

north panel . add(fractional able);

mainFrame.setBounds(280,100,500,450);

mainframe . set visible(true);

mainframe . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);

}

public void randomBuild() {

int randoms,cols,rows

for(int twins = 1;双胞胎& lt= 15;Twins++) {//共有15对按钮,30个。

randoms =(int)(math . random()* 25+1);//按钮上的数字

for(int like = 1;相似& lt= 2;like++) {

cols =(int)(math . random()* 6+1);

rows =(int)(math . random()* 5+1);

while (grid[cols][rows]!= 0) {//等于0表示这个空间有按钮。

cols =(int)(math . random()* 6+1);

rows =(int)(math . random()* 5+1);

}

this . grid[cols][rows]= randoms;

}

}

}

公共空隙率(){

fraction lable . settext(string . value of(integer . parse int(fraction lable

。getText())+100));

}

公共void reload() {

int save[]= new int[30];

int n = 0,cols,rows

int grid[][]= new int[8][7];

for(int I = 0;我& lt= 6;i++) {

for(int j = 0;j & lt= 5;j++) {

if (this.grid[i][j]!= 0) {

save[n]= this . grid[I][j];//记下每个按钮的编号。

n++;//有几个按钮没有消除。

}

}

}

n = n-1;

this.grid = grid

while(n & gt;= 0) {//再放一次没有消除的按钮。

cols =(int)(math . random()* 6+1);

rows =(int)(math . random()* 5+1);

while (grid[cols][rows]!= 0) {

cols =(int)(math . random()* 6+1);

rows =(int)(math . random()* 5+1);

}

this . grid[cols][rows]= save[n];

n-;

}

mainframe . set visible(false);

pressInformation = false//此处按钮点击信息必须归类为初始。

init();

for(int I = 0;我& lt6;i++) {

for(int j = 0;j & lt5;j++) {

if(grid[I+1][j+1]= = 0)

菱形按钮[i][j]。set visible(false);

}

}

}

public void estimate even(int placeX,int placeY,JButton bz) {

if (pressInformation == false) {

x = placeX

y = placeY

second msg = grid[x][y];

secondButton = bz

pressInformation = true

}否则{

x0 = x;

y0 = y;

fristMsg = secondMsg

firstButton = secondButton

x = placeX

y = placeY

second msg = grid[x][y];

secondButton = bz

if(frist msg = = second msg & amp;& amp秒按钮!= firstButton) {

肖();

}

}

}

Public void xiao() {//相同情况下可以消除吗?仔细分析,不是笔记。

if((x0 = = x & amp;& amp(y0 == y + 1 || y0 == y - 1))

| |((x0 = = x+1 | | x0 = = x-1)& amp;& amp(y0 = = y)){///判断它们是否相邻。

移除();

}否则{

for(j = 0;j & lt7;j++) {

If (grid[x0][j] == 0) {//确定哪个按钮与第一个按钮一起为空。

//如果发现空按钮,根据列值的三种情况,比较第二个按钮的位置和空按钮的位置。

如果(y & gtJ) {//第二个按钮在空按钮的右边。

for(I = y-1;我& gt= j;I-){//检测从第二个按钮的水平左侧到空格所在的列是否存在所有空格。

if (grid[x][i]!= 0) {

k = 0;

打破;//如果有非空格,退出。这个退出在k==2的情况下是不可能的,所以会到底部215行会显示相同的判断柱。

}否则{

k = 1;

} // K=1表示所有空格都通过了第一次验证,即从第二个按钮到空格所在的列,所有空格都被留下。

}

if (k == 1) {

line passone();//进入第二次验证,即判断第一个按钮与其对等按钮之间的空格。

}

}

if(y & lt;J) {//第二个按钮在空按钮的左边。

for(I = y+1;我& lt= j;I++) {//检测从第二个按钮的水平右侧到空格所在的列是否存在所有空格。

if (grid[x][i]!= 0) {

k = 0;

打破;

}否则{

k = 1;

}

}

if (k == 1) {

line passone();

}

}

If (y == j) {//第二个按钮与空按钮在同一列。

line passone();

}

}

//第三次检查第J列确定为空的按钮是否与第二个按钮垂直,看是否有按钮。

if (k == 2) {

If (x0 == x) {//第一个和第二个按钮在同一行。

移除();

}

如果(x0 & ltX) {//第一个按钮在第二个按钮下面。

for(n = x0;n & lt= x-1;N++) {//从空按钮垂直到第二个按钮所在行是否有按钮。

if (grid[n][j]!= 0) {

k = 0;

打破;

}

//没有按钮,表示这条路会通。

if(grid[n][j]= = 0 & amp;& ampn == x - 1) {

移除();

}

}

}

如果(x0 & gtX) {//第一个按钮在第二个按钮上面。

for(n = x0;n & gt= x+1;n - ) {

if (grid[n][j]!= 0) {

k = 0;

打破;

}

if(grid[n][j]= = 0 & amp;& ampn == x + 1) {

移除();

}

}

}

}

}// - for

//当上面未能检测到空白按钮与第一个按钮同行(找不到与第二个按钮的连接路径)时,执行下面的执行。

//检测与第一个按钮在同一列的空白按钮。

for(I = 0;我& lt8;i++) {

If (grid[i][y0] == 0) {//确定与第一个按钮在同一列的哪个按钮是空的。

if(x & gt;I) {//第二个按钮在这个空按钮下面。

for(j = x-1;j & gt= I;j - ) {

if (grid[j][y]!= 0) {

k = 0;

打破;

}否则{

k = 1;

}

}

if (k == 1) {

rowPassOne();

}

}

if(x & lt;I) {//第二个按钮在这个空按钮的上面。

for(j = x+1;j & lt= I;j++) {

if (grid[j][y]!= 0) {

k = 0;

打破;

}否则{

k = 1;

}

}

if (k == 1) {

rowPassOne();

}

}

If (x == i) {//第二个按钮配这个空按钮。

rowPassOne();

}

}

if (k == 2) {

If (y0 == y) {//第二个按钮与第一个按钮在同一列。

移除();

}

如果(y0 & ltY) {//第二个按钮在第一个按钮的右边。

for(n = y0;n & lt= y-1;n++) {

if (grid[i][n]!= 0) {

k = 0;

打破;

}

if(grid[I][n]= = 0 & amp;& ampn == y - 1) {

移除();

}

}

}

如果(y0 & gtY) {//第二个按钮在第一个按钮的左边。

for(n = y0;n & gt= y+1;n - ) {

if (grid[i][n]!= 0) {

k = 0;

打破;

}

if(grid[I][n]= = 0 & amp;& ampn == y + 1) {

移除();

}

}

}

}

}// - for

}// - else

}// -肖

公共void linePassOne() {

如果(y0 & gtJ) {//第一个按钮在同一行,空按钮在左边。

for(I = y0-1;我& gt= j;I-){//判断第一个按钮和左侧空按钮之间是否有按钮。

if(网格[x0][i]!= 0) {

k = 0;

打破;

}否则{

k = 2;

} // K=2表示第二次验证已经通过。

}

}

如果(y0 & ltJ) {//第一个按钮在同一行,空按钮在右边。

for(I = y0+1;我& lt= j;i++) {

if(网格[x0][i]!= 0) {

k = 0;

打破;

}否则{

k = 2;

}

}

}

}

public void rowPassOne() {

如果(x0 & gtI) {//第一个按钮在与其同列的空白按钮下面。

for(j = x0-1;j & gt= I;j - ) {

if (grid[j][y0]!= 0) {

k = 0;

打破;

}否则{

k = 2;

}

}

}

如果(x0 & ltI) {//第一个按钮在同一列的空白按钮之上。

for(j = x0+1;j & lt= I;j++) {

if (grid[j][y0]!= 0) {

k = 0;

打破;

}否则{

k = 2;

}

}

}

}

公共void remove() {

first button . set visible(false);

second button . set visible(false);

分数();

pressInformation = false

k = 0;

网格[x0][y0]= 0;

grid[x][y]= 0;

}

public void action performed(action event e){

if(e . getsource()= = newly button){

int grid[][]= new int[8][7];

this.grid = grid

random build();

mainframe . set visible(false);

pressInformation = false

init();

}

if (e.getSource() == exitButton)

system . exit(0);

if (e.getSource() == resetButton)

重载();

for(int cols = 0;cols & lt6;cols++) {

for(int rows = 0;行数& lt5;rows++) {

if(e . getsource()= = diamonds button[cols][rows])

estimateEven(列+ 1,行+ 1,diamonds button[列][行]);

}

}

}

公共静态void main(String[] args) {

连连看llk =新连连看();

llk . randombuild();

llk . init();

}

}