この記事では、Java:Snakeによって実装された古典的なミニゲームを推奨しています。誰もがそれをプレイしたと思います、それを達成する方法は?
複製画像:
これ以上苦労せずに、コードを提示するだけです。
1。
public class greedsnake {public static void main(string [] args){snakemodel model = new snakemodel(20,30); Snakecontrol Control = new Snakecontrol(モデル); SnakeView View = new SnakeView(モデル、コントロール); //オブザーバーを追加して、モデルモデルのオブザーバーにビューをaddobserver(表示)にします。 (新しいスレッド(モデル))。start(); }}2。
パッケージmvctest; // snakecontrol.javaimport java.awt.event.keyevent; import java.awt.event.keylistener; public class snakecontrolはkeylistener {snakemodelモデルを実装しています。 public 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 keyReleased(keyevent e){} public void keytyped(keyevent e){}}3。
パッケージmvctest; // snakemodel.javaimport javax.swing。*; import java.util.arrays;インポートjava.util.linkedlist; import java.util.observable; import java.util.ubservable; import java.util.random; class snakemodel extendel expensuable bool runable implementsマトリックス; // nodearray = new LinkedList(); //ヘビボディノードフード。 int maxx; int maxy; int方向= 2; //スネークのランニングブールランニング= falseの方向。 // state int timeinterval = 200を実行します。 //時間間隔、ミリ秒のダブルスピードチャンガー酸= 0.75; //速度変更速度ブール速度= false; //フラグintスコアを一時停止します= 0; //スコアint countmove = 0; //食べ物を食べる前に移動する回数//上下に偶数である必要があります//右と左は奇妙なpublic static final int up = 2である必要があります。 public static final int down = 4; public static final int left = 1; public static final int right = 3; public snakemodel(int maxx、int maxy){this.maxx = maxx; this.maxy = maxy; reset(); } public void reset(){direction = snakemodel.up; //ヘビランニングタイムインターバル= 200の方向。 //時間間隔、millisecond paused = false; //フラグスコアを一時停止します= 0; //スコアCountMove = 0; //食べ物を食べる前の回数//初期マチルックス、すべてクリア0マトリックス= new boolean [maxx] []; for(int i = 0; i <maxx; ++ i){matrix [i] = new boolean [maxy]; arrays.fill(matrix [i]、false); } //初期ヘビ//ヘビの体を初期に、20を超える水平位置がある場合、長さは10です。そうしないと、水平位置の半分です。 10:Maxx / 2; nodearray.clear(); for(int i = 0; i <initarrayLength; ++ i){int x = maxx / 2 +i; // maxxは20 int y = maxy / 2に初期化されます。 // maxyは30に初期化されますnodearray.addlast(new Node(x、y)); matrix [x] [y] = true; } // Food Food = CreateFood(); matrix [food.x] [food.y] = true; } public void chanderirection(int newDirection){//変更された方向は同じ方向にあるか、元の方向に逆にすることはできません。 }} public boolean moveon(){node n =(node)nodearray.getFirst(); int x = nx; int y = ny; //方向スイッチ(方向)に従って座標値を増やして減少させます{case up:y--;壊す;ケースダウン:Y ++;壊す;左のケース:x--;壊す;ケース右:x ++;壊す; } //新しい座標が有効な範囲内に収まる場合、process if((0 <= x && x <maxx)&&(0 <= y && y <maxy)){if(matrix [x] [y]){//新しい調整のポイントに何かがある場合(snakeまたはfood and food.xx &x nodearray.addfirst(food); //ヘビの頭から長さを与えるスコア +=スコアゲット> 0?スコアゲット:10; CountMove = 0; food = createfood(); //新しいフードマトリックスを作成します[food.x] [food.y] = true; //フードロケーションをtrueに設定します。 } else //ヘビの体そのものを食べると、falseを返します。 } else {//新しい座標(ヘビの体)のポイントに何もない場合、蛇の体を移動します。 matrix [x] [y] = true; n =(node)nodearray.removelast(); Matrix [nx] [ny] = false; CountMove ++; trueを返します。 }} falseを返します。 //エッジをタッチし、失敗します} public void run(){running = true; while(running){try {thread.sleep(timeinterval); } catch(例外e){break; } if(!paused){if(moveon()){setChanged(); //モデルは、notifyobservers()を更新されたビューデータを通知します。 } else {joptionpane.showmessageialog(null、 "you faild"、 "game over"、joptionpane.information_message);壊す; }}} running = false; } private node createfood(){int x = 0; int y = 0; //ランダムスネークの体と重複しない有効な領域で位置を取得し、食べ物は{random r = new Random(); x = r.nextint(maxx); y = r.nextint(maxy); } while(matrix [x] [y]);新しいノード(x、y)を返します。 } public void speedup(){timeinterval *= speedchangerate; } public void speeddown(){timeinterval /= speedchangerate; } public void changepausestate(){paused =!soused; } public string toString(){string result = ""; for(int i = 0; i <nodearray.size(); ++ i){node n =(node)nodearray.get(i); result + = "[" + nx + "、" + ny + "]"; } return result; }} class node {int x; int y;ノード(int x、int y){this.x = x; this.y = y; }}4。
パッケージmvctest; // snakeview.javaimport javax.swing。*; import java.awt。*; import java.util.iterator; import java.util.linkedlist; import java.util.observable; import java.util.observable; import java.util.util.observable; java.util.observer;パブリッククラスSnakeViewはオブザーバー{snakecontrol control = null; snakemodelモデル= null; JFrame MainFrame; Canvas Paintcanvas; Jlabel Labelscore; public static final int canvaswidth = 200; public static final int canvasheight = 300; public static final int nodewidth = 10; public static final int nodeheight = 10; Public SnakeView(SnakeModel Model、Snakecontrol Control){this.model = model; this.control = control; mainframe = new JFrame( "greedsnake");コンテナcp = mainframe.getContentPane(); //トップスコアを作成するLabelscore = new JLabel( "スコア:"); cp.add(labelscore、borderlayout.north); //ミドルゲームディスプレイエリアPaintCanvas = new Canvas()を作成します。 paintcanvas.setsize(canvaswidth + 1、canvasheight + 1); paintcanvas.addkeylistener(コントロール); cp.add(paintcanvas、borderlayout.center); // jpanel panelbuttom = 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 or r or s for start;"、jlabel.center); panelbuttom.add(labelhelp、borderlayout.center); labelhelp = new Jlabel( "Space or P for Pause"、jlabel.center); panelbuttom.add(labelhelp、borderlayout.south); cp.add(panelbuttom、borderlayout.south); mainframe.addkeylistener(control); mainframe.pack(); MainFrame.SetSizable(false); mainframe.setDefaultCloseOperation(jframe.exit_on_close); mainframe.setVisible(true); } 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(); while(it.hasnext()){node n =(node)it.next(); drawnode(g、n); } //食品g.setcolor(color.red)を描く;ノードn = model.food; drawnode(g、n); updateScore(); } private void Drawnode(Graphics G、node N){g.fillrect(nx * nodewidth、ny * nodeheight、nodewidth -1、nodeheight -1); } public void updateScore(){string s = "score:" + model.score; labelscore.settext(s); } public void update(Observable o、object arg){repaint(); }}この記事の目的は、クラシックを思い出すようにあなたを連れて行くことですが、より重要な目的はJavaプログラミングをうまく学ぶのを助けることです。