首页 > 编程知识 正文

python 贪吃蛇小游戏代码,简易贪吃蛇代码html

时间:2023-05-05 20:42:54 阅读:59927 作者:3966

最近一个教你用100行代码实现大餐游戏的项目,内置了大餐蛇、俄罗斯方块、井架等游戏。 在这里,我们将分享每一个实现步骤,让大家学习。 如果有不足或错误,请在评论中指出

因为是一个例子,界面可能不漂亮,但是这些可以用更干净的资源来代替方格。 最终效果是:

其实这些小游戏的实现并不复杂。 如果你把思路清晰化,一步一步地构建起来,你就会发现其实原理很简单。 只是,我们想变得复杂。 完整Demo地址:大餐蛇游戏Demo。

自定义视图的源代码可以直接看到这里。 贪吃蛇的游戏视图

实现步骤及说明如下:

1. 自定义游戏界面

游戏的话当然,为了实现画面的描绘一定会定制视图。

这里直接继承View,重写draw方法来绘制游戏界面。 因为小游戏很轻,所以这里没有使用SurfaceView绘制界面

2. 游戏属性值的定义

吃蛇应该是玩过的,这里简单的定义了方向、矩阵的格子数、蛇的颜色和食物的颜色、蛇的运动方向、代码和说明如下:

/** *蛇头方向常数* /公共final static int s _ left=0; 公共最终静态int s _ top=1; 公共金融静态int s _ right=2; 公共final static int s _ bottom=3; publicfinalstaticints _ base _ speed=300; //基本速度,更新毫秒int mColNum=18列数int mRowNum=18; //列数float mColWidth; //列宽intm bgcolor=color.parse color (' # a 7a6ab ' ); //背景色intmgridlinecolor=color.parse color (' # 838692 '; //网格线颜色int mSnackBodyColor=Color.WHITE; //蛇身颜色int mSnackHeadColor=Color.WHITE; //蛇头颜色intmfoodcolor=color.parse color (' # fcae 14 ' ); //食物颜色int mSnackDefLen=3; //蛇身的默认长度int mDirec=S_LEFT; //蛇头方向int mSpeed=S_BASE_SPEED; //移动速度boolean mGamePause=false; linkedlistsnackbodymsnackbodys=new linked list (; //蛇身snackbodymfood=newsnackbody (0,0 ); //食物3. 常量及思路说明.这里蛇身采用双向链表实现,简化了增删操作。 食物和身体都是由方形组成的,这里可以直接用单个SnackBody类表示食物4. 界面绘制.接口的绘制,简化为背景。 网格食物和蛇的绘制,代码如下: 3358ww.Sina.com/

protectedvoidondraw (canvas canvas ) canvas.Drawcolor ) mbgcolor; Dawfood(Canvas ); Drawsnack(Canvas ); drawgridbg(canvas ); (3358www.Sina.com)也就是画水平线和垂直线。 这里很容易理解,使用了两个循环。 ((可以合并在一起) ) ) ) ) ) )。

/** *绘制网格背景* @ param canvas */privatevoiddrawgridbg (canvas ) { int colNum=this.mColNum; intrownum=(int ) (getHeight ) )/mColWidth; //计算行数//绘制网格MPa int.setcolor (网格线颜色); 绘制//列for (inti=0; i=colNum; I ) { float startX=i * mColWidth; canvas.Drawline(startX,0,startx,getHeight ),mPaint ); //绘制行for (inti=0; i=rowNum; I ) {浮动状态=I * mcol width; canvas.drawLin

e(0, startY, getWidth(), startY, mPaint); } }

6. 界面绘制- 绘制食物

/** * 绘制食物 * @param canvas */ private void drawFood(Canvas canvas) { SnackBody mFood = this.mFood; mPaint.setColor(mFoodColor); float left = mFood.x * mColWidth; float top = mFood.y * mColWidth; canvas.drawRect(left, top, left + mColWidth, top + mColWidth, mPaint); }

7. 界面绘制-绘制蛇

/** * 绘制蛇 * @param canvas */ private void drawSnack(Canvas canvas) { LinkedList<SnackBody> mSnackBodys = this.mSnackBodys; for (int i = mSnackBodys.size() - 1; i >= 0; i--) { SnackBody mSnackBody = mSnackBodys.get(i); mPaint.setColor(i == 0 ? mSnackHeadColor : mSnackBodyColor); float left = mSnackBody.x * mColWidth; float top = mSnackBody.y * mColWidth; canvas.drawRect(left, top, left + mColWidth, top + mColWidth, mPaint); } }

8. 相关逻辑处理. 贪吃蛇的逻辑比较简单.可以分为三个块. 食物随机逻辑 蛇移动逻辑 游戏状态检查

9. 食物随机逻辑

//随机食物 private void randomFood() { LinkedList<SnackBody> mSnackBodys = this.mSnackBodys; if (mSnackBodys.size() >= mColNum * mRowNum) { return;//满了,这么吊的么 } SnackBody first = mSnackBodys.getFirst(); SnackBody food = new SnackBody(0, 0); do { //随机一个点,不在蛇头上就行. 这里允许食物和身体重叠 food.setPositon(random(0, mColNum), random(0, mRowNum)); } while (first.equals(food)); this.mFood = food; }

10. 蛇移动逻辑

/** * 蛇的移动 */ private void snackMove() { if (mGamePause) return; LinkedList<SnackBody> mSnackBodys = this.mSnackBodys; SnackBody nextHead = new SnackBody(0, 0); SnackBody snackHead = mSnackBodys.getFirst(); switch (mDirec) { case S_LEFT: nextHead.setPositon(snackHead.x - 1, snackHead.y); break; case S_TOP: nextHead.setPositon(snackHead.x, snackHead.y - 1); break; case S_RIGHT: nextHead.setPositon(snackHead.x + 1, snackHead.y); break; case S_BOTTOM: nextHead.setPositon(snackHead.x, snackHead.y + 1); break; } mSnackBodys.addFirst(nextHead); mSnackBodys.removeLast(); //检查是否吃到食物了, SnackBody mFood = this.mFood; if (nextHead.equals(mFood)) { mSnackBodys.addFirst(mFood); mSpeed = getSpeed();//计算新速度 if (onEatFoodListener != null) { onEatFoodListener.eatFood(mSpeed); } //追加到头部,重新随机食物 randomFood(); } checkGameEnd(); }

11. 游戏状态检查逻辑

private void checkGameEnd() { LinkedList<SnackBody> mSnackBodys = this.mSnackBodys; SnackBody headBody = mSnackBodys.getFirst(); //查询头部与身体的交集 int indexOf = mSnackBodys.lastIndexOf(headBody); int cellNum = mColNum * mRowNum; int snackLen = mSnackBodys.size(); //边界判断,咬到自己的判断,和占满了 if (headBody.x < 0 || headBody.y < 0 || headBody.x >= mColNum || headBody.y >= mRowNum || //0 是蛇头 1是刚吃到的食物 不可能咬到脖子(第二格) (indexOf != 0 &&indexOf != 1 && indexOf != -1)|| snackLen>=cellNum ) { mGamePause = true; if (onGameOverListener != null) { onGameOverListener.gameOver(snackLen, cellNum); } Logger.D("游戏结束"); } }

12. 游戏界面刷新重绘逻辑

private void beginGameRun() { removeCallbacks(runnable); final Runnable localRun = new Runnable() { @Override public void run() { int speed = mIsQuickMove ? mQuickSpeed : mSpeed; snackMove();//自动移动 invalidate(); postDelayed(runnable, speed); } }; postDelayed(this.runnable = localRun, mSpeed); }

13.方向控制逻辑

public void turnTo(int direc) { switch (direc) { case S_LEFT: if (mDirec != S_RIGHT) { mDirec = direc; } break; case S_TOP: if (mDirec != S_BOTTOM) { mDirec = direc; } break; case S_RIGHT: if (mDirec != S_LEFT) { mDirec = direc; } break; case S_BOTTOM: if (mDirec != S_TOP) { mDirec = direc; } break; } beginGameRun();//重置重绘时间 snackMove();//移动蛇 invalidate();//刷新界面 }

14.蛇身体方块实体类

class SnackBody { public int x, y;//坐标 public void setPositon(int x, int y) { this.x = x; this.y = y; } public SnackBody(int x, int y) { this.x = x; this.y = y; }//以下为自动生成代码,由坐标来判断方块是否一样 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SnackBody snackBody = (SnackBody) o; if (x != snackBody.x) return false; return y == snackBody.y; } @Override public int hashCode() { int result = x; result = 31 * result + y; return result; } }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。