1、2005-6-13 time:15:57:16* lastmodified:* history:public class greedsnake public static void main(string args) snakemodel model = new snakemodel(20,30); snakecontrol control = new snakecontrol(model); snakeview view = new snakeview(model,control); /添加一个观察者,让view成为model的观察者 model.addobserver(view); (ne
2、w thread(model).start(); -2、/snakecontrol.javaimport java.awt.event.keyevent;import java.awt.event.keylistener;* mvc中的controler,负责接收用户的操作,并把用户操作通知modelpublic class snakecontrol implements keylistenersnakemodel model;public snakecontrol(snakemodel model)this.model = model;public void keypressed(keyev
3、ent e) int keycode = e.getkeycode();if (model.running) / 运行状态下,处理的按键switch (keycode) case keyevent.vk_up:model.changedirection(snakemodel.up);break;case keyevent.vk_down:model.changedirection(snakemodel.down);case keyevent.vk_left:model.changedirection(snakemodel.left);case keyevent.vk_right:model.c
4、hangedirection(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();default:/ 任何情况下处理的按键,按键导致重新启动游戏if (keycode = keyevent.vk_r |keycode
5、 = keyevent.vk_s |keycode = keyevent.vk_enter) model.reset();public void keyreleased(keyevent e) public void keytyped(keyevent e) 3、* 游戏的model类,负责所有游戏相关数据及运行58:33/snakemodel.javaimport javax.swing.*;import java.util.arrays;import java.util.linkedlist;import java.util.observable;import java.util.rand
6、om;class snakemodel extends observable implements runnable boolean matrix; / 指示位置上有没蛇体或食物linkedlist nodearray = new linkedlist();/ 蛇体node food;int maxx;int maxy;int direction = 2;/ 蛇运行的方向boolean running = false;/ 运行状态int timeinterval = 200; / 时间间隔,毫秒double speedchangerate = 0.75;/ 每次得速度变化率boolean pa
7、used = false; / 暂停标志int score = 0;/ 得分int countmove = 0;/ 吃到食物前移动的次数/ up and down should be even/ right and left should be oddpublic 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
8、.maxx = maxx;this.maxy = maxy;reset();public void reset()direction = snakemodel.up;timeinterval = 200;paused = false;score = 0;countmove = 0;/ initial matirx, 全部清0matrix = new booleanmaxx;for (int i = 0; i 20 ? 10 : maxx / 2;nodearray.clear(); initarraylength;int x = maxx / 2 + i;/maxx被初始化为20int y =
9、 maxy / 2;/maxy被初始化为30/nodearrayx,y: 10,15-11,15-12,1520,15/默认的运行方向向上,所以游戏一开始nodearray就变为:/ 10,14-10,15-11,15-12,1519,15nodearray.addlast(new node(x, y);matrixxy = true;/ 创建食物food = createfood();matrixfood.xfood.y = true;public void changedirection(int newdirection) / 改变的方向不能与原来方向同向或反向if (direction
10、% 2 != newdirection % 2) direction = newdirection; * 运行一次 * return */public boolean moveon() node n = (node) nodearray.getfirst();int x = n.x;int y = n.y;/ 根据方向增减坐标值switch (direction) case up:y-;case down:y+;case left:x-;case right:x+;/ 如果新坐标落在有效范围内,则进行处理if (0 = x & x maxx) & (0 = y & y 0 ? scoreget
11、 : 10;/ 创建新的食物/ 设置食物所在位置return true; else / 吃到蛇体自身,失败return false; else / 如果新坐标的点上没有东西(蛇体),移动蛇体nodearray.addfirst(new node(x, y);n = (node) nodearray.removelast();matrixn.xn.y = false;countmove+; / 触到边线,失败public void run() running = true;while (running) try thread.sleep(timeinterval); catch (excepti
12、on e) if (!paused) if (moveon() setchanged(); / model通知view数据已经更新notifyobservers(); else joptionpane.showmessagedialog(null,you failed,game overjoptionpane.information_message);running = false;private node createfood() int x = 0;int y = 0;/ 随机获取一个有效区域内的与蛇体和食物不重叠的位置do random r = new random();x = r.ne
13、xtint(maxx);y = r.nextint(maxy); while (matrixxy);return new node(x, y);public void speedup() timeinterval *= speedchangerate;public void speeddown() timeinterval /= speedchangerate;public void changepausestate() paused = !paused;public string tostring() string result = ; nodearray.size();node n = (
14、node) nodearray.get(i);result += + n.x + , + n.y + return result;class node int x;int y;node(int x, int y) this.x = x;this.y = y;-4、/snakeview.javaimport java.awt.*;import java.util.iterator;import java.util.observer;* mvc模式中得viewer,只负责对数据的显示,而不用理会游戏的控制逻辑public class snakeview implements observer sn
15、akecontrol control = null;snakemodel model = 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.control = control;mainframe = new jframe(greedsnake);container cp = mainframe.getcontentpane();/ 创建顶部的分数显示labelscore = new jlabel(score:cp.add(labelscore, borderlayout.north);/ 创建中间的游戏显示区域paintcanvas = new canvas();paintcanvas.setsize(canvaswidt
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1