最开始一出的时候就准备写了,被别的事情耽误了。花了两天时间,把某个游戏的基本的功能都写出来了,还是挺简单的。简单来说就是个卡片消除游戏,代码方面挺简单,比代码难的是地图的制作(卡片的放置)。完整代码在最下面,需要的自取。(300来行代码,非常简单)(本来想直接用原名字,居然还有版权问题,好离谱呀)
目录
游戏展示
代码讲解
就选重要的讲一下吧
先创建一个card类,来存储我们卡片的x,y和卡片的种类。
public class Card {
int x;
int y;
int kind;
public Card(int x,int y){
this.x = x;
this.y = y;
}
}
new两个vector,分别存储没有被点击过的card和点击过的card。
Vector<Card> cards = new Vector<>();
Vector<Card> cardsUse = new Vector<>(); //下面存储位置
然后向cards添加卡片。
Card card;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE / 2 + OFFSET_Y);
cards.add(card);
card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE + OFFSET_Y);
cards.add(card);
}
}
这时的图片种类都是0,增加图片的种类。
for (int i = 0; i < cards.size(); i++) {
cards.get(i).kind = i / 6;
}
然后随机打乱图片(这个随机方法后面可以作为道具使用)。
public void change() {
for (int i = 0; i < cards.size(); i++) {
Random random1 = new Random();
int r = random1.nextInt(cards.size());
int t = cards.get(i).kind;
cards.get(i).kind = cards.get(r).kind;
cards.get(r).kind = t;
}
}
将上面的代码放到setCards1()方法中,作为第一关的图片放置方法。
再写个setCards2()方法,作为第二关的放置方法(按自己的想法随便写就行)。
判断图片是否能被点击,点击后判断光标位置,看在哪张图片上,并看这张图片是否在最上面,只有最上面的才能被点击。具体方法是,判断这张图片是否与其后面的图片重叠,如果重叠,则说明不在最上面。
for (int i = 0; i < view11.cards.size(); i++) {
//判断点击的哪张card
if (x > view11.cards.get(i).x && x < view11.cards.get(i).x + view11.SIZE
&& y > view11.cards.get(i).y && y < view11.cards.get(i).y + view11.SIZE) {
//判断card是否在最上面
boolean isC = true;
for (int j = i + 1; j < view11.cards.size(); j++) {
if (Math.abs(view11.cards.get(i).x - view11.cards.get(j).x) < view11.SIZE
&& Math.abs(view11.cards.get(i).y - view11.cards.get(j).y) < view11.SIZE) {
isC = false;
break;
}
}
如果图片在最上面,并且被点击过的图片总数少于7个,才能被点击。
如果点击的照片里面有三个一样的,就消除。
如果图片全点完,则进入下一关。
具体代码看完整代码
完整代码
Card类
package game03;
public class Card {
int x;
int y;
int kind;
public Card(int x,int y){
this.x = x;
this.y = y;
}
}
View类
package game03;
import javax.swing.*;
import java.awt.*;
import java.util.Random;
import java.util.Vector;
public class View extends JFrame {
Handle handle11 = new Handle(this);
Vector<Card> cards = new Vector<>();
Vector<Card> cardsUse = new Vector<>(); //下面存储位置
final int OFFSET_X = 150;
final int OFFSET_Y = 20;
final int SIZE = 100;
int level = 1; //关卡
public class MPanel11 extends JPanel {
ImageIcon[] p = new ImageIcon[9];
ImageIcon bj = new ImageIcon("src\\game03\\pic\\bj.jpg");
public MPanel11() {
addMouseListener(handle11);
p[0] = new ImageIcon("src\\game03\\pic\\p1.png");
p[1] = new ImageIcon("src\\game03\\pic\\p2.png");
p[2] = new ImageIcon("src\\game03\\pic\\p3.png");
p[3] = new ImageIcon("src\\game03\\pic\\p4.png");
p[4] = new ImageIcon("src\\game03\\pic\\p5.png");
p[5] = new ImageIcon("src\\game03\\pic\\p6.png");
p[6] = new ImageIcon("src\\game03\\pic\\p7.png");
p[7] = new ImageIcon("src\\game03\\pic\\p8.png");
p[8] = new ImageIcon("src\\game03\\pic\\p9.png");
setCards1();
}
@Override
public void paint(Graphics g) {
super.paint(g);
bj.paintIcon(this,g,0,0);
// for(int i=0;i<7;i++){
// for(int j=0;j<6;j++){
// g.drawRect(i*SIZE+OFFSET_X,j*100+OFFSET_Y,SIZE,SIZE);
// }
// }
for (Card card : cards) {
p[card.kind].paintIcon(this, g, card.x, card.y);
}
for (int i = 0; i < cardsUse.size(); i++) {
cardsUse.get(i).y = 650;
cardsUse.get(i).x = OFFSET_X + SIZE * i;
p[cardsUse.get(i).kind].paintIcon(this, g, cardsUse.get(i).x, cardsUse.get(i).y);
}
g.drawRect(OFFSET_X, 650, 700, 100);
}
}
//随机数组函数
public void change() {
for (int i = 0; i < cards.size(); i++) {
Random random1 = new Random();
int r = random1.nextInt(cards.size());
int t = cards.get(i).kind;
cards.get(i).kind = cards.get(r).kind;
cards.get(r).kind = t;
}
}
public void setCards1() {
level = 1;
Card card;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE / 2 + OFFSET_Y);
cards.add(card);
card = new Card(SIZE * i * 2 + SIZE + OFFSET_X, SIZE * j * 2 + SIZE + OFFSET_Y);
cards.add(card);
}
}
//赋图片
for (int i = 0; i < cards.size(); i++) {
cards.get(i).kind = i / 6;
}
change();
}
public void setCards2(){
level = 2;
//12
for(int i=2;i<=4;i++){
for(int j=1;j<=4;j++){
addCard(i,j);
}
}
//6
for(int i=2;i<4;i++){
for(int j=1;j<4;j++){
addCard(i+0.5,j+0.5);
}
}
//28
for(int i=0;i<7;i++){
for(int j=0;j<2;j++){
addCard(i,j);
addCard(i,j+0.5);
}
}
//7
for(int i=0;i<7;i++){
addCard(i,0);
}
//6
for(int i=0;i<6;i++){
addCard(i+0.5,0.5);
}
//12
for(int j=5;j>=3;j--){
addCard(0,j);
addCard(0,j-0.5);
addCard(6,j);
addCard(6,j-0.5);
}
//3
for(int i=2;i<5;i++){
addCard(i,5);
}
//6
addCard(1,3.5);
addCard(5,3.5);
addCard(1.5,3);
addCard(1.5,4);
addCard(4.5,3);
addCard(4.5,4);
for(int i=1;i<=5;i++){
addCard(i,2);
addCard(i,3);
}
for (int i = 0; i < cards.size(); i++) {
cards.get(i).kind = i/15;
}
change();
}
public void addCard(double x,double y){
Card card = new Card((int)(OFFSET_X+x*100),(int)(OFFSET_Y+y*100));
cards.add(card);
}
MPanel11 jp = new MPanel11();
public View() {
super("逗逗");
add(jp);
addKeyListener(handle11);
setSize(1005, 800);
setLocationRelativeTo(null); //居中
setResizable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new View();
}
}
Handle类
package game03;
import java.awt.event.*;
public class Handle extends KeyAdapter implements MouseListener {
View view11;
public Handle(View view11) {
this.view11 = view11;
}
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
if(e.getKeyCode()==KeyEvent.VK_SPACE){
view11.change();
view11.repaint();
}
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// System.out.println(x+" "+y);
for (int i = 0; i < view11.cards.size(); i++) {
//判断点击的哪张card
if (x > view11.cards.get(i).x && x < view11.cards.get(i).x + view11.SIZE
&& y > view11.cards.get(i).y && y < view11.cards.get(i).y + view11.SIZE) {
//判断card是否在最上面
boolean isC = true;
for (int j = i + 1; j < view11.cards.size(); j++) {
if (Math.abs(view11.cards.get(i).x - view11.cards.get(j).x) < view11.SIZE
&& Math.abs(view11.cards.get(i).y - view11.cards.get(j).y) < view11.SIZE) {
isC = false;
break;
}
}
//如果能点击
if (isC) {
//判断下方是否有七张
if (view11.cardsUse.size() < 7) {
//增加card
boolean h = false;
for (int k = 0; k < view11.cardsUse.size(); k++) {
if (view11.cardsUse.get(k).kind == view11.cards.get(i).kind) {
view11.cardsUse.add(k, view11.cards.get(i));
h = true;
break;
}
}
if (!h) {
view11.cardsUse.add(view11.cards.get(i));
}
view11.cards.remove(view11.cards.get(i));
//消除三个
if (view11.cardsUse.size() >= 3) {
for (int k = 0; k < view11.cardsUse.size() - 2; k++) {
if (view11.cardsUse.get(k).kind == view11.cardsUse.get(k + 1).kind
&& view11.cardsUse.get(k + 1).kind == view11.cardsUse.get(k + 2).kind) {
view11.cardsUse.remove(view11.cardsUse.get(k));
view11.cardsUse.remove(view11.cardsUse.get(k));
view11.cardsUse.remove(view11.cardsUse.get(k));
}
}
}
} else {
System.out.println("GAME OVER!!!");
}
}
}
}
if(view11.cards.size()==0){
if(view11.level==2){
System.out.println("WIN!!!");
}else {
view11.setCards2();
}
}
view11.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}