الثعبان ياخد الشكل التالى % هو الراس هو الديل و* هي التفاحةoooo
O
O
O
O
%
*
حيت (%0000) هو الثعبان
(*) التفاحة هى
where are you ?
هذه فكره مبدئيه للتطبيق .
مثلا ليكن أنك وضعت الثعبان في JPanel ، وقمت بعمل Mouse Listener على الأسهم الأربع ، وفي حال ضغطت أي زر منهم قم بتغيير مسار الثعبان (قم باعاده الرسم) ، مع تغيير Position الثعبان الى الجهه المراد ، مثلا عندما يضغط يمين وكان الموقع الحالي :
100 , 200
يتغير الموقع الى :
100 , 210
الان التفاح يجب أن يظهر بشكل عشوائي Random ، ويختفي بعد ذلك ، فقم مثلا بوضع اظهار التفاح في موقع معين في Thread منفصل عن الخاص بحركه الثعبان ، ومثلا اعمل داله ترجع موقع التفاحه الحالي .
في حاله حركت الثعبان ، ممكن تعمل اختبار الموقع الحالي ، بالموقع الخاص بالتفاحه ، فاذا تساوى قم بزياده طول الثعبان ،
وهناك الكثير من الأفكار ، قم بالبدء بالعمل ، وان شاء الله يساعدوك الشباب .
حاليا مشغول بالاختبارات ، وسوف تنتهي الأسبوع القادم بمشيئه الله ، لذلك لن أستطيع تقديم أي Code الا بعد انتهائها :) .
بالتوفيق .
http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة
https://moalfat.com للكتب الالكترونية والكورسات التعليمية
Everything we see now is just an engineering solution based on old science
بصراحة أخي الرومانسي الموضوع ليس بالسهولة التي تتصوره
لديك إنحناءات في نصف الطريق
تحتاج إلى linkedList
تخزن فيها نقاط النهاية والبداية والتعرجات
لأن الرسم في جافا يتم مسحه باستمرار
أخي الكريم محاولاتك لكي نستطيع مساعدتك بشكل أكبر
الله معك
أخي علاء ،
فعلا الأمر ليس بهذه السهوله بالطبع ، ولكنه ليس أمر بهذه الصعوبه أيضا ، وخاصه لو كان بسيط أي لا توجد مراحل ، لا توجد نقاط اصطدام الثعبان مع حائط ،
طبعا ستكون هناك مشاكل كثيره ، منها مثلا عندما ينتقل الثعبان الى أقصى اليمين ، وهنا عليه الخروج من الجهه اليسرى ، بالاضافه الى مشاكل لن تظهر الا عند بدء كتابه البرنامج .
على العموم لم أكتب مثل هذه البرامج ، وستكون فرصه جيده لي لتعلم شيء جديد .... وسأبدا فيه قريبا وان شاء الله أتوفق ،
وربما أكون أنا من يضع محاولاته المره القادمه :) :) .
تحياتي .
http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة
https://moalfat.com للكتب الالكترونية والكورسات التعليمية
Everything we see now is just an engineering solution based on old science
صحيح كلامك أخ رومانسي
أنا لي تجارب كثيرة في موضوع الرسم بالذات
فعلاً من أصعب البرمجة
ما رأيك في مشروع مشترك
يعني محاولاتي مع محاولاتك تصنع شيئاً جميلاً :D
الله معك
شكرا علي هدا الاهتمام لمادا لا يكون هدا العمل بداية لتعلم اد ارى ان كود هده اللعبة يتضمن جميع اساسيات البرمجة
تقصد أن اللعبة ستكون على الدوس مثلاً؟؟؟
حتى لو بدأنا في مشروع هكذا
بالتأكيد لن يكون على الدوس
تحياتي
نعم علي الدوس انا مبتدئ في جافا اما تجريبتى فمع c++ مند5 سنوات
أخي لا أعلم كيف يمكنني أن أفيدك
فأنا لم أعمل على الدوس في الأغلب
ولا أعرف كيف يمكنك مسح الشاشة وإعادة الكتابة عليها ثانية
لكن بما أن لك معرفة كافية في C++ ابحث عن تقنية JNI
أظن أنها ستفيدك
الله معك
Direction
--------------------------------
import java.util.*;
public enum Direction {
UP, RIGHT, DOWN, LEFT;
public static Direction random() {
Random rand = new Random();
int r = rand.nextInt(4);
return (Direction.values()) [r];
}
}
-----------------------------
Snake
---------------------------
import java.awt.*;
import java.util.*;
public class Snake {
private LinkedList<Point> pieces;
private Direction facing;
private int foodCount;
private int lengthenSteps;
private boolean alive;
public Snake(int x, int y) {
this.pieces = new LinkedList<Point>();
this.pieces.add(new Point(x, y));
this.facing = Direction.RIGHT;
this.foodCount = 0;
this.alive = true;
}
public void eat() {
this.foodCount++;
this.lengthenSteps += this.foodCount;
}
public Point getHead() {
return this.pieces.get(0);
}
public LinkedList<Point> getPieces() {
return this.pieces;
}
public boolean isAlive() {
return this.alive;
}
public boolean overlaps() {
Point head = this.getHead();
for (Point p : this.getPieces()) {
if (p != head && p.equals(head)) {
return true;
}
}
return false;
}
public void move() {
Point head = this.getHead();
switch (this.facing) {
case UP:
this.pieces.addFirst(new Point(head.x, head.y - 1));
break;
case DOWN:
this.pieces.addFirst(new Point(head.x, head.y + 1));
break;
case LEFT:
this.pieces.addFirst(new Point(head.x - 1, head.y));
break;
case RIGHT:
this.pieces.addFirst(new Point(head.x + 1, head.y));
break;
}
if (this.lengthenSteps > 0) {
this.lengthenSteps--;
} else {
this.pieces.removeLast(); // delete tail
}
}
public void setAlive(boolean alive) {
this.alive = alive;
}
public void setDirection(Direction facing) {
this.facing = facing;
}
}
--------------------------
SnakeFrame
--------------------------
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class SnakeFrame extends JFrame {
public static void main(String[] args) {
SnakeFrame frame = new SnakeFrame();
frame.start();
}
private static final long serialVersionUID = 1L;
private SnakePanel panel;
private Snake snake;
public void start() {
this.setLayout(new BorderLayout());
this.setTitle("Snake Game");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 300);
this.snake = new Snake(1, 1);
this.panel = new SnakePanel(this.snake);
this.add(this.panel);
MyKeyListener key = new MyKeyListener();
this.addKeyListener(key);
this.pack();
this.setVisible(true);
}
public class MyKeyListener extends KeyAdapter {
public void keyPressed(KeyEvent event) {
int keyCode = event.getKeyCode();
if (keyCode == KeyEvent.VK_UP) {
snake.setDirection(Direction.UP);
} else if (keyCode == KeyEvent.VK_DOWN) {
snake.setDirection(Direction.DOWN);
} else if (keyCode == KeyEvent.VK_LEFT) {
snake.setDirection(Direction.LEFT);
} else if (keyCode == KeyEvent.VK_RIGHT) {
snake.setDirection(Direction.RIGHT);
}
}
}
}
-------------------------------------------
SnakePanel
-------------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class SnakePanel extends JPanel {
private static final long serialVersionUID = 0;
private static final int SIZE = 20;
private static final int PIXELS_PER_SQUARE = 10;
private Snake snake;
public SnakePanel(Snake snakey) {
this.setPreferredSize(new Dimension(SIZE * PIXELS_PER_SQUARE, SIZE * PIXELS_PER_SQUARE));
this.setBackground(Color.WHITE);
this.snake = snakey;
Timer tim = new Timer(200, new ActionListener() {
public void actionPerformed(ActionEvent e) {
snake.move();
repaint();
}
});
tim.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.GREEN);
g2.scale(PIXELS_PER_SQUARE, PIXELS_PER_SQUARE);
for (Point p : this.snake.getPieces()) {
g2.draw(new Ellipse2D.Double(p.x, p.y, 1, 1));
}
}
}