如何用java写一个小游戏?
/*
*连连看整体算法思路:由两个按钮决定。如果这两个按钮的数量相等,开始寻找它们连接的路径。找到穿过这里的路。
*有三种情况:(从下面三种情况可以知道需要三次测试,这三次测试分别检测一条直路。所以会有
*三条路。如果三条路都是空按钮,那么连接两个按钮的只是三种直线(两个转折点)
* 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++) {// a * * 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();
}
}