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-4Baggage.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()هو عبارة علي كلاس متحرك لهدا فهو يحتوي علي دلة Baggageclass Area-5Area.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-6Sokoban.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); }); } }هدا هو الكلاس الرئيسي الدي يحتوي علي الكلاسات التي سبق دكرها في الاعليفي حالة عدم تمكنك من تركبي الكود بطريقة صحيحة يمكنك مشاهدة الفيديو من هنا
***********************
***********************


إرسال تعليق