问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

用JAVA编写小游戏“连连看”

发布网友 发布时间:2022-04-28 22:47

我来回答

2个回答

懂视网 时间:2022-05-12 06:30

博主玩了这么久的连连看,居然是第一次发现,连连看最多只能有2个转弯。orz…

在网上搜索连连看的连线算法判断,并没有找到很全面的,经过自己摸索之后,画了下面的图(图有点丑……)

一. 2个物体在同一直线上,可以直接连通 (这个不需要解释啦)

二.2个物体在同一直线上,中间有障碍物,不能直接连通 (2个转弯)

【循环遍历黄线中的交点,比如A,B点,再判断蓝线有没有障碍物,若没有,则可以连通,若有,则继续循环查找新的A,B点】

三. 2个对象不在同一直线上,一个转弯

【2个物体分别在所在位置进行x,y轴的延伸,如下图则交点为A,B。 只需判断2个交点到2个物体直接是否有障碍物,若没有,则可以连通】

四. 2个物体不在同一直线上,连线有2个转弯

【同二的原理,如下图,如果A,B 2个交点到物体均没有障碍物,则可以连通。其中A点的纵坐标和B相同】

另外一种情况,A,B 为2个物体所在x轴与中间y轴的交点,A,B的x坐标必须相同,连线如下:

热心网友 时间:2022-05-12 03:38

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class lianliankan implements ActionListener { JFrame mainFrame; //主面板 Container thisContainer; JPanel centerPanel,southPanel,northPanel; //子面板 JButton diamondsButton[][] = new JButton[6][5];//游戏按钮数组 JButton exitButton,resetButton,newlyButton; //退出,重列,重新开始按钮 JLabel fractionLable=new JLabel("0"); //分数标签 JButton firstButton,secondButton; //分别记录两次被选中的按钮 int grid[][] = new int[8][7];//储存游戏按钮位置 static boolean pressInformation=false; //判断是否有按钮被选中 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连连看"); thisContainer = mainFrame.getContentPane(); thisContainer.setLayout(new BorderLayout()); centerPanel=new JPanel(); southPanel=new JPanel(); northPanel=new JPanel(); thisContainer.add(centerPanel,"Center"); thisContainer.add(southPanel,"South"); thisContainer.add(northPanel,"North"); centerPanel.setLayout(new GridLayout(6,5)); for(int cols = 0;cols < 6;cols++){ for(int rows = 0;rows < 5;rows++ ){ diamondsButton[cols][rows]=new JButton(String.valueOf(grid[cols+1][rows+1])); diamondsButton[cols][rows].addActionListener(this); centerPanel.add(diamondsButton[cols][rows]); } } exitButton=new JButton("退出"); exitButton.addActionListener(this); resetButton=new JButton("重列"); resetButton.addActionListener(this); newlyButton=new JButton("再来一局"); newlyButton.addActionListener(this); southPanel.add(exitButton); southPanel.add(resetButton); southPanel.add(newlyButton); fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText()))); northPanel.add(fractionLable); mainFrame.setBounds(280,100,500,450); mainFrame.setVisible(true); } public void randomBuild() { int randoms,cols,rows; for(int twins=1;twins<=15;twins++) { randoms=(int)(Math.random()*25+1); for(int alike=1;alike<=2;alike++) { 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]=randoms; } } } public void fraction(){ fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText())+100)); } public void reload() { int save[] = new int[30]; int n=0,cols,rows; int grid[][]= new int[8][7]; for(int i=0;i<=6;i++) { for(int j=0;j<=5;j++) { if(this.grid[i][j]!=0) { save[n]=this.grid[i][j]; n++; } } } n=n-1; this.grid=grid; while(n>=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.setVisible(false); pressInformation=false; //这里一定要将按钮点击信息归为初始 init(); for(int i = 0;i < 6;i++){ for(int j = 0;j < 5;j++ ){ if(grid[i+1][j+1]==0) diamondsButton[i][j].setVisible(false); } } } public void estimateEven(int placeX,int placeY,JButton bz) { if(pressInformation==false) { x=placeX; y=placeY; secondMsg=grid[x][y]; secondButton=bz; pressInformation=true; } else { x0=x; y0=y; fristMsg=secondMsg; firstButton=secondButton; x=placeX; y=placeY; secondMsg=grid[x][y]; secondButton=bz; if(fristMsg==secondMsg && secondButton!=firstButton){ xiao(); } } } public void xiao() { //相同的情况下能不能消去。仔细分析,不一条条注释 if((x0==x &&(y0==y+1||y0==y-1)) || ((x0==x+1||x0==x-1)&&(y0==y))){ //判断是否相邻 remove(); } else{ for (j=0;j<7;j++ ) { if (grid[x0][j]==0){ //判断第一个按钮同行哪个按钮为空 if (y>j) { //如果第二个按钮的Y坐标大于空按钮的Y坐标说明第一按钮在第二按钮左边 for (i=y-1;i>=j;i-- ){ //判断第二按钮左侧直到第一按钮中间有没有按钮 if (grid[x][i]!=0) { k=0; break; } else{ k=1; } //K=1说明通过了第一次验证 } if (k==1) { linePassOne(); } } if (y<j){ //如果第二个按钮的Y坐标小于空按钮的Y坐标说明第一按钮在第二按钮右边 for (i=y+1;i<=j ;i++ ){ //判断第二按钮左侧直到第一按钮中间有没有按钮 if (grid[x][i]!=0){ k=0; break; } else { k=1; } } if (k==1){ linePassOne(); } } if (y==j ) { linePassOne(); } } if (k==2) { if (x0==x) { remove(); } if (x0<x) { for (n=x0;n<=x-1;n++ ) { if (grid[n][j]!=0) { k=0; break; } if(grid[n][j]==0 && n==x-1) { remove(); } } } if (x0>x) { for (n=x0;n>=x+1 ;n-- ) { if (grid[n][j]!=0) { k=0; break; } if(grid[n][j]==0 && n==x+1) { remove(); } } } } } for (i=0;i<8;i++ ) { //列 if (grid[i][y0]==0) { if (x>i) { for (j=x-1;j>=i ;j-- ) { if (grid[j][y]!=0) { k=0; break; } else { k=1; } } if (k==1) { rowPassOne(); } } if (x<i) { for (j=x+1;j<=i;j++ ) { if (grid[j][y]!=0) { k=0; break; } else { k=1; } } if (k==1) { rowPassOne(); } } if (x==i) { rowPassOne(); } } if (k==2){ if (y0==y) { remove(); } if (y0<y) { for (n=y0;n<=y-1 ;n++ ) { if (grid[i][n]!=0) { k=0; break; } if(grid[i][n]==0 && n==y-1) { remove(); } } } if (y0>y) { for (n=y0;n>=y+1 ;n--) { if (grid[i][n]!=0) { k=0; break; } if(grid[i][n]==0 && n==y+1) { remove(); } } } } } } } public void linePassOne(){ if (y0>j){ //第一按钮同行空按钮在左边 for (i=y0-1;i>=j ;i-- ){ //判断第一按钮同左侧空按钮之间有没按钮 if (grid[x0][i]!=0) { k=0; break; } else { k=2; } //K=2说明通过了第二次验证 } } if (y0<j){ //第一按钮同行空按钮在与第二按钮之间 for (i=y0+1;i<=j ;i++){ if (grid[x0][i]!=0) { k=0; break; } else{ k=2; } } } } public void rowPassOne(){ if (x0>i) { for (j=x0-1;j>=i ;j-- ) { if (grid[j][y0]!=0) { k=0; break; } else { k=2; } } } if (x0<i) { for (j=x0+1;j<=i ;j++ ) { if (grid[j][y0]!=0) { k=0; break; } else { k=2; } } } } public void remove(){ firstButton.setVisible(false); secondButton.setVisible(false); fraction(); pressInformation=false; k=0; grid[x0][y0]=0; grid[x][y]=0; } public void actionPerformed(ActionEvent e) { if(e.getSource()==newlyButton){ int grid[][] = new int[8][7]; this.grid = grid; randomBuild(); mainFrame.setVisible(false); pressInformation=false; init(); } if(e.getSource()==exitButton) System.exit(0); if(e.getSource()==resetButton) reload(); for(int cols = 0;cols < 6;cols++){ for(int rows = 0;rows < 5;rows++ ){ if(e.getSource()==diamondsButton[cols][rows]) estimateEven(cols+1,rows+1,diamondsButton[cols][rows]); } } } public static void main(String[] args) { lianliankan llk = new lianliankan(); llk.randomBuild(); llk.init(); } }
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
香辣油豆皮的料汁怎么调? 违章超员怎么处罚规定 客车超员怎么处罚2016 宣称窗帘可“空气净化”,宜家被罚172.5万,此前还收到过哪些罚单?_百度... 打开CAD2006出现fail to get commcntrcontroller怎么解决 启动cad2006时出现'failtogetcommcntrcontroller"怎么解决啊?是什么... 删除C:\Program Files\AutoCAD2004\WSCommCntrAcCon.arx有什么影响 CAD启动时出现fail to get CommcntrController 怎么解决? 启动cad2006时出现'fail to get commcntrcontroller"怎么解决啊?是什么... ...电脑,买哪种划算啊 ,主要 玩游戏,挂Q偶尔看电影 净水器出来的水养鱼好不好 用JAVA编写一个简单的猜数游戏程序 家用净水器过滤的水能养鱼吗 芝麻信用额度是550怎么让他变成600 550芝麻信用分可申请多高额度信用卡 芝麻信用550可以贷多少 牛筒子骨汤 幼儿思维的特点包括哪些 幼儿思维该如何正确培养 恢复mac默认图标 一次纸碗跟塑料袋可不可以放进微波炉里加热 使用微波炉的时候,里面的食物可以放在塑料袋子里吗? iphone13promax原始桌面布局 为什么dota2突然帧数降低 如何请假理由比较好,让家长无法拒绝 回家见家长怎么写请假条短句 栽培基质椰糠珍珠岩如何混搭 怎么样才能在电脑上下载电影,电视剧,或资料 如何用椰糠育苗,育好苗 要见女朋友的父母了如何请假 家用净水器过滤的水能养鱼吗? 鱼缸净水器怎么用 家用净水器能过滤池塘水养鱼吗 净水器里的水可以用来养鱼吗? 家装中央净水机中央软水机的水可以浇花养鱼么? 正常WORD中一篇幅文章段前,段后,行距,是怎行设置的,设置值是多少 养金鱼,用净水器的水可以吗? 净水机出来的水是否能浇花养鱼? 我朋友每天扣扣运动走八千步或者一万步以上就会给他五块钱红包还是商家微信转给他的,请问怎么弄 家里净水器净化过的自来水可以直接用来养金鱼吗 净水器过滤后的废水能养鱼吗? 哪家银行的理财产品收益高又保险 净水器过滤后的水可不可以养鱼,会不会水中缺氧 文章的行间距和段时距是多少磅值 用净水器的水养金鱼,可以吗? QQ运动红包骗人的吗,好不容易得了小黑鱼的5块想提现,下了软件要我实名认证拍身份证什么的 净水器过滤出来的水可以养鱼吗,还需不需要困水 word行距的设置一般为多少 家里的鱼缸中用养鱼净水器好不好 净水器出的废水能养鱼吗
  • 焦点

最新推荐

猜你喜欢

热门推荐