简易数字连连看Java程序设计书1.1Java程序课程设计任务书1.1《简易连连看游戏》本程序基本实现了小游戏连连看的功能,玩家找出游戏中2个相同图案的方块,如果它们之间的连接线不多于3根直线,则将其连接起来,就可以成功将图案相同的方块消除,否则不会消失,当游戏中已没有满足条件的图案时,点击重列,可重新排序,游戏结束会跳出所得分数,该游戏的特点是与自己竞争,超过自己之前所创纪录。
1.1.1具体要求(包括技术要求等):<1>. 该游戏界面为方格类型,由纵6横7的直线平行垂直交叉组成,分别是6行5列方块拼接,共有30格小方块。
方块上随机分布一些数字,数字的要至少两两相同,位置随机打乱。
<2>. 当将相同数字的方块连接,但要满足只能至少单边无阻碍呈直线趋势连接,否则无效,若连接一对成功就消失于界面,继续游戏,直到游戏结束,并能返回所得分数。
<3>. 重列按钮(帮助)的功能:游戏过程中,遇到困难难以寻找下一符合要求的一对数字,可按左下按钮重置重新排列方可继续游戏。
<4>. 退出按钮:击左下方的“退出游戏”按钮,即可结束游戏。
1.2本系统涉及的知识点:循环,javaGUI组件,函数,数组,分支等2.功能设计2.1算法设计本系统需要实现的功能要求:图一,数字按钮功能模块图二,三个功能按钮模块图三,数据记录模块图四,鼠标操作模块2.2部分模块流程图:3代码设计package mybase.programe;/** lianliankan总体算法思路:由两个确定的按钮。
若这两个按钮的数字相等,就开始找它们相连的路经。
这个找路经* 分3种情况:(从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经。
这样就会有* 三条路经。
若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了)* 1.相邻** 2. 若不相邻的先在第一个按钮的同行找一个空按钮。
1).找到后看第二个按钮横向到这个空按钮* 所在的列是否有按钮。
2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。
3).没有的话,再从* 与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。
没有的话路经就通了,可以消了.** 3.若2失败后,再在第一个按钮的同列找一个空按钮。
1).找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮。
* 2).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。
3).没有的话,再从与第一个按钮同列的* 那个空按钮横向到与第二个按钮同列看是否有按钮。
没有的话路经就通了,可以消了。
** 若以上三步都失败,说明这两个按钮不可以消去。
*/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"); // 实例化分数标签,并初始化为“0”JButton firstButton, secondButton; // 分别记录两次被选中的按钮// 储存游戏按钮位置(这里其实只要6行,5列。
但是我们用了8行,7列。
是等于在这个面板按钮的周围还围//了一层是0的按钮,这样就可以实现靠近面板边缘的两个按钮可以消去)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放入mainFrame的容窗口中thisContainer.setLayout(new BorderLayout());//为thisContainer创建Borderlayout布局管理器centerPanel = new JPanel();//实例化southPanel = new JPanel();//实例化northPanel = new JPanel();//实例化thisContainer.add(centerPanel, "Center");//以下三行是为thisContainer容器添加不同方位的新的面板组件thisContainer.add(southPanel, "South");thisContainer.add(northPanel, "North");centerPanel.setLayout(new GridLayout(6, 5));//为centerPanel面板设置网格式布局管理器(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())));//嵌套,把整形对象Integer转换成基本数据类型int(整数)再转化为字符串型。
northPanel.add(fractionLable);mainFrame.setBounds(280, 100, 500, 450);//设置主界面的大小mainFrame.setVisible(true);//设置可见mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//设置当点击后界面仍旧停留且不会退出进程public void randomBuild() {//随机数int randoms, cols, rows;for (int twins = 1; twins <= 15; twins++) {//一共15对button,30个 button上的数字randoms = (int) (Math.random() * 25 + 1);//强制转换随机函数产生的数值,并进行必要运算避免“0”for (int alike = 1; alike <= 2; alike++) {cols = (int) (Math.random() * 6 + 1);//随机选取连连看中的单元网格rows = (int) (Math.random() * 5 + 1);while (grid[cols][rows] != 0) {//等于0说明这个空格有了buttoncols = (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];//记下每个button的数字n++;//有几个没有消去的button}}}n = n - 1;this.grid = grid;while (n >= 0) {//把没有消去的button重新放一次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() { // 相同的情况下能不能消去。