Java Sokoban
. Java Sokoban نسخة من لعبة نقوم بإنشاء Java 2D في هذا الجزء من البرنامج التعليمي لألعاب
سوكوبان
. Hiroyuki Imabayashi هي لعبة كمبيوتر كلاسيكية أخرى. تم إنشاؤه في عام 1980 بواسطة
. سوكوبان تعني حارس مستودع باللغة اليابانية. يدفع اللاعب الصناديق حول متاهة. الهدف هو وضع جميع الصناديق في مواقع محد
تطوير لعبة سوكوبان في جافا
. لإعادة تشغيل المستوى R باستخدام مفاتيح المؤشر. يمكننا أيضًا الضغط على مفتاح Sokoban تحكم في الكائن
. في الزاوية العلوية اليسرى من النافذة Completed عندما يتم وضع جميع الحقائب في مناطق الوجهة ، تنتهي اللعبة. نرسم سلسلة
اللعبة مبسطة. إنه يوفر فقط الوظائف الأساسية للغاية. الشفرة أسهل من الفهم. اللعبة لها مستوى واحد ويمكنك ان تقوم بتطوير اللعبة
. الي مستويات عديدة و متقدمة
شفرة لعبة سوكوبان
تحتوي اللعبية علي سبعة كلاسات جافا سهلة وبسيطة الفهم لكل من لديه معرفة باللغة مسبقا
Board.java
package com.zetcode; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.JPanel; public class Board extends JPanel { private final int OFFSET = 30; private final int SPACE = 20; private final int LEFT_COLLISION = 1; private final int RIGHT_COLLISION = 2; private final int TOP_COLLISION = 3; private final int BOTTOM_COLLISION = 4; private ArrayList<Wall> walls; private ArrayList<Baggage> baggs; private ArrayList<Area> areas; private Player soko; private int w = 0; private int h = 0; private boolean isCompleted = false; private String level = " ######\n" + " ## #\n" + " ##$ #\n" + " #### $##\n" + " ## $ $ #\n" + "#### # ## # ######\n" + "## # ## ##### ..#\n" + "## $ $ ..#\n" + "###### ### #@## ..#\n" + " ## #########\n" + " ########\n"; public Board() { initBoard(); } private void initBoard() { addKeyListener(new TAdapter()); setFocusable(true); initWorld(); } public int getBoardWidth() { return this.w; } public int getBoardHeight() { return this.h; } private void initWorld() { walls = new ArrayList<>(); baggs = new ArrayList<>(); areas = new ArrayList<>(); int x = OFFSET; int y = OFFSET; Wall wall; Baggage b; Area a; for (int i = 0; i < level.length(); i++) { char item = level.charAt(i); switch (item) { case '\n': y += SPACE; if (this.w < x) { this.w = x; } x = OFFSET; break; case '#': wall = new Wall(x, y); walls.add(wall); x += SPACE; break; case '$': b = new Baggage(x, y); baggs.add(b); x += SPACE; break; case '.': a = new Area(x, y); areas.add(a); x += SPACE; break; case '@': soko = new Player(x, y); x += SPACE; break; case ' ': x += SPACE; break; default: break; } h = y; } } private void buildWorld(Graphics g) { g.setColor(new Color(250, 240, 170)); g.fillRect(0, 0, this.getWidth(), this.getHeight()); ArrayList<Actor> world = new ArrayList<>(); world.addAll(walls); world.addAll(areas); world.addAll(baggs); world.add(soko); for (int i = 0; i < world.size(); i++) { Actor item = world.get(i); if (item instanceof Player || item instanceof Baggage) { g.drawImage(item.getImage(), item.x() + 2, item.y() + 2, this); } else { g.drawImage(item.getImage(), item.x(), item.y(), this); } if (isCompleted) { g.setColor(new Color(0, 0, 0)); g.drawString("Completed", 25, 20); } } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); buildWorld(g); } private class TAdapter extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { if (isCompleted) { return; } int key = e.getKeyCode(); switch (key) { case KeyEvent.VK_LEFT: if (checkWallCollision(soko, LEFT_COLLISION)) { return; } if (checkBagCollision(LEFT_COLLISION)) { return; } soko.move(-SPACE, 0); break; case KeyEvent.VK_RIGHT: if (checkWallCollision(soko, RIGHT_COLLISION)) { return; } if (checkBagCollision(RIGHT_COLLISION)) { return; } soko.move(SPACE, 0); break; case KeyEvent.VK_UP: if (checkWallCollision(soko, TOP_COLLISION)) { return; } if (checkBagCollision(TOP_COLLISION)) { return; } soko.move(0, -SPACE); break; case KeyEvent.VK_DOWN: if (checkWallCollision(soko, BOTTOM_COLLISION)) { return; } if (checkBagCollision(BOTTOM_COLLISION)) { return; } soko.move(0, SPACE); break; case KeyEvent.VK_R: restartLevel(); break; default: break; } repaint(); } } private boolean checkWallCollision(Actor actor, int type) { switch (type) { case LEFT_COLLISION: for (int i = 0; i < walls.size(); i++) { Wall wall = walls.get(i); if (actor.isLeftCollision(wall)) { return true; } } return false; case RIGHT_COLLISION: for (int i = 0; i < walls.size(); i++) { Wall wall = walls.get(i); if (actor.isRightCollision(wall)) { return true; } } return false; case TOP_COLLISION: for (int i = 0; i < walls.size(); i++) { Wall wall = walls.get(i); if (actor.isTopCollision(wall)) { return true; } } return false; case BOTTOM_COLLISION: for (int i = 0; i < walls.size(); i++) { Wall wall = walls.get(i); if (actor.isBottomCollision(wall)) { return true; } } return false; default: break; } return false; } private boolean checkBagCollision(int type) { switch (type) { case LEFT_COLLISION: for (int i = 0; i < baggs.size(); i++) { Baggage bag = baggs.get(i); if (soko.isLeftCollision(bag)) { for (int j = 0; j < baggs.size(); j++) { Baggage item = baggs.get(j); if (!bag.equals(item)) { if (bag.isLeftCollision(item)) { return true; } } if (checkWallCollision(bag, LEFT_COLLISION)) { return true; } } bag.move(-SPACE, 0); isCompleted(); } } return false; case RIGHT_COLLISION: for (int i = 0; i < baggs.size(); i++) { Baggage bag = baggs.get(i); if (soko.isRightCollision(bag)) { for (int j = 0; j < baggs.size(); j++) { Baggage item = baggs.get(j); if (!bag.equals(item)) { if (bag.isRightCollision(item)) { return true; } } if (checkWallCollision(bag, RIGHT_COLLISION)) { return true; } } bag.move(SPACE, 0); isCompleted(); } } return false; case TOP_COLLISION: for (int i = 0; i < baggs.size(); i++) { Baggage bag = baggs.get(i); if (soko.isTopCollision(bag)) { for (int j = 0; j < baggs.size(); j++) { Baggage item = baggs.get(j); if (!bag.equals(item)) { if (bag.isTopCollision(item)) { return true; } } if (checkWallCollision(bag, TOP_COLLISION)) { return true; } } bag.move(0, -SPACE); isCompleted(); } } return false; case BOTTOM_COLLISION: for (int i = 0; i < baggs.size(); i++) { Baggage bag = baggs.get(i); if (soko.isBottomCollision(bag)) { for (int j = 0; j < baggs.size(); j++) { Baggage item = baggs.get(j); if (!bag.equals(item)) { if (bag.isBottomCollision(item)) { return true; } } if (checkWallCollision(bag,BOTTOM_COLLISION)) { return true; } } bag.move(0, SPACE); isCompleted(); } } break; default: break; } return false; } public void isCompleted() { int nOfBags = baggs.size(); int finishedBags = 0; for (int i = 0; i < nOfBags; i++) { Baggage bag = baggs.get(i); for (int j = 0; j < nOfBags; j++) { Area area = areas.get(j); if (bag.x() == area.x() && bag.y() == area.y()) { finishedBags += 1; } } } if (finishedBags == nOfBags) { isCompleted = true; repaint(); } } public void restartLevel() { areas.clear(); baggs.clear(); walls.clear(); initWorld(); if (isCompleted) { isCompleted = false; } } }
Actor class-1
. الآخرين في اللعبة. إنها تلخص الوظائف الأساسية لكائن ما في لعبة سوكوبان Actors هو كلاس أساسية Actor هذه هي كلاس
Actor.java
package com.zetcode; import java.awt.Image; public class Actor { private final int SPACE = 20; private int x; private int y; private Image image; public Actor(int x, int y) { this.x = x; this.y = y; } public Image getImage() { return image; } public void setImage(Image img) { image = img; } public int x() { return x; } public int y() { return y; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public boolean isLeftCollision(Actor actor) { return x() - SPACE == actor.x() && y() == actor.y(); } public boolean isRightCollision(Actor actor) { return x() + SPACE == actor.x() && y() == actor.y(); } public boolean isTopCollision(Actor actor) { return y() - SPACE == actor.y() && x() == actor.x(); } public boolean isBottomCollision(Actor actor) { return y() + SPACE == actor.y() && x() == actor.x(); } }
.
Wall
class-2 . resources عند البناء ، يقوم بتحميل صورة حائط من .
Actor يرث من كلاس Wall
في هدا الكلاسWall.java
package com.zetcode; import java.awt.Image; import javax.swing.ImageIcon; public class Wall extends Actor { private Image image; public Wall(int x, int y) { super(x, y); initWall(); } private void initWall() { ImageIcon iicon = new ImageIcon("src/resources/wall.png"); image = iicon.getImage(); setImage(image); } }
Player
class-3Player.java
package com.zetcode; import java.awt.Image; import javax.swing.ImageIcon; public class Player extends Actor { public Player(int x, int y) { super(x, y); initPlayer(); } private void initPlayer() { ImageIcon iicon = new ImageIcon("src/resources/sokoban.png"); Image image = iicon.getImage(); setImage(image); } public void move(int x, int y) { int dx = x() + x; int dy = y() + y; setX(dx); setY(dy); } }
class Baggage-4
Baggage.javapackage com.zetcode; import java.awt.Image; import javax.swing.ImageIcon; public class Baggage extends Actor { public Baggage(int x, int y) { super(x, y); initBaggage(); } private void initBaggage() { ImageIcon iicon = new ImageIcon("src/resources/baggage.png"); Image image = iicon.getImage(); setImage(image); } public void move(int x, int y) { int dx = x() + x; int dy = y() + y; setX(dx); setY(dy); } }. mov()هو عبارة علي كلاس متحرك لهدا فهو يحتوي علي دلة Baggage
class Area-5
Area.javapackage com.zetcode; import java.awt.Image; import javax.swing.ImageIcon; public class Area extends Actor { public Area(int x, int y) { super(x, y); initArea(); } private void initArea() { ImageIcon iicon = new ImageIcon("src/resources/area.png"); Image image = iicon.getImage(); setImage(image); } }. عليه Buggages هو الكلاس الدي نحاول وضع كائنات الكلاس Area الكلاسclass Sokoban-6
Sokoban.javapackage com.zetcode; import java.awt.EventQueue; import javax.swing.JFrame; public class Sokoban extends JFrame { private final int OFFSET = 30; public Sokoban() { initUI(); } private void initUI() { Board board = new Board(); add(board); setTitle("Sokoban"); setSize(board.getBoardWidth() + OFFSET, board.getBoardHeight() + 2 * OFFSET); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); } public static void main(String[] args) { EventQueue.invokeLater(() -> { Sokoban game = new Sokoban(); game.setVisible(true); }); } }هدا هو الكلاس الرئيسي الدي يحتوي علي الكلاسات التي سبق دكرها في الاعليفي حالة عدم تمكنك من تركبي الكود بطريقة صحيحة يمكنك مشاهدة الفيديو من هنا
***********************
***********************
إرسال تعليق