「java格子塌陷」java棋盘格子怎么输入

博主:adminadmin 2022-12-13 15:33:12 70

本篇文章给大家谈谈java格子塌陷,以及java棋盘格子怎么输入对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

简述java程序设计中界面设计中的三种布局方式

1 边框布局

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new FlowLayout());

凭着我们现在所积累的阅读程序的功夫,应该能够很快地知道我们通过第一条语句创建了一个容器JPanel类的panel1。

而接下来,我们则调用了panel1.setLayout(new FlowLayout()),在上一章中,我们一直没有对它进行相应的分析。现在该是揭开它的面纱的时候了。

单词layout的中文意思是“布局”、“布置”,setLayout就是设置布局格式。也就是说,容器panel1的方法setLayout是用来设置布局格式的。那么,我们一直用的是什么模式呢?对,就是后面括号里的FlowLayout()。顾名思义,也就是流布局方式。这是一种顺其自然的方式:从左到右,一个个对象地摆放,摆不下,就摆到下一行。所以,我们就无法去控制它。

从本章开始,我们就要学习一种控制布局的方法。在Java语言中,提供了各种布局管理器,以便大家能够达到这一目的。

通常我们最常使用的布局管理器是:Border Layout(边框布局管理器),如下图所示,边框布局管理器将一个屏幕分成了五个部分:东、南、西、北、中。

如果要使用这种边框布局管理进行布局控制,我们必须先将“容器”设置为“边框布局控制模式”,具体来说,就是当调用setLayout方法为容器设置布局控制模式时,参数设置为BorderLayout。例如:

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new BorderLayout());

然后,我们就可以在使用容器的add方法添加部件时,附加上位置参数,使得该部件显示在指定的位置上。位置参数分别是:

BorderLayout.NORTH 位置为北

BorderLayout.SOUTH 位置为南

BorderLayout.EAST 位置为东

BorderLayout.WEST 位置为西

BorderLayout.NORTH 位置为中心

实例说明

下面,我们就来试一试,使用按钮排出五个方向!请创建一个testBorder.java,输入以下源程序:

源程序:useTextArea.java

import java.awt.*;

import javax.swing.*;

import java.applet.Applet;

public class testBorder extends JApplet

{

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new BorderLayout());

JButton north=new JButton("North");

JButton south=new JButton("South");

JButton east=new JButton("East");

JButton west=new JButton("West");

JButton center=new JButton("Center");

panel1.add(north,BorderLayout.NORTH);

panel1.add(south,BorderLayout.SOUTH);

panel1.add(east,BorderLayout.EAST);

panel1.add(west,BorderLayout.WEST);

panel1.add(center,BorderLayout.CENTER);

}

}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面

为了试一下,如果并没有在每个位置都安排一个部件,那么会怎么样呢?我们修改一下程序,将panel1.add(west,BorderLayout.WEST);这一行注释掉(就是在前面加上“//”号),也就是不显示西边的按钮,看一下结果如何。正如上图(图10-3)所示,西边由于没有部件,因此“中”就朝西靠,“占领”了它的位置。

而如果我们修改一下程序,让中间的按钮不显示的话,就会出现如图10-5的样子,中间的区域并未并占领,而是空在那里了!这是与其它位置不同的地方,大家一定要记住。

一些提示:

其实这很好理解,如果中间的那一块的位置被其它位置上的部件占领的话,就会使得分不清“东”、“南”、“西”、“北”了。倒成了“左上角”、“左下角”、“右上角”、“右下角”了。

2 网格布局

实例说明

下面,我们来看一个新的程序!首先创建一个testGrid.java文件,并输入以下源程序:

源程序:testGrid.java

import java.awt.*;

import javax.swing.*;

import java.applet.Applet;

public class testGrid extends JApplet

{

String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",

"No.6","No.7","No.8","No.9"};

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new GridLayout(3,3));

for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));

}

}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面

我们主要是关心如何摆放各个部件,而不是如何构建一个程序。所以,正如本例中的按钮一下,这一章中的所有部件都是一个样子,没有任何作用。这样也使得程序尽可能地变短了,更易于大家阅读和理解程序。

下面,我们就一起来看一下上面的这个程序。

1) String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",

"No.6","No.7","No.8","No.9"}

我想大家都能很轻松地读懂这条语句,我们在此定义了一个字符串数组buttonLabels,它有9个字符串成员,也就是我们后面定义的9个按钮的标签文本。

值得注意的是,大家一定要知道,buttonLabels[1]表示哪个字符串!如果您的答案是“No.1”的话,就错了!正确的答案是“No.2”,这是因为在数组中索引值是从0开始的,也就是说如果要使用“No.1”的话,应该使用buttonLabels[0]。这对更好地理解后面的程序十分重要,也是基本功之一。

2) JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new GridLayout(3,3));

在这两行程序中,我们首先定义了一个容器部件panel1。然后调用setLayout方法设置布局管理器。这里我们使用了一个新的布局管理器:GridLayout,网格布局管理器。

我们注意到GridLayout的后面带了两个参数:3,3。这有什么用呢?我们一起来看一下GridLayout方法的定义:

public GridLayout (int rows,int cols)

我们看一下这两个参数,首先它们都是int型—整型的。那么它们分别起到什么作用呢?我们还是采用顾名思义法吧!row的中文意思是行,col的中文意思是列,后面加上一个s,是这两个单词的复数形式。

好,我们现在串起来想一下,我们定义了一个网格布局,然后定了它的行、列数!这不就画出了这个网格了吗?如果我们在语句是使用GridLayout(5,5)的话,就会把整个容器分成25个单元

而我们在程序中使用的是GridLayout(3,3),所以它就将整个容器分成了

注意:

这种划分是一种逻辑上的,暗藏式的划分,而不会把格子给划出来。另外,我们这里举的两个例子行、列都相等,其实完全可以不等。

3) for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));

这是一个循环结构的程序。我们先看循环语句,循环的初值是“x=0”,继续执行循环的条件语句是“xbuttonLabels.length就是用来请得字符串数组buttonLabels的长度!也就是这个字符串数组中有多少个字符串?我们知道,我们在该数组中定义了9个。

从程序中,我们可以获知,当x=buttonLabels.length时,循环就将结束,应为它不满足条件x别忘了,我们使用buttonLabels[0]表示第一个字符串,buttonLabels[1]表示第二个字符串……,那么最后一个字符串就应该是buttonLabels[buttonLabels.length-1]嘛。

在循环中,我们使用容器提供的add方法,将新定义的按钮部件添加进去。

有时,我们可能想获得象下图所示的布局效果!让各个部件之间存在一些间隙。使用Java的网格布局可以实现吗?

我很高兴地回答你:“可以!”,我们可以使用GridLayout的另一种构造器方法(签名不同)来实现:

public GridLayout (int rows,int cols,int hgap,int vgap)

在这个方法中,可以带上四个整型参数,前两个我们已经很熟悉了,行数与列数。后面则是两个新的参数。

第一个是hgap,其中gap的意思是间隙、空隙的意思,而h则是horizontal(水平)的第一个字母。也就是说,我们可以通过hgap参数设置横向的间隙。

第二个是vgap,v则是vertical(垂直)的第一个字母。也就是说,我们可以通过vgap参数设置纵向的间隙。

自测练习

1)_________________是网格布局管理器。

a.BorderLayout b.GridLayout c.ReseauLayout

d.FlowLayout

利用以下代码回答问题2、3、4、5:

2)这个布局中有__________行?

a.7行 b.5行 c.6行 d.8行

3)这个布局中有__________列?

a.7行 b.5行 c.6行 d.8行

4)这个布局将容器分为_________个部分?

a.48个 b.35个 c.30个 d.40个

5)第5个部件位于__________位置。

a.左上角 b.左下角 c.右上角 d.右下角 e.中间

6)根据以下界面,编写一个程序

图10-12 练习题图

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

7) 如果我们构建一个5*5的网格布局,但只在该容器中加入17个按钮,将会出现什么情况?请编写一个程序,来试一试效果。

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

练习答案

1)b 没什么好解释的,请大家记住!

2)a 第一个参数是行数,因此是7行。

3)b 第二个参数是列数,因此为5列。

4)b 7行5列,其7*5,35个部分嘛。

5)c 第5个部件是第一行的最后一个,当然在右上角嘛。

6)下面是一个实现的程序实例:

源程序:lianxi10_2.java

import java.awt.*;

import javax.swing.*;

import java.applet.Applet;

public class lianxi10_2 extends JApplet

{

String buttonLabels[]={"1","2","3","4","5","6","7",

"8","9","*","0","#"};

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new GridLayout(4,3,10,10));

for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));

}

}

7)下面是一个实现的程序实例:

源程序:lianxi10_3.java

import java.awt.*;

import javax.swing.*;

import java.applet.Applet;

public class lianxi10_3 extends JApplet

{

String buttonLabels[]={"No.1","No.2","No.3","No.4","No.5",

"No.6","No.7","No.8","No.9","No.10","No.11","No.12",

"No.13","No.14","No.15","No.16","No.17"};

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new GridLayout(5,5));

for (int x=0; xpanel1.add(new JButton(buttonLabels[x]));

}

}

这个程序使用javac编译完后,编写一个包含这个类的HTML页面,再用appletviewer来观察发现运行结果如下图所示:

图10-13 练习答案图

这个输出是不是令你感到十分意外,整个程序根本不按要求分成5列,所以我们从这里得到一个使用网格布局中要十二分注意的一点:“请别忘了将网格填满”。否则程序的输出将不可预料。

一些提示:

如果你真的没有那么多东西来“占领”网格的话,我建议你使用一个空标签来填补这个空白的网格,使得程序的输出如你所愿。使用空标签的方法很容易:

panel1.add(new Label(“”));

从这里,我们也看出了,我们学习过的流布局管理器、边框布局管理器,以及我们刚学习过的网格布局管理器都比较死板,不够高级。

10.3 组合布局

传授新知

正如我们在上一小节结束的时候说的一样,各种布局管理器都有自己的缺点,没有一种能够真正地完全满足我们编写GUI程序时的要求。

而在Java语言中,允许在容器中加入其他容器,这样每个容器可以根据自己的需要采用不同的布局管理器,组合成为一个我们所需要的GUI程序界面。这种方法,我们就称之为组合布局。

注意:

与流布局、边框布局、网格布局不同,组合布局并不是一个新的布局管理器,它是通过结合各种布局管理器的优点,将它们组合地应用在GUI程序界面的开发中。这是一种布局管理的方法。也可以说是一种GUI程序界面的开发技巧。

当我们设计GUI程序界面时,最好先在纸上把它画出来,然后“分块解决”。也就是将能够组合在一起的部件找出来,将它们放在一个容器里,并为它们选择合适的布局管理器。然后把这些容器摆放在一起,就解决了。

设计时还要考虑到窗体大小发生改变的时候,引起的部件形体变化。这方面,请你熟记几个设计技巧:

1) 对于那些要求扁平状的部件,我们应该将它放置在边框布局中的南面或北面;

2) 对于那些要求细高状的部件,我们应该将它放置在边框布局中的东面或西面;

3) 对于那些可以随着窗体改变大小部分,我们可以将它放置在边框布局的中间;

4) 如果我们要求部件保持大小相同,那么,我们就应该采用网格布局。

下面,我们就通过几个实际的例子,来让大家领会和掌握这种设计的思路与方法。

实例说明

我们首先创建一个testCombination.java文件,然后输入以下源程序:

源程序:testCombination.java

import java.awt.*;

import javax.swing.*;

import java.applet.Applet;

public class testCombination1 extends JApplet

{

public void init()

{

Frame frame1=new Frame("testCombination1");

frame1.setLayout(new BorderLayout());

TextArea text1=new TextArea();

frame1.add(text1,BorderLayout.CENTER);

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new GridLayout(1,3,10,5));

panel1.add(new JButton("A"));

panel1.add(new JButton("B"));

panel1.add(new JButton("C"));

frame1.add(panel1,BorderLayout.SOUTH);

frame1.pack();

frame1.show();

}

}

然后,我们使用javac编译这个程序,然后编辑一个显示这个Java Applet的HTML页面。最后调用appletviewer来观察这个页面,如下图所示:

图10-14 程序testCombination.java的输出

正如上图所示,程序的输出与以前不同,各个部件不是显示在Appletviewer程序框中,而是显示在另一个窗口中。

这是怎么回事呢?下面我们就一起来看一下这个程序!

传授新知

在以前的程序中,我们一直都是使用容器JPanel,面板。而我们在这个程序中引进了一个新的容器Frame。使用了这个容器后,就会新创建一个窗口。这也就是为什么程序的输出有这么大的变化的原因。

1)Frame frame1=new Frame("testCombination");

这条语句,定义了一个Frame容器frame1,然后使用new操作符调用构造器方法,后面带的参数“testCombination”则是这个Frame的标题。

一些提示:

其实大家能Frame所体现出来的效果是很熟悉的,它等价于Windows中的窗体。而Frame的标题就是窗体的标题。

2) frame1.setLayout(new BorderLayout());

与JPanel容器一样,我们可以调用setLayout方法来设置Frame的布局管理器。在这里,我们将Frame容器frame1的布局管理器设置成为边框布局管理器(也就是我们在10.1小节中学习过的布局管理器)。

3) frame1.add(text1,BorderLayout.CENTER);

紧接着,我们调用frame1的add方法,将文本区部件text1添加到frame1容器中来。注意我们设置了它的位置:BorderLayout.CENTER。

这是因为,我们希望这个文本区能够随着窗体的大小变化而变化。所以适合将其放在在中间位置。

4) panel1.setLayout(new GridLayout(1,3,10,5));

我们又定义了一个JPanel容器panel1,并将其的布局管理器设置为网格布局管理器。并通过指定参数,使得整个panel1被分成1行3列,水平空隙为10的网格。

5) frame1.add(panel1,BorderLayout.SOUTH);

这是组合布局方法最重要的一步,我们将panel1这个容器,加入到了frame1这个容器中去了。并且指定了panel1这个容器在整个frame1中所占的位置:BorderLayout.SOUTH,也就是下边。这样,panel1中包含的三个按钮就会永远(不管窗体大小如何改变)呆在文本区的下边,而且三个按钮的大小会根据窗体大小的改变而改变。

一些提示:

这是因为,panel1中的按钮是用网格布局的。

6) frame1.pack();

frame1.show();

与JPanel不一样,使用Frame容器,不能够直接显示了出来。我们必须调用Frame容器的show方法才能使得Frame显示出来。

而在使用show方法之前,我们还需要使用pack方法将Frame中的内容做一个整合。请记住这里的使用方法。

4 GridBag布局

实例说明

到现在为止,我们已经学习了边框布局、网格布局以及组合布局,现在大家试一试编写一个程序,

怎么样,挺有难度的吧!完成这个GUI得花很多心思去设计组合,十分讨厌,下面我们就使用一个新的布局管理器GridBagLayout来解决这种难题。

首先,输入以下源程序:

源程序:testGridBag.java

import java.awt.*;

import javax.swing.*;

import java.applet.Applet;

public class testGridBag extends JApplet

{

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new GridBagLayout());

GridBagConstraints gbdc=new GridBagConstraints();

gbdc.fill=GridBagConstraints.BOTH;

gbdc.weightx=1;

gbdc.weighty=1;

panel1.add(new JButton("No.1"),gbdc);

panel1.add(new JButton("No.2"),gbdc);

panel1.add(new JButton("No.3"),gbdc);

gbdc.gridwidth=2;

gbdc.gridx=0;

panel1.add(new JButton("No.4"),gbdc);

gbdc.gridx=2;

gbdc.gridwidth=1;

gbdc.gridheight=2;

panel1.add(new JButton("No.5"),gbdc);

gbdc.gridx=0;

gbdc.gridheight=1;

panel1.add(new JButton("No.6"),gbdc);

gbdc.gridx=1;

panel1.add(new JButton("No.7"),gbdc);

gbdc.gridx=0;

gbdc.gridwidth=2;

panel1.add(new JButton("No.8"),gbdc);

gbdc.gridx=2;

gbdc.gridwidth=1;

panel1.add(new JButton("No.9"),gbdc);

}

}

在这个程序中,我们使用了GridBagLayout轻松地完成了这个界面的设计,允分凸现出它的强大。可以这么说,GridBagLayout是Java语言中最强大的布局管理器。

GridBagLayout,从名字上看,就知道它与GridLayout有一定的渊源,是的,GridBagLayout的确与其十分类似,也是使用网格来进行布局管理的。但与GridLayout(网格布局)不同的是,GridBagLayout不像网格布局一相,需要所有的部件的大小、形状相同。而且还可以将某一个部件放在一个固定的位置上。

下面,我们一起来分析一下testGridBag.java程序。

1) panel1.setLayout(new GridBagLayout());

在调用setLayout方法时,指定为GridBagLaoyout,使panel1使用GridBag布局管理。

2) GridBagConstraints gbdc=new GridBagConstraints();

GridBagLayout布局管理器是通过一个GridBagConstraints类来实现神奇的效果的。所以,我们要在使用时先定义一个GridBagConstraints类的对象。在这个程序中,我们定义了一个GridBagConstraints类的对象gbdc。

3) gbdc.fill=GridBagConstraints.BOTH;

由于网格单元可能比该单元中的部件大,如果是这样,部件放置在单元格内会有一些多余空间。在默认情况下,部件不会扩张,也就是不会填充这个多余空间。

GridBagConstraints提供了一个fill属性,我们可以通过设置它的值来起到不同的效果。

¨ GridBagConstraints.NONE:不扩张,是默认值;

¨ GridBagConstraints.HORIZONTAL:部件水平扩张,将水平方向的多余空间填满;

¨ GridBagConstraints.VERTICAL:部件垂直扩张,将垂直方向的多余空间填满;

¨ GridBagConstraints.BOTH:部件同时向两个方向扩张,将单元格填满。

4) gbdc.weightx=1;

gbdc.weighty=1;

weightx和weighty是GridBagConstraints提供的另一对属性。它的取值是整型数,默认值为0。用来设置行(weightx)、列(weighty)的“重量”,如果值为0的话,所有的部件都会紧收在一起,聚集在中央,如图10-17所示。

而如果取值为其它数字,则会根据值来分配空间。

5) panel1.add(new JButton("No.1"),gbdc);

panel1.add(new JButton("No.2"),gbdc);

panel1.add(new JButton("No.3"),gbdc);

在没有任何约束的时候,向gbdc中添加按钮,这时效果与采用网格布局的效果完全一样。一个接着一个地“占领”单元格。

6) gbdc.gridwidth=2;

gbdc.gridx=0;

panel1.add(new JButton("No.4"),gbdc);

由于第四个按钮(No.4)是宽度是2,在GridBagLayout中,是由gridwidth属性来控制添加进入的部件的宽度的。

我们通过gbdc.gridwidth=2将其设置为2,这样,再添加进入的部件就会变成为2个单元格的宽度。

另外,我们再使用gbdc.gridx=0让其另起一行,从最左边的单元格开始填充。

因此,我们发现第四个按钮被加在了第二行,宽度为2个单元格。

7) gbdc.gridx=2;

gbdc.gridwidth=1;

gbdc.gridheight=2;

panel1.add(new JButton("No.5"),gbdc);

接下来,我们要摆放第五个按钮,这个按钮将从第3个单元开始填充,其宽度为一个单元格,而高度则为两个单元格。

因此,我们首先使用用gbdc.gridx=2,使得下一个添加的部件(第五个按钮)放入第3个单元格(0代表第1个单元格,因此第3个单元格应该是2)。

由于,前面我们已经将gridwidth设置为2了,因此,我们需要使用gbdc.gridwidth=1,将其值设置回1。

最后使用gdbc.gridheight=2,使得添入的部件的单元格纵向跨越两个单元格。

8) gbdc.gridx=0;

gbdc.gridheight=1;

panel1.add(new JButton("No.6"),gbdc);

我想这一段程序,大家应该都不会再有什么理解上的问题了吧!主要提醒大家注意的是,我们使用gbdc.gridheight=1将单元格纵向跨度改成了默认值1。这是因为我们在前面需要时将其改成了2,所以在此需要将其改回来。

实例说明

为了更好地理解这个强大的GridBagLayout布局管理器,我们再来做一个有趣的实验。首先,我们创建一个testGridBag2.java

源程序:testGridBag2.java

import java.awt.*;

import javax.swing.*;

import java.applet.Applet;

public class testGridBag2 extends JApplet

{

public void init()

{

JPanel panel1=(JPanel)getContentPane();

panel1.setLayout(new GridBagLayout());

GridBagConstraints gbdc=new GridBagConstraints();

panel1.add(new JButton("No.1"),gbdc);

panel1.add(new JButton("No.2"),gbdc);

setSize(300,200);

}

}

然后我们使用鼠标改变一下窗口的大小,看一下,这两个按钮有什么变化?你会惊奇地发现,窗口改变了大小,两个按钮的大小却没有变,而且一直呆在正中央的位置。

一些说明:

在这个程序中,我们使用了一个以前没有用过的语句:setsize(300.200),它的功能是在程序中设置窗口的大小。

现在我们对这个程序做一些修改!将添加两个按钮的两条语句:

panel1.add(new JButton("No.1"),gbdc);

panel1.add(new JButton("No.2"),gbdc);

将它们扩展为:

gbdc.weightx=1;

panel1.add(new JButton("No.1"),gbdc);

gbdc.weightx=3;

panel1.add(new JButton("No.2"),gbdc);

为什么会得到这个效果呢?我们在程序中添加按钮的程序段前加入一句:

gbdc.fill=GridBagConstraints.HORIZONTAL;

再重新编译一下程序,再看看程序的输出有什么变化!

在得到结果之前,自己可以想象一下结果,然后看一下程序的实际输出与你的想法是否相吻合。

我们惊奇地发现,第二个按钮,突然变得十分宽起来(如图10-20所示)。这是因为放置第二个按钮的单元格的宽度是3,而第一个按钮的宽度是1。而且,我们又让第二个按钮横向扩展,因此得到了这样的输出结果。

相信实验做到这里,不须我说,大家也会有一些心得体会了。但是GridBagLayout远不止这一点,大家应该多做试验,才能够在真实的使用环境中有效地掌握GridBagLayout。

JAVA中如何让方块实现运动?

设计界面。设想中的界面应该分为左边的游戏区与右边的控制区。控制区有“开始”“暂停”“停止”按钮,游戏得分信息;游戏区则划分20*10个格子,每个方块就是由不同的格子组合而成。

我们需要定义布局,组件,初始化等操作。设置左右两边的控制区组件大小,定位来实现绝对定位。

主要的功能都在游戏区组件中实现。控制区三个按钮“开始”,“暂停”,“停止”只是调用游戏组件函数。

在游戏区,定义20*10个格子。通过标记不同格子的背景颜色,组成不同的方块。方块移动时候,也是变换组成格子的背景颜色。

然后定义游戏中出现的方块以及它的变幻方块。我们预计定义9中方块,每种方块最多只能变幻为另外一种方块。然后每次我们都是随机获取9中方块中的一种,获取的方块出现在顶部中间,所以获取了方块我们就可以初始化它的定位。

开始游戏后获取第一个方块并开启一个定时器,定时器中每隔一段时间将方块下移一个位置。如果方块下移到最后或者下移到已有方块之上再不能下移了,这时候再判断是否有某一行连成一排的。如果连成一排,累加游戏得分,同时需要消除该行,将上面的方块都挪到下面来。再获取下一个方块,并判断该方块能否安放,如果不能安放,那么游戏就结束。

这是游戏的控制逻辑。

定义游戏得分,游戏结束的判断逻辑。

还有一个主要的控制就是方块的左右移动,变形。左右变化控制方块的位置就行。变形则根据不同的方块可变形状变化,其实也是改变方块的位置就行了。

尤其要注意的是,键盘事件和时间事件中都会操作当前方块。键盘事件中改变方块的形状,向左或右移动。时间事件中方块要不停的下移。所以,在两个事件中都需要请求锁、释放锁,以此做到数据同步。

java中。drop。 moveLeft geiCellInfo。是代表什么意思啊

这个得看你Cell这个类中这几个方法是这么写的,从字面意思可以猜drop该是cell格子下落,moveleft是左移,getcellinfo该是获得格子的属性

java的gridlayout布局,发现填入格子的按钮都是整个填充满格子,如何让其中一个格子中的按钮变小,且居中

GridLayout是自动填充的,你可以尝试GridLayout的4个参数的构造方法,会在格子周围填充指定边距,但并不是真正意义上的设置按钮大小。

紧急!!!用java做一个小游戏有窗口的。。

/*

将以下代码保存为MainFrame.java JDK1.6编译通过

保存我没有做,也不难。方法我已经空下了,你可以自己写写试试.

把txtGuessRecord.getText()的内容写到文件里就行了

*/

import java.awt.Dimension;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Locale;

import java.util.Random;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import java.util.regex.PatternSyntaxException;

import javax.swing.Box;

import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JComboBox;

import javax.swing.JFormattedTextField;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.SwingUtilities;

import javax.swing.UIManager;

import javax.swing.text.DefaultFormatter;

public class MainFrame extends JFrame implements ActionListener {

/**

*

*/

private static final long serialVersionUID = 1L;

/**

* @param args

*/

private JLabel lblResult;

private JLabel lblInfo;

private JFormattedTextField txtInput;

private JTextArea txtGuessRecord;

private JButton btnGuess;

private JButton btnRestart;

private JButton btnClear;

private JButton btnSave;

private JComboBox cbType;

// 是否正确

private boolean isRight = false;

// 最大次数

private static final int MAX_TIME = 5;

// 当前猜测的次数

private static final int NUM = 0;

private static final int LETTER = 1;

private static int current_time = 0;

// 当前题目

private char current_puzzle = ' ';

// 用户回答

private char player_answer = ' ';

public MainFrame() {

initComponent();

setPreferredSize(new Dimension(450, 220));

pack();

setVisible(true);

setTitle("猜谜游戏");

setDefaultCloseOperation(DISPOSE_ON_CLOSE);

try {

UIManager

.setLookAndFeel(new com.sun.java.swing.plaf.windows.WindowsLookAndFeel());

SwingUtilities.updateComponentTreeUI(MainFrame.this);

} catch (Exception ex) {

}

}

// 初始化组件

private void initComponent() {

lblResult = new JLabel();

lblInfo = new JLabel("准备好了吗?", JLabel.LEFT);

txtGuessRecord = new JTextArea(5, 30);

btnGuess = new JButton("猜一下");

btnRestart = new JButton("开始");

btnClear = new JButton("清除");

btnSave = new JButton("保存");

String[] item = new String[] { "数字", "字母" };

cbType = new JComboBox(item);

cbType.setMaximumSize(new Dimension(70, 20));

String ps = "[a-zA-Z\\d]";

Pattern p = Pattern.compile(ps);

txtInput = new JFormattedTextField(new RegexFormatter(p));

txtInput.setMaximumSize(new Dimension(55, 20));

txtInput.setMinimumSize(new Dimension(55, 20));

btnRestart.addActionListener(this);

btnGuess.addActionListener(this);

btnClear.addActionListener(this);

btnGuess.setEnabled(false);

txtGuessRecord.setEditable(false);

setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));

Box mainBox = Box.createVerticalBox();

add(mainBox);

setText('?');

mainBox.add(lblResult);

Box box = Box.createHorizontalBox();

box.add(lblInfo);

mainBox.add(box);

Box b = Box.createHorizontalBox();

b.add(txtInput);

Box hBox = Box.createHorizontalBox();

hBox.add(b);

hBox.add(btnGuess);

hBox.add(Box.createHorizontalStrut(3));

hBox.add(btnRestart);

hBox.add(Box.createHorizontalStrut(3));

hBox.add(btnClear);

hBox.add(Box.createHorizontalStrut(3));

hBox.add(btnSave);

hBox.add(Box.createHorizontalStrut(3));

hBox.add(cbType);

mainBox.add(hBox);

JScrollPane scroll = new JScrollPane(txtGuessRecord);

mainBox.add(scroll);

}

@Override

public void actionPerformed(ActionEvent e) {

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

// 重玩

restart();

} else if (e.getSource() == btnGuess)

// 猜

guess();

else if (e.getSource() == btnClear)

// 清除

clear();

else if (e.getSource() == btnSave)

save();

}

// 设置显示答案

private void setText(char c) {

StringBuilder sb = new StringBuilder();

sb.append("htmlfont size = 72 color = redcenter");

sb.append(c);

sb.append("/center/font/html");

lblResult.setText(sb.toString());

}

// 创建随机字符

private char createRandomChar(int type) {

Random rand = new Random();

int low = 0;

int range = 0;

switch (type) {

case NUM:

low = (int) '0';

range = (int) '9' - low + 1;

break;

case LETTER:

low = (int) 'A';

range = (int) 'Z' - low + 1;

break;

}

int i = rand.nextInt(range) + low;

char c = (char) i;

return c;

}

// 向记录框中输出时间

private void recordTime() {

Date date = new Date();

SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",

Locale.US);

String sd = formater.format(date);

txtGuessRecord.append(sd);

}

private void guess() {

if (txtInput.getValue() == null)

return;

// 用户的答案

player_answer = Character.toUpperCase(txtInput.getValue().toString()

.charAt(0));

// 判断答案

if (player_answer  current_puzzle)

txtGuessRecord.append("小了\n");

else if (player_answer  current_puzzle)

txtGuessRecord.append("大了\n");

else {

txtGuessRecord.append("正确\n");

isRight = true;

}

// 猜了一次

++current_time;

// 显示游戏信息

showInfo();

if (isRight || current_time = MAX_TIME)

stop();

}

// 重新开始

private void restart() {

// 记录时间

recordTime();

txtGuessRecord.append("  游戏开始\n");

// 状态清零

current_time = 0;

btnGuess.setEnabled(true);

isRight = false;

current_puzzle = createRandomChar(cbType.getSelectedIndex());

setText('?');

showInfo();

}

// 停止游戏

private void stop() {

btnGuess.setEnabled(false);

setText(current_puzzle);

// 正确的情况

if (isRight) {

String info = String.format("你用了%d次猜对了\n", current_time);

txtGuessRecord.append(info);

} else

// 超过次数的情况

txtGuessRecord.append("你输了\n");

recordTime();

txtGuessRecord.append("  游戏结束\n");

}

// 显示游戏信息

private void showInfo() {

String info = String.format("已经猜了%d次, 还剩 %d次 ", current_time,

MAX_TIME - current_time);

lblInfo.setText(info);

}

// 清空记录框

private void clear() {

txtGuessRecord.setText("");

}

private void save() {

// 尚未实现

}

public static void main(String[] args) {

// TODO Auto-generated method stub

SwingUtilities.invokeLater(new Runnable() {

public void run() {

new MainFrame();

}

});

}

// 正则格式类, 文本框匹配用

class RegexFormatter extends DefaultFormatter {

/**

*

*/

private static final long serialVersionUID = 1L;

private Pattern pattern;

private Matcher matcher;

public RegexFormatter() {

super();

}

public RegexFormatter(String pattern) throws PatternSyntaxException {

this();

setPattern(Pattern.compile(pattern));

}

public RegexFormatter(Pattern pattern) {

this();

setPattern(pattern);

}

public void setPattern(Pattern pattern) {

this.pattern = pattern;

}

public Pattern getPattern() {

return pattern;

}

protected void setMatcher(Matcher matcher) {

this.matcher = matcher;

}

protected Matcher getMatcher() {

return matcher;

}

public Object stringToValue(String text) throws ParseException {

Pattern pattern = getPattern();

if (pattern != null) {

Matcher matcher = pattern.matcher(text);

if (matcher.matches()) {

setMatcher(matcher);

return super.stringToValue(text);

}

throw new ParseException("Pattern did not match", 0);

}

return text;

}

}

}

有一段JAVA小程序 在线求详细解释

public class CalculatorA {

private JFrame jf;

private JButton[] jbs;

private JTextField jtf;

private JButton clear;

private double num1,num2,jieguo;

private char c;

/**

* 构造方法实例化属性

*

*/

public CalculatorA(){

jf=new JFrame("我的计算器v1.0"); //定义窗口的title

jtf=new JTextField(20);//定义文本域 也就是计算器的输入和现实区域

clear=new JButton("clear");// 定义按钮

jbs=new JButton[16];//定义按钮数组

String str="123+456-789*0./=";//此处用来批量创建数字和元素符号。

for(int i=0; istr.length(); i++){//批量赋值。这样做使得定义按钮方便很多否则,你需要一个按钮一个按钮像上面的"clear"那样的定义

jbs[i]=new JButton(str.charAt(i)+"");

}

init();

addEventHandler();

// setFont();

// setColor();

showMe();

}

/**

* 布局图形界面

*

*/

public void init(){

// jf.setLayout(manager)

JPanel jp1=new JPanel();//定义面板,用来容纳上面的按钮文本域等组件

jp1.add(jtf);//将 文本域 让如面板中

JPanel jp2=new JPanel();//定义面板,用来容纳上面的按钮文本域等组件

jp2.setLayout(new GridLayout(4,4));//定义网格布局,类似html 的table一个4X4的格子,然后将计算的按钮放到这个面板中

for(int i=0; i16; i++){

jp2.add(jbs[i]);

}

JPanel jp3=new JPanel();//定义面板,用来容纳上面的按钮文本域等组件

jp3.add(clear);//将 清除按钮 让如面板中

jf.add(jp1,BorderLayout.NORTH);//将显示数据面板,使用边框布局,放置最顶端。

jf.add(jp2,BorderLayout.CENTER);//将显示计算按钮面板,使用边框布局,放置中间。

jf.add(jp3,BorderLayout.SOUTH);//将显示清除按钮面板,使用边框布局,放置最底端。

}

public void setFont(){

}

public void setColor(){

}

public void addEventHandler(){//创建监听事件,用来监听每一个按钮,当点击后需要触发什么事件。

ActionListener lis=new ActionListener(){

public void actionPerformed(ActionEvent e){

// TODO Auto-generated method stub

JButton jb=(JButton)e.getSource();//获取事件源

// String key=(String)e.getActionCommand();

String str =jb.getText().trim();//把字符串的首尾空格去掉!

// String str2=e.getActionCommand().trim();//返回事件源的文本内容

if("0123456789.".indexOf(str)!=-1){//如果是数字或点号

jtf.setText(jtf.getText()+str);//设置显示文本域,也就是你点击数字按钮,在显示文本域显示出你点击的值。

return;

}

if("+-*/".indexOf(str)!=-1){//当点击运算按钮触发的事件

num1=Double.parseDouble(jtf.getText());//获取文本域的值并转换类型并暂时保存起来。

jtf.setText("");

c=str.charAt(0);

jtf.setText("");

return ;

}

if(str.equals("=")){//根据点击的按钮式"="号执行结算结果

num2=Double.parseDouble(jtf.getText());

// jtf.setText("");

switch(c){

case '+': jieguo=num1+num2;break;

case '-': jieguo=num1-num2;break;

case '*': jieguo=num1*num2; break;

case '/': jieguo=num1/num2;break;

}

jtf.setText(Double.toString(jieguo)); //返回结算结果到显示文本域

return;

}

if(e.getActionCommand().equals("clear")){

jtf.setText("");//清空显示文本域

return;

}

}

};

for(int i=0; ijbs.length; i++){

//为每个按钮加上监听类

jbs[i].addActionListener(lis);

}

clear.addActionListener(lis);

}

public void showMe(){

jf.pack();//调整此窗口的大小,以适合其子组件的首选大小和布局。

jf.setVisible(true);//设置窗口可见

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置程序的退出按钮,退出即同时停止程序

}

public static void main(String[] args){//启动程序的入口

new CalculatorA();

}

}

这代码注释写的太累人了。小窗口费劲。给加点分吧。

java格子塌陷的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java棋盘格子怎么输入、java格子塌陷的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-13,除非注明,否则均为首码项目网原创文章,转载请注明出处。