توصي هذه المقالة بلعبة مصغرة كلاسيكية تنفذها Java: Snake ، أعتقد أن الجميع قد لعبها ، وكيفية تحقيقها؟
صورة التكاثر:
دون مزيد من اللغط ، فقط عرض الرمز:
1.
الطبقة العامة GreedSnake {public static void main (string [] args) {snakeModel model = new SnakeModel (20،30) ؛ SnakeControl Control = New SnakeControl (نموذج) ؛ عرض SnakeView = جديد SnakeView (نموذج ، التحكم) ؛ // أضف مراقبًا ودع الرأي يصبح مراقبًا للنموذج النموذج. (موضوع جديد (نموذج)). start () ؛ }}2.
حزمة mvctest ؛ // snakeControl.Javaimport java.awt.event.keyevent ؛ import java.awt.keylistener ؛ public class snakeControl تنفذ keylistener {snakemodel model ؛ snakeControl العامة (نموذج snakeModel) {this.model = model ؛ } public void keypressed (keyevent e) {int keycode = e.getKeyCode () ؛ if (model.running) {// مفتاح المفتاح المعالج (keycode) {case keyevent.vk_up: model.changedirection (snakeModel.up) ؛ استراحة؛ CASE KEYEVENT.VK_DOWN: MODEL.CHANGEDIRECTION (SNAKEMODEL.DOWN) ؛ استراحة؛ case keyevent.vk_left: model.ChangedIrection (snakeModel.left) ؛ استراحة؛ CASE KEYEVENT.VK_RIGHT: Model.ChangedIrection (SnakeModel.Right) ؛ استراحة؛ case keyevent.vk_add: case keyevent.vk_page_up: model.speedup () ؛ استراحة؛ CASE keyevent.vk_subtract: case keyevent.vk_page_down: model.speeddown () ؛ استراحة؛ case keyevent.vk_space: case keyevent.vk_p: model.changepausestate () ؛ استراحة؛ الافتراضي:}} // يتم معالجة مفتاح في أي حال ، ويؤدي المفتاح إلى إعادة تشغيل اللعبة إذا (keycode == keyevent.vk_r || keycode == keyevent.vk_s || keycode == keyevent.vk_enter) {model.reset () ؛ }} public void keyreleseped (keyevent e) {} public void keytytyped (keyevent e) {}}3.
package mvctest ؛ // snakemodel.javaimport javax.swing.*؛ import java.util.arrays ؛ import java.util.linkedList ؛ import java.util.Observable // تشير إلى ما إذا كان هناك جسم ثعبان أو طعام في الموضع LinkedList NodeArray = new LinkedList () ؛ // الأفعى عقدة جسم الغذاء. int maxx ؛ int maxy الاتجاه int = 2 ؛ // اتجاه الثعبان الجري الجري = false ؛ // Run State int timeInterval = 200 ؛ // الفاصل الزمني ، millisecond double speedChangerate = 0.75 ؛ // في كل مرة يتغير معدل تغيير السرعة مؤقتًا مؤقتًا = false ؛ // الإيقاف المؤقت لعلم int النتيجة = 0 ؛ // Score int countmove = 0 ؛ // يجب أن يكون عدد المرات التي تتحرك قبل تناول الطعام // لأعلى ولأسفل حتى // اليمين واليسرى يجب أن يكونوا نهائيين ثابتين للجمهور = 2 ؛ انخفاض ثابت للعام الثابت = 4 ؛ غادر int الثابت العام = 1 ؛ الثابت العام int اليمين = 3 ؛ snakeModel العامة (int maxx ، int maxy) {this.maxx = maxx ؛ this.maxy = maxy ؛ إعادة ضبط()؛ } public void reset () {Direction = SnakeModel.up ؛ // اتجاه ثعبان تشغيل TimeInterval = 200 ؛ // الفاصل الزمني ، الملي ثانية مؤقتًا = false ؛ // Pause Flag Score = 0 ؛ // score countmove = 0 ؛ // عدد المرات قبل تناول الطعام // matiRx الأولي ، كل ما واضحة 0 مصفوفة = منطقية جديدة [maxx] [] ؛ لـ (int i = 0 ؛ i <maxx ؛ ++ i) {matrix [i] = new boolean [maxy] ؛ Arrays.fill (Matrix [i] ، false) ؛ } // الأولي الأذكياء // الأولي جسم الأفعى ، إذا كان هناك أكثر من 20 موقعًا أفقيًا ، فإن الطول هو 10 ، وإلا فإنه نصف الموضع الأفقي intarrayLength = maxx> 20؟ 10: maxx / 2 ؛ nodeArray.clear () ؛ لـ (int i = 0 ؛ i <IngArrayLength ؛ ++ i) {int x = maxx / 2 +i ؛ // maxx تتم تهيئة إلى 20 int y = maxy / 2 ؛ // يتم تهيئة maxy إلى 30 // nodeArray [x ، y]: [10،15]-[11،15]-[12،15] ~~ [20،15] // اتجاه التشغيل الافتراضي قد ارتفع ، لذلك في بداية اللعبة تصبح NodeArray: // [10،14]-[10،15]-[11،15]-[12،15] nodeArray.addlast (عقدة جديدة (x ، y)) ؛ Matrix [x] [y] = true ؛ } // إنشاء طعام الطعام = createFood () ؛ Matrix [food.x] [food.y] = true ؛ } void public changedirection (int newDirection) {// لا يمكن أن يكون الاتجاه المتغير في نفس الاتجاه أو عكسه إلى الاتجاه الأصلي إذا (الاتجاه ٪ 2! = newDirection ٪ 2) {Direction = newDirection ؛ }} public boolean moveon () {node n = (node) nodeArray.getFirst () ؛ int x = nx ؛ int y = ny ؛ // زيادة وتقليل قيمة الإحداثيات وفقًا لمفتاح الاتجاه (الاتجاه) {case Up: y-- ؛ استراحة؛ القضية لأسفل: y ++ ؛ استراحة؛ القضية اليسار: x-- ؛ استراحة؛ الحالة اليمنى: x ++ ؛ استراحة؛ } // إذا كان الإحداثي الجديد يقع ضمن النطاق الصحيح ، فمعالجة إذا ((0 <= x && x <maxx) && (0 <= y && y <maxy)) {if (matrix [x] [y]) nodeArray.addfirst (طعام) ؛ // إعطاء طول من رأس الأفعى // ترتبط قاعدة SCORE بعدد وسرعة الحركة تغيير الاتجاه int scoret = (10000 - 200 * countmove)/ timeInterval ؛ Score += Scoreget> 0؟ Scoreget: 10 ؛ countmove = 0 ؛ الطعام = createFood () ؛ // إنشاء مصفوفة طعام جديدة [food.x] [food.y] = true ؛ // قم بتعيين موقع Food Return True ؛ } else // أكل جسم الأفعى نفسه ، فشل العودة كاذبة ؛ } آخر {// إذا لم يكن هناك شيء على النقطة في الإحداثيات الجديدة (جسم الأفعى) ، حرك جسم الأفعى nodearray.addfirst (عقدة جديدة (x ، y)) ؛ Matrix [x] [y] = true ؛ n = (node) nodeArray.Removelast () ؛ المصفوفة [NX] [NY] = false ؛ Countmove ++ ؛ العودة صحيح. }} إرجاع خطأ ؛ // المس الحافة ، FAIL} public void run () {running = true ؛ بينما (تشغيل) {try {thread.sleep (timeInterval) ؛ } catch (استثناء e) {break ؛ } if (! wused) {if (moveon ()) {setChanged () ؛ // النموذج يخطر بيانات العرض التي تم تحديثها لـ AtformObservers () ؛ } آخر {joptionpane.showmessagedialog (null ، "you fans" ، "game over" ، joptionpane.information_message) ؛ استراحة؛ }}} تشغيل = false ؛ } العقدة الخاصة createFood () {int x = 0 ؛ int y = 0 ؛ . x = r.nextint (maxx) ؛ y = r.nextint (maxy) ؛ } بينما (Matrix [x] [y]) ؛ إرجاع العقدة الجديدة (x ، y) ؛ } public void speedup () {timeInterval *= speedChangerate ؛ } public void speeddown () {timeInterval /= speedChangerate ؛ } public void changepausestate () {patused =! pused ؛ } السلسلة العامة toString () {string result = "" ؛ لـ (int i = 0 ؛ i <nodeArray.size () ؛ ++ i) {node n = (node) nodeArray.get (i) ؛ النتيجة + = "[" + nx + "،" + ny + "]" ؛ } نتيجة الإرجاع ؛ }} class node {int x ؛ int y ؛ العقدة (int x ، int y) {this.x = x ؛ this.y = y ؛ }}4.
حزمة mvctest ؛ // snakeview.javaimport javax.swing.*؛ استيراد java.awt.*؛ استيراد java.util.iterator ؛ استيراد java.util.linkedList ؛ استيراد java.util.Util.Observable ؛ استيراد java.util.Observable java.util.observer ؛ الطبقة العامة snakeview تنفذ observer {snakeControl control = null ؛ نموذج SnakeModel = فارغ ؛ JFrame Mainframe ؛ Canvas PaintCanvas. Jlabel Labelscore ؛ Canvaswidth النهائي الثابت العام = 200 ؛ ثابت عام ثابت int canvasheight = 300 ؛ استاتيكي عام int nodewidth = 10 ؛ استاتيكي عام int nodeheight = 10 ؛ SnakeView العامة (نموذج SnakeModel ، SnakeControl Control) {this.model = model ؛ this.control = التحكم ؛ mainframe = new JFrame ("GreedSnake") ؛ حاوية cp = mainframe.getContentPane () ؛ // إنشاء أفضل نقاط عرض LABELSCORE = New JLabel ("Score:") ؛ cp.add (labelscore ، borderlayout.north) ؛ // إنشاء منطقة عرض اللعبة المتوسطة PaintCanvas = New Canvas () ؛ paintcanvas.setsize (canvaswidth + 1 ، canvasheight + 1) ؛ PaintCanvas.AddKeyListener (Control) ؛ cp.add (paintcanvas ، borderlayout.center) ؛ // قم بإنشاء شريط المساعدة أدناه JPanel PaneButtom = New JPanel () ؛ panelbuttom.setLayout (New BorderLayout ()) ؛ Jlabel LabelHelp ؛ LabelHelp = New JLabel ("pageup ، pagedown for speed ؛" ، jlabel.center) ؛ Panelbuttom.add (LabelHelp ، BorderLayout.north) ؛ LabelHelp = New JLabel ("Enter أو R أو S للبدء ؛" ، Jlabel.Center) ؛ Panelbuttom.add (LabelHelp ، BorderLayout.Center) ؛ LabelHelp = New JLabel ("Space أو P for Pause" ، Jlabel.Center) ؛ panelbuttom.add (labelhelp ، borderlayout.south) ؛ cp.add (panelbuttom ، borderlayout.south) ؛ Mainframe.addKeyListener (Control) ؛ mainframe.pack () ؛ Mainframe.setResible (false) ؛ Mainframe.setDefaultCloseOperation (jframe.exit_on_close) ؛ mainframe.setVisible (صحيح) ؛ } void repaint () {graphics g = paintcanvas.getGraphics () ؛ // ارسم الخلفية G.SetColor (color.white) ؛ G.FillRect (0 ، 0 ، canvaswidth ، canvasheight) ؛ // ارسم الأفعى G.SetColor (color.black) ؛ LinkedList na = model.nodearray ؛ iterator it = na.iterator () ؛ بينما (it.hasnext ()) {node n = (node) it.next () ؛ drawnode (g ، n) ؛ } // ارسم food g.setColor (color.red) ؛ العقدة n = model.food ؛ drawnode (g ، n) ؛ addatescore () ؛ } private void drawnode (Graphics g ، node n) {g.fillRect (nx * nodewidth ، ny * nodeheight ، nodewidth - 1 ، nodeheight - 1) ؛ } public void addatescore () {string s = "score:" + model.score ؛ labelscore.settext (s) ؛ } تحديث الفراغ العام (يمكن ملاحظة o ، كائن arg) {repaint () ؛ }}الغرض من هذه المقالة هو أن يأخذك إلى التذكر بالكلاسيكيات ، ولكن الغرض الأكثر أهمية هو مساعدتك في تعلم برمجة Java بشكل جيد.