package com.game;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.List;
public class linkGame {
public void init(){
JFrame gameFrame = new JFrame("小动物连连看");
//设置游戏框体大小
gameFrame.setSize(1024, 768);
gameFrame.add(new GamePanel1());
gameFrame.setVisible(true);
}
public static void main(String[] args) throws IOException {
new linkGame().init();
}
}
class GameJButton extends JButton{
public GameJButton(){
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Graphics g = getGraphics();
int x = e.getX();
int y = e.getY();
if(isStart(x,y)){
}
}
boolean isStart(int x,int y){
return x >= 387 && x <= 640 && y >= 362 && y <= 430;
}
});
}
@Override
public void paint(Graphics g) {
ImageIcon icon = null;
try {
icon = new ImageIcon(ImageIO.read(new File("startPage.jpeg")));
} catch (IOException e) {
throw new RuntimeException(e);
}
JButton button = new JButton();
button.setIcon(icon);
}
}
class GamePanel1 extends JPanel{
public GamePanel1(){
}
//绘制开始界面
@Override
public void paint(Graphics g) {
try {
Image image = ImageIO.read(new File("startPage.jpeg"));
g.drawImage(image, 0, 0, 1024, 768, null);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
class GamePanel extends JPanel {
//初始化一个有图案的界面
//allImages里面存放八张小动物图片
Image[] allImages = new Image[8];
//10*10的界面,用map记录每个位置上放置的图片的编号
int N = 4;
int count = 0;
int[][] map = new int[N][N];
Random r = new Random();
public GamePanel() throws IOException {
for (int i = 0; i < 8; i++) {
//将图片保存到一个容器中,方便使用
Image image1 = ImageIO.read(new File("a" + i + ".png"));
allImages[i] = image1;
}
//在初始化界面选定方块样式时,先随机给出一半,然后在复制这一半,这样就能保证生成的方块是成对出现的了
List<Integer> list = new ArrayList<>();
for (int i = 0; i < N*N/2; i++) {
int num = r.nextInt(8);
list.add(num);
list.add(num);
}
Collections.shuffle(list);//shuffle可以用来打乱list数据
Integer[] array = list.toArray(new Integer[0]);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map[i][j] = array[i * N + j];
}
}
//捕获点击
addMouseListener(new MouseAdapter() {
boolean isClick = false;
int clickId = -1;
int clickX = 0;
int clickY = 0;
int pointNum = -1;
Point temp1;
Point temp2;
@Override
public void mouseClicked(MouseEvent e) {
Graphics g = getGraphics();
g.setColor(Color.RED);
int x = e.getX() - 60;
int y = e.getY() - 60;
int i = x / 64;
int j = y / 64;
if (x < 0 || y < 0 || i > N-1 || j > N-1 || map[i][j] == -1)
return;
//如果是第二次点击
if (isClick) {
if (i == clickX && j == clickY) {
return;
}
if (map[i][j] == clickId && (directLink(clickX, clickY, i, j) || oneCornerLink(clickX, clickY, i, j) || twoCornerLink(clickX, clickY, i, j))) {
//开始消除
count += 2;
g.setColor(Color.RED);
g.drawRect(i * 64 + 60, j * 64 + 60, 64, 64);
drawLink(clickX, clickY, i, j);
g.setColor(Color.WHITE);
//去红框
g.drawRect(clickX * 64 + 60, clickY * 64 + 60, 64, 64);
g.drawRect(i * 64 + 60, j * 64 + 60, 64, 64);
//去方块图片
g.clearRect(clickX * 64 + 60, clickY * 64 + 60, 64, 64);
g.clearRect(i * 64 + 60, j * 64 + 60, 64, 64);
map[i][j] = -1;
map[clickX][clickY] = -1;
isClick = false;
isWin();
} else {//两次点击不满足消除,则将第二次点击作为第一次点击
clickId = map[i][j];
g.setColor(Color.WHITE);
g.drawRect(clickX * 64 + 60, clickY * 64 + 60, 64, 64);
g.setColor(Color.RED);
g.drawRect(i * 64 + 60, j * 64 + 60, 64, 64);
clickX = i;
clickY = j;
}
} else {//第一次点击
clickId = map[i][j];
isClick = true;
clickX = i;
clickY = j;
g.drawRect(i * 64 + 60, j * 64 + 60, 64, 64);
}
}
//判断本局游戏是否结束
private void isWin() {
if(count==N*N){
String msg = "恭喜您通关成功,是否开始下一关?";
int type = JOptionPane.YES_NO_OPTION;
String title = "过关";
int choice = 0;
choice = JOptionPane.showConfirmDialog(null, msg,title,type);
if(choice==1){
System.exit(0);
}else if(choice == 0){
// startNewGame();
}
}
}
//判断是否可以直连
private boolean directLink(int clickX1, int clickY1, int clickX2, int clickY2) {
//判断两个方块是否在同一行
if (clickX1 == clickX2) {
int start = Math.min(clickY1, clickY2);
int end = Math.max(clickY1, clickY2);
for (int i = start + 1; i < end; i++) {
if (map[clickX1][i] != -1) {//如果两个方块中间还有未消除的方块,说明不能水平相连
return false;
}
}
pointNum = 0;
return true;
}
//判断两个方块是否在同一列
if (clickY1 == clickY2) {
int start = Math.min(clickX1, clickX2);
int end = Math.max(clickX1, clickX2);
for (int i = start + 1; i < end; i++) {
if (map[i][clickY1] != -1) {//如果两个方块中间还有未消除的方块,说明不能垂直相连
return false;
}
}
pointNum = 0;
return true;
}
return false;
}
//判断是否单拐点可连接
private boolean oneCornerLink(int clickX1, int clickY1, int clickX2, int clickY2) {
if (clickY1 > clickY2) {//保证(x1,y1)是矩形的左上角或者左下角
int temp1 = clickX1;
int temp2 = clickY1;
没有合适的资源?快使用搜索试试~ 我知道了~
java连连看小游戏源码
共76个文件
class:28个
png:20个
java:10个
需积分: 0 57 下载量 170 浏览量
2023-03-30
00:09:32
上传
评论 4
收藏 21.87MB ZIP 举报
温馨提示
完成一个小动物连连看的小游戏,主要的设计框架主要包括: 1、首先完成界面的初始化工作; 2、获取点击事件,判断两次点击是否满足消除条件; (1)完成最基本的消除功能 获取点击坐标,计算出被点击的方块位置 被点击方块四周显示红框,表示被选中 第二次点击与第一次点击不满足消除,则将第二次点击作为第一次点击 如果两次点击图片编号一致则开始消除; (2)直连消除 直连消除:在同一水平线且两相同方块间无障碍物; (3)增加单拐点可消除 (4)增加双拐点可消除 双拐点可消除分以下四种情况: 点A左侧存在点C可与点B单拐点连接 点A右侧存在点C可与点B单拐点连接 点A上侧存在点C可与点B单拐点连接 点A下侧存在点C可与点B单拐点连接 3、方块消除完毕弹窗游戏结束,开启下一局; 使用java实现的连连看小游戏,zip中包含源码以及素材图片,详细介绍可以参考我的博客https://blog.csdn.net/weixin_52641852/article/details/129822781?spm=1001.2014.3001.5501,博客中也有源码,源码中有详细的注释,需要图片素材可以下载zip。
资源推荐
资源详情
资源评论
收起资源包目录
linkGame.zip (76个子文件)
linkGame
.DS_Store 6KB
src
.DS_Store 6KB
linkup
.DS_Store 6KB
tools
Core.java 6KB
Param.java 2KB
pictures
.DS_Store 6KB
a7.png 5.35MB
background2.jpg 759KB
background1.png 1.74MB
background3.jpg 767KB
a3.png 372KB
a6.png 291KB
a0.png 258KB
a5.png 1007KB
a2.png 159KB
a1.png 60KB
a4.png 115KB
a8.png 246KB
MapPanel.java 9KB
LinkupMenuBar.java 4KB
dialog
ParamJDialog.java 6KB
TimerJProgressbar.java 2KB
mainFrame.java 9KB
LinkupJLabel.java 348B
Chess.java 286B
com
.DS_Store 6KB
game
.DS_Store 6KB
linkGame.java 17KB
out
production
linkGame
linkup
tools
Core.class 4KB
Param.class 2KB
pictures
a7.png 5.35MB
background2.jpg 759KB
background1.png 1.74MB
background3.jpg 767KB
a3.png 372KB
a6.png 291KB
a0.png 258KB
a5.png 1007KB
a2.png 159KB
a1.png 60KB
a4.png 115KB
a8.png 246KB
mainFrame$2.class 2KB
LinkupMenuBar$5.class 665B
dialog
ParamJDialog$2.class 730B
ParamJDialog.class 3KB
ParamJDialog$1.class 2KB
mainFrame$3.class 2KB
LinkupJLabel.class 475B
LinkupMenuBar$6.class 665B
LinkupMenuBar$1.class 2KB
MapPanel.class 6KB
LinkupMenuBar$3.class 665B
mainFrame$4.class 789B
TimerJProgressbar.class 2KB
mainFrame$5.class 1KB
LinkupMenuBar.class 3KB
Chess.class 482B
LinkupMenuBar$4.class 789B
mainFrame$1.class 2KB
LinkupMenuBar$2.class 665B
mainFrame.class 4KB
com
game
linkGame.class 855B
GamePanel.class 2KB
GameJButton$1.class 1KB
GamePanel$1.class 6KB
GamePanel1.class 939B
GameJButton.class 1KB
linkGame.iml 423B
.idea
uiDesigner.xml 9KB
vcs.xml 183B
workspace.xml 6KB
misc.xml 273B
modules.xml 256B
.gitignore 176B
aws.xml 294B
共 76 条
- 1
资源评论
汤了个圆了个汤
- 粉丝: 594
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab开发的根据rvm回归模型自己编的matlab程序.rar
- 高效C++学生成绩管理系统:教育技术+C++17编程+数据管理+教务自动化
- 基于matlab开发的Tipping的相关向量机RVM的回归MATLAB程序,有英文注释,可以运行.rar
- 一个点击正反转程序实例,可实现案件电机正反转
- 搜索链接淘特搜索引擎共享版-tot-search-engine.rar
- 第十八届全国大学生智能汽车竞赛 摄像头组/镜头组
- 基于matlab开发的AUV惯性导航系统matlab仿真程序,包括轨迹生成、gps和sins组合、gps和dvl组合.rar
- 基于SSM的“个性化电子相册”的设计与实现.zip
- 如何在撰写科研文献时,使用ai工具辅助去完成科研工作
- 吉林大学计组笔记 自用 基于b站翼云图灵的课.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功