项目简介
选择难度为B等级的小游戏(连连看),主要使用java面向对象编程的技术,实现了动作事件监听与处理,使用了JavaSwing界面编程。
项目关键技术
java变量、java数据类型、判断语句、循环结构、数组、简单窗口创建、图形图片绘制、鼠标事件。awt抽象窗口工具包、大部分注释、GUI界面、面向对象程序设计、线程等
开发环境:jdk11
开发工具:eclipse
项目需求分析
1.玩法简单,大部分人容易上手。
2.能够用鼠标进行流利地操作。
项目亮点:结合GUI界面,充分发挥鼠标事件实现流利操作,使用Random()方法与switch语句实现随机生成不同位置的图片
功能截图演示部分:
任务分配
人员姓名 | 任务分配 |
组长:胡博扬 | 负责编写每个按钮编写事件反应,添加链表,使用线程 负责团队博客创建及书写整理 、任务分配和团队答辩筹备,对于组员进行相关内容的教导 |
组员:姚俊义 | 使用GUI设计与制作游戏界面 |
组员:季铭冉 | 编写判断连接的图案是否符合消除标准代码 |
代码部分
GUI界面主要代码
计时器部分代码
使用链表的方法实现不同难度的体现
事件处理代码
用于判断连接的图案是否符合消除标准
// 判断在一列之内两图片之间是否全部是空白或直接相邻
private boolean containsAllOrNoneZeroInColumn(int posX1, int posY1,
int posX2, int posY2) {
// 直接相连,因而不包含空白
if (Math.abs(posY1 - posY2) == 0) {
return true;
}
int a = posY1 < posY2 ? posY1 : posY2;
int b = posY1 < posY2 ? posY2 : posY1;//y值:a小 b大
for (int j = a + 1; j < b; j++) {
if (map[posX1][j] != 0) {
return false;
}
}
return true;
}
// 判断在一行之内两图片之间是否全部是空白或直接相邻
private boolean containsAllOrNoneZeroInRow(int posX1, int posY1,
int posX2, int posY2) {
// 直接相连,因而不包含空白
if (Math.abs(posX1 - posX2) == 0) {
return true;
}
int a = posX1 < posX2 ? posX1 : posX2;
int b = posX1 < posX2 ? posX2 : posX1;
for (int i = a + 1; i < b; i++) {
if (map[i][posY1] != 0) {
return false;
}
}
return true;
}
// 是否可以一直线相连
private boolean isLinkByOneLine(int posX1, int posY1, int posX2,
int posY2) {
if (posX1 != posX2 && posY1 != posY2) {
return false;
}
if (posX1 == posX2) {
if (containsAllOrNoneZeroInColumn(posX1, posY1, posX2, posY2)) {
return true;
}
}
if (posY1 == posY2) {
if (containsAllOrNoneZeroInRow(posX1, posY1, posX2, posY2)) {
return true;
}
}
return false;
}
// 是否可以两直线相连
private boolean isLinkByTwoLines(int posX1, int posY1, int posX2,
int posY2) {
if (posX1 != posX2 && posY1 != posY2) {
// x1,y1 to x2,y1 to x2,y2
if (containsAllOrNoneZeroInRow(posX1, posY1, posX2, posY1)
&& map[posX2][posY1] == 0
&& containsAllOrNoneZeroInColumn(posX2, posY1, posX2,
posY2)) {
return true;
}
// x1,y1 to x1,y2 to x2,y2
if (containsAllOrNoneZeroInColumn(posX1, posY1, posX1, posY2)
&& map[posX1][posY2] == 0
&& containsAllOrNoneZeroInRow(posX1, posY2, posX2,
posY2)) {
return true;
}
}
return false;
}
// 是否可以三直线相连
private boolean isLinkByThreeLines(int posX1, int posY1, int posX2,
int posY2) {
if (isOnSameEdge(posX1, posY1, posX2, posY2)) {
return true;
}
if (isOnThreeLinesLikeArc(posX1, posY1, posX2, posY2)) {
return true;
}
if (isOnThreeLinesLikeZigzag(posX1, posY1, posX2, posY2)) {
return true;
}
return false;
}
// 是否可以三直线相连,似U形
private boolean isOnThreeLinesLikeArc(int posX1, int posY1, int posX2,
int posY2) {
if (isOnUpArc(posX1, posY1, posX2, posY2)) {
return true;
}
if (isOnDownArc(posX1, posY1, posX2, posY2)) {
return true;
}
if (isOnLeftArc(posX1, posY1, posX2, posY2)) {
return true;
}
if (isOnRightArc(posX1, posY1, posX2, posY2)) {
return true;
}
return false;
}
// ∪
private boolean isOnUpArc(int posX1, int posY1, int posX2, int posY2) {
// Y --> 0
int lessY = posY1 < posY2 ? posY1 : posY2; //找小y
for (int j = lessY - 1; j >= 0; j--) {
if (containsAllOrNoneZeroInRow(posX1, j, posX2, j)
&& containsAllOrNoneZeroInColumn(posX1, posY1, posX1, j)
&& containsAllOrNoneZeroInColumn(posX2, posY2, posX2, j)
&& map[posX1][j] == 0 && map[posX2][j] == 0) {
return true;
}
}
if (isOnSameEdge(posX1, 0, posX2, 0)
&& containsAllOrNoneZeroInColumn(posX1, posY1, posX1, 0)
&& containsAllOrNoneZeroInColumn(posX2, posY2, posX2, 0)
&& (map[posX1][0] == 0 && map[posX2][0] == 0
|| map[posX1][0] == 0
&& map[posX2][0] == map[posX2][posY2] || map[posX1][0] == map[posX1][posY1]
&& map[posX2][0] == 0)) {
return true;
}
return false;
}
// ∩
private boolean isOnDownArc(int posX1, int posY1, int posX2, int posY2) {
int moreY = posY1 < posY2 ? posY2 : posY1;
for (int j = moreY + 1; j <= 8 - 1; j++) {
if (containsAllOrNoneZeroInRow(posX1, j, posX2, j)
&& containsAllOrNoneZeroInColumn(posX1, posY1, posX1, j)
&& containsAllOrNoneZeroInColumn(posX2, posY2, posX2, j)
&& map[posX1][j] == 0 && map[posX2][j] == 0) {
return true;
}
}
if (isOnSameEdge(posX1, 8 - 1, posX2, 8 - 1)
&& containsAllOrNoneZeroInColumn(posX1, posY1, posX1, 8 - 1)
&& containsAllOrNoneZeroInColumn(posX2, posY2, posX2, 8 - 1)
&& (map[posX1][8 - 1] == 0 && map[posX2][8 - 1] == 0
|| map[posX1][8 - 1] == map[posX1][posY1]
&& map[posX2][8 - 1] == 0 || map[posX1][8 - 1] == 0
&& map[posX2][8 - 1] == map[posX2][posY2])) {
return true;
}
return false;
}
// ﹚
private boolean isOnLeftArc(int posX1, int posY1, int posX2, int posY2) {
int lessX = posX1 < posX2 ? posX1 : posX2;
for (int i = lessX - 1; i >= 0; i--) {
if (containsAllOrNoneZeroInColumn(i, posY1, i, posY2)
&& containsAllOrNoneZeroInRow(i, posY1, posX1, posY1)
&& containsAllOrNoneZeroInRow(i, posY2, posX2, posY2)
&& map[i][posY1] == 0 && map[i][posY2] == 0) {
return true;
}
}
if (isOnSameEdge(0, posY1, 0, posY2)
&& containsAllOrNoneZeroInRow(0, posY1, posX1, posY1)
&& containsAllOrNoneZeroInRow(0, posY2, posX2, posY2)
&& (map[0][posY1] == 0 && map[0][posY2] == 0
|| map[0][posY1] == map[posX1][posY1]
&& map[0][posY2] == 0 || map[0][posY1] == 0
&& map[0][posY2] == map[posX2][posY2])) {
return true;
}
return false;
}
// (
private boolean isOnRightArc(int posX1, int posY1, int posX2, int posY2) {
int moreX = posX1 < posX2 ? posX2 : posX1;
for (int i = moreX + 1; i <= 8 - 1; i++) {
if (containsAllOrNoneZeroInColumn(i, posY1, i, posY2)
&& containsAllOrNoneZeroInRow(i, posY1, posX1, posY1)
&& containsAllOrNoneZeroInRow(i, posY2, posX2, posY2)
&& map[i][posY1] == 0 && map[i][posY2] == 0) {
return true;
}
}
if (isOnSameEdge(8 - 1, posY1, 8 - 1, posY2)
&& containsAllOrNoneZeroInRow(posX1, posY1, 8 - 1, posY1)
&& containsAllOrNoneZeroInRow(posX2, posY2, 8 - 1, posY2)
&& (map[8 - 1][posY1] == 0 && map[8 - 1][posY2] == 0
|| map[8 - 1][posY1] == map[posX1][posY1]
&& map[8 - 1][posY2] == 0 || map[8 - 1][posY1] == 0
&& map[8 - 1][posY2] == map[posX2][posY2])) {
return true;
}
return false;
}
// 是否可以三直线相连,似之字形N
private boolean isOnThreeLinesLikeZigzag(int posX1, int posY1,
int posX2, int posY2) {
if (isOnZigzagWith1Row2Cols(posX1, posY1, posX2, posY2)) {
return true;
}
if (isOnZigzagWith2Rows1Col(posX1, posY1, posX2, posY2)) {
return true;
}
return false;
}
// 是否可以三直线相连,似之字形, 两行一列 Z
private boolean isOnZigzagWith2Rows1Col(int posX1, int posY1,
int posX2, int posY2) {
int moreX = posX1 < posX2 ? posX2 : posX1;
int lessX = posX1 < posX2 ? posX1 : posX2;
for (int i = lessX + 1; i < moreX; i++) {
if (containsAllOrNoneZeroInColumn(i, posY1, i, posY2)
&& containsAllOrNoneZeroInRow(i, posY1, posX1, posY1)
&& containsAllOrNoneZeroInRow(i, posY2, posX2, posY2)
&& map[i][posY1] == 0 && map[i][posY2] == 0) {
return true;
}
}
return false;
}
// 是否可以三直线相连,似之字形, 一行两列
private boolean isOnZigzagWith1Row2Cols(int posX1, int posY1,
int posX2, int posY2) {
int moreY = posY1 < posY2 ? posY2 : posY1;
int lessY = posY1 < posY2 ? posY1 : posY2;
for (int j = lessY + 1; j < moreY; j++) {
if (containsAllOrNoneZeroInRow(posX1, j, posX2, j)
&& containsAllOrNoneZeroInColumn(posX1, posY1, posX1, j)
&& containsAllOrNoneZeroInColumn(posX2, posY2, posX2, j)
&& map[posX1][j] == 0 && map[posX2][j] == 0) {
return true;
}
}
return false;
}
// 是否处于游戏区域的4条边的同一边上
private boolean isOnSameEdge(int posX1, int posY1, int posX2, int posY2) {
if ((posY1 == posY2 && posY2 == 0)
|| (posY1 == posY2 && posY2 == 8 - 1)
|| (posX1 == posX2 && posX2 == 0)
|| (posX1 == posX2 && posX2 == 8 - 1)) {
return true;
}
return false;
}
// --------------------------------------------------------------------------
public boolean ifcanTouch(int posX1, int posY1, int posX2, int posY2) {
if (isLinkByOneLine(posX1, posY1, posX2, posY2)) {
return true;
}
// 是否可以两直线相连
if (isLinkByTwoLines(posX1, posY1, posX2, posY2)) {
return true;
}
// 是否可以三直线相连
if (isLinkByThreeLines(posX1, posY1, posX2, posY2)) {
return true;
}
return false;
}
public void clearBlock() {
if (clicktimes >=2) {
if (map[coordinatey1][coordinatex1] == map[coordinatey][coordinatex]
&& !((coordinatex1 == coordinatex) && (coordinatey1 == coordinatey))) {
if (ifcanTouch(coordinatey1, coordinatex1, coordinatey,
coordinatex)) {
if (map[coordinatey1][coordinatex1] > 0)
score = score + 10;
map[coordinatey1][coordinatex1] = 0;
map[coordinatey][coordinatex] = 0;
guoguan();
}
}
}
}
}