黑马程序员——贪吃蛇游戏项目分析过程

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

第一步:从什么地方入手

1、设计到几个对象(类)

2、每个类有什么方法

游戏的显示面板

GamePanel类

Void display();//显示

方块

Shape类

void moveLeft(); //左移

void moveRight(); //右移

void moveDown(); //下移

void rotate(); //旋转(变形)

void drawMe(); //显示

自己能定时下移

图形工厂

ShapeFactory类(图形工厂)

Shape getShape(); //生产出不同形状的图形

Ground类

Void accept(Shape); //接受图形,把图形变成障碍物

Void drawMe(); //显示

需要一个Controller类

处理GamePanel激发的按键事件

根据不同的情况、向Shape、ShapeFactory、Ground或GamePanel发出不同的指令

第二步:过程设计分析:

图形定时下落,每下落一次后都需要重新显示

图形移动和变形后,也需要重新显示

它又不能直接操控GamePanel,怎么办呢?

Shape定时下落(事件源)——(shapeMovedDown)下落后,触发事件——Controller(状态改变需要重新显示)

Shape的监听器ShapeListener


ShapeListener

Void shapeMovedDown(Shape);

第三步:图形设计,及游戏过程设计

基本概念:怎么表示图形,障碍物

1、可以把显示区域想象成一个大大表格,一个格子可以代表一个障碍物,几个连在一起的格子可以组成一个图形。

2、怎么区分格子呢(怎么表示这个格子呢?)

用坐标,每个格子有它自己的坐标,左上角的那个格子的坐标是(0,0)

重要概念:怎么表示图形的状态


1、图形变形:变形就是显示下一个状态

2、表示图形的状态


图形的多种状态


3、图形的移动

图形类里面要保存自己的位置信息,用left表示图形到左边界的距离,top表示图形到上边界的距离

图形移动就是改变left和top的值

基本概念:图形绝对坐标和相对坐标


图形的移动


4、画图形

把组成图形的格子画出来:

画方阵中标志为1的格子,标志为0的不画。

图形中的格子在显示区域中的位置为:

X坐标:left + 格子的x相对坐标

Y坐标:top + 格子的y相对坐标

(相对坐标是格子在方阵中的坐标)

格子的宽度和高度


格子坐标和像素坐标


图形的移动或变形

按键以后,图形是否就一定能够移动或变形?

不一定,如果下一步的动作会使图形超出边界或有的点与障碍物重叠,则不允许图形做这个动作。



5、怎么存储和表示障碍物

用一个和显示区域的格子相对应的二维数组保存障碍物的位置信息

如果对应的位置是障碍物,则这个数组中相应的元素就为1,不是则为0

6、怎么把图形变成障碍物

把属于图形的格子对应的位置都变成障碍物

判断时要注意

是指图形的身体超出边界或与障碍物重叠,而不是表示这个图形的4 x 4的方阵,因为方阵中的点并不都是图形的身体

7、消除满行

这个一行没有空白,则这一行就是满行

满的那行,上面所有的行,整体下移一行,就是消除这个满行

8、判断游戏是否结束

如果有的障碍物超出了上边界(容器满了),就是游戏结束

完善后的Ground

Ground类

BooleanisMoveable(Shape,action); //图形下一步的动作是否会被允许(边界、障碍物)

Voidaccept(Shape); //接受图形(把图形变成障碍物)

VoiddeleteFullLine(); //扫描并删除满行

Boolean isFull(); //是否还可以接受图形(是否满了)

Void drawMe(); //显示自己的方法

附录:俄罗斯、贪吃蛇游戏-项目视频及源代码下载http://www.itcast.cn/itcast_static/snakeVideo.htm


---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>

一个C#小程序,贪吃蛇游戏 using System; using System.Collections; using System.Drawing; using System.Windows.Forms; namespace WSnake { /// <summary> /// SnakeMod 的摘要说明。 /// </summary> public class SnakeMod { #region 定义6个字段 //判断食物是否在蛇身体里 private bool hasFood = false; //蛇身介质 private Label body; //蛇的颜色 private Color _color = System.Drawing.Color.SkyBlue; //蛇的大小 private Size size; //移动方向默认向西 private WSnake.Way way =Way.WEST; //蛇身 private ArrayList snake; #endregion #region 定义2个属性 public Way SnakeWay { set { this.way=value; } get { return way; } } //颜色属性 public System.Drawing.Color BodyColor { set { this._color = value; } } #endregion #region 定义7个方法 //构造函数 public SnakeMod() { } //画蛇 public void DrawSnake() { //设置大小 size = new Size(10,10); //设置身体 snake = new ArrayList(); for(int i=0;i<5;i++) { body = new Label(); body.BackColor = _color; body.Size = size; body.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; body.Location=new Point(200+i*10,150); snake.Add(body); } } //返回蛇体 public ArrayList GetSnake() { return snake; } //蛇体移动 public void Move(System.Windows.Forms.Control control) { if(!this.hasFood) { control.Controls.Remove(control.GetChildAtPoint(((Label)snake[snake.Count-1]).Location)); snake.RemoveAt(snake.Count-1); } Label temp = new Label(); this.CopyBody(temp,(Label)snake[0]); switch(this.way) { case Way.WEST: { temp.Left-=10; snake.Insert(0,temp); break; } case Way.EAST: { temp.Left+=10; snake.Insert(0,temp); break; } case Way.NORTH: { temp.Top-=10; snake.Insert(0,temp); break; } case Way.SOUTH: { temp.Top+=10; snake.Insert(0,temp); break; } } control.Controls.Add((Label)snake[0]); if(this.hasFood) { this.hasFood=false; } } //copy蛇身 private void CopyBody(Label x,Label y) { x.Location = y.Location; x.BackColor = y.BackColor; x.Size = y.Size; x.BorderStyle = y.BorderStyle; } //吃东西 public bool Eat(Point food) { if(((Label)snake[0]).Left == food.X && ((Label)snake[0]).Top == food.Y) { //吃到东西 this.hasFood = true; return true; } return false; } #endregion } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值