自己写贪吃蛇的一下感悟

贪吃蛇

思想

  1. 先建立一个大的JFrame框架
  2. 建立一个Jpanel中级容器 ,将JPanel放入框架中
  3. 建立一个Data类放置各种需要用的图片

具体实现

让Jpanel类继承JPanel

public class gameJpan extends JPanel

重写JPanel中的方法

protected void paintComponent(Graphics g)

开始在JPanel上添加贪吃蛇以外的东西

        super.paintComponent(g);        this.setBackground(Color.BLACK);//设置背景色        Data.header.paintIcon(this,g,200,11);//绘制顶部        g.fillRect(25,75,850,600); //绘制游戏区域

添加完之后定义蛇

    int length;//蛇的长度    int[]snakeX=new int[600];//蛇的容量    int[]snakeY=new int[600];//蛇的容量

定义好后,让蛇显示在创建的游戏区域(因为我使用的蛇头是圆形 不分上下左右,所以用的是一个图)

if (fx.equals("R")){            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);        }        else if (fx.equals("L")){            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);        }else if (fx.equals("U")){            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);        }else if (fx.equals("D")){            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);        }        for (int i = 1; i <length ; i++) {            Data.food.paintIcon(this,g,snakeX[i],snakeY[i]);        }

初始化蛇,让蛇一开始都是在那个地方并且蛇的长度是一定的,并且把初始化放在构造函数中。fx定义的是方向

public void init(){        length=3;        snakeX[0]=100;        snakeY[0]=100;        snakeX[1]=75;        snakeY[1]=100;        snakeX[2]=50;        snakeY[2]=100;        fx="R";}

蛇画上去之后,设置用空格控制暂定和开始,需要用到按键监听,记住一定要用repaint(),使用监听需要在构造方法中加入this.addKeyListener(this);

boolean isStar=false;//定义是否开始public void keyPressed(KeyEvent e) {        int keyCode=e.getKeyCode();        //按下空格之后的判别        if (keyCode==KeyEvent.VK_SPACE){                isStar=!isStar;            repaint();//重新绘制JPanel        }

然后开始让小蛇动起来,需要用到Timer类,这样就实现了小蛇可以一直往右边走

Timer timer=new Timer(100,this);//定义定时器this.setFocusable(true);timer.start();?public void actionPerformed(ActionEvent e) {        //蛇身的移动        if (isStar&&isFail==false){            for (int i = length-1; i >0 ; i--) {                snakeX[i]=snakeX[i-1];                snakeY[i]=snakeY[i-1];            }    //蛇头的移动            snakeX[0]=snakeX[0]+25;            repaint();        timer.start();

但是你会发现小蛇会走出屏幕,所以我们需要设置一下,具体参数可以自己设置

if (snakeX[0]>850){            snakeX[0]=25;        }

接下来我们要控制蛇可以上下左右移动,之前我们定义过方向fx,在键盘监听中设置按键链接的方向

if (keyCode == KeyEvent.VK_LEFT){            fx="L";        }else if (keyCode == KeyEvent.VK_RIGHT){            fx="R";        }else if (keyCode == KeyEvent.VK_UP){            fx="U";        }else if (keyCode == KeyEvent.VK_DOWN){            fx="D";        }

这只能是内层改变fx的值,如何让这个值影响蛇的移动

if (fx.equals("R")){        snakeX[0]=snakeX[0]+25;        if (snakeX[0]>850){            snakeX[0]=25;        }    }    else if (fx.equals("D")){        snakeY[0]=snakeY[0]+25;        if (snakeY[0]>650){            snakeY[0]=75;        }    }    else if (fx.equals("U")){        snakeY[0]=snakeY[0]-25;        if (snakeY[0]<75){            snakeY[0]=650;        }            }    else if (fx.equals("L")){        snakeX[0]=snakeX[0]-25;        if (snakeX[0]<25){            snakeX[0]=850;        }            }

这样你就会有一个自由移动的蛇了

接下来我们就要设置食物了,同样需要初始化

         int foodX;         int foodY;//定义食物横纵坐标?        foodX= 25+25*random.nextInt(30);        foodY= 75+75*random.nextInt(8);?        Data.food.paintIcon(this,g,foodX,foodY);?

有了会动的蛇 还有随机出现的食物,我们就要让蛇碰到食物之后 长度增加,并且生成新的食物

if (snakeX[0]==foodX&&snakeY[0]==foodY) {                length++;                foodX= 25+25*random.nextInt(30);                foodY= 75+75*random.nextInt(8);}

设置完这些,工程已经进行一大半了,然后我们就要设置死亡机制

boolean isFail=false;//定义是否失败if (isFail){            g.setColor(Color.RED);            g.setFont(new Font("微软雅黑",Font.BOLD,40));            g.drawString("游戏失败,按下空格重新开始",200,300);        }        if (isFail){                    //在空格按键监听里边设置                isFail=false;                init();

for (int i = 1; i <length ; i++) {                if (snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){                    isFail=true;                }            }

下边我们要设置障碍物,同样需要初始化。计算分数增加就不说了比较简单。

    int[]barrierX=new int[50];    int[]barrierY=new int[50];for (int i = 0; i <40 ; i++) {            barrierY[i]=75+75*random.nextInt(8);            barrierX[i]=25+25*random.nextInt(30);        }?//控制障碍物        if (score<50){        for (int i = 0; i <5 ; i++) {            Data.barrier.paintIcon(this,g,barrierX[i],barrierY[i]);        }}        else if (score<100&&score>=50) {            for (int i = 0; i < 10; i++) {                Data.barrier.paintIcon(this, g, barrierX[i], barrierY[i]);            }        }        else if (score>=100&&score<170){            for (int i = 0; i < 15; i++) {                Data.barrier.paintIcon(this, g, barrierX[i], barrierY[i]);}        }        else {            for (int i = 0; i < 20; i++) {                Data.barrier.paintIcon(this, g, barrierX[i], barrierY[i]);}        }//设置障碍物可以动,吃一个食物动一下if (score>=100&&score<170){                    for (int i = 0; i <15 ; i++) {                        barrierX[i]= 25+25*random.nextInt(30);                        barrierY[i]= 75+75*random.nextInt(8);                        }                    }else if (score>=170)                    for (int i = 0; i <20 ; i++) {                        barrierX[i]= 25+25*random.nextInt(30);                        barrierY[i]= 75+75*random.nextInt(8);                       }//设置碰触障碍物死亡 if (score<50) {                for (int i = 0; i < 5; i++) {                    if (snakeX[0] == barrierX[i] && snakeY[0] == barrierY[i]) {                        isFail = true;                    }                }            }else if (score<100&&score>=50){                for (int i = 0; i <10 ; i++) {                    if (snakeX[0] == barrierX[i] && snakeY[0] == barrierY[i]) {                        isFail = true;                }            }}else if (score>=100&&score<170){                for (int i = 0; i <15 ; i++) {                    if (snakeX[0] == barrierX[i] && snakeY[0] == barrierY[i]) {                        isFail = true;                    }                }}else                for (int i = 0; i <20 ; i++) {                    if (snakeX[0] == barrierX[i] && snakeY[0] == barrierY[i]) {                        isFail = true;}}

这样一个简单的项目就算完成了。当然你还可以开发其他的 比如随着分数增加速度变快(为实现)

总结

  1. 动画动起来是用Timer计时器
  2. 控制方向的方法是设置变量,用键盘监听器监听改变变量,在Timer重写方法中说明变量控制的结果。
  3. 将同一资源整合到一个类里边方便阅读

原文地址:https://www.cnblogs.com/ltdh/p/12401945.html

时间: 2024-08-07 07:22:31

自己写贪吃蛇的一下感悟的相关文章

C语言学习必须拥有学习路线,不然你就只会写贪吃蛇

C语言学习必须拥有学习路线,不然你就只会写贪吃蛇这些天一直有人问我,c语言好学吗?我是个新手,该如何学习? 其实,这类问题困扰着很多新手.在如何学习之前,我们想简单的了解一下什么是C语言: C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望

用原生Canvas写贪吃蛇及问题解决

为了学习Canvas,写了这个小游戏贪吃蛇供自己和大家学习 Github: https://github.com/zhiyishou/Gsnake Play On: http://zhiyishou.github.io/Gsnake 游戏截图: 前言: 为了方便加载转移,我把整个js都写在了html里,为了方便阅读,将函数结构在html里清晰地分开, 并在代码里有足够注释. 函数结构如下: |----script |----Definations |----Global Snake variab

pygame写贪吃蛇

python小白尝试写游戏.. 学了点pygame不知道那什么练手好,先拿贪吃蛇开刀吧. 一个游戏可以粗略的分为两个部分: 数据(变量) 处理数据(函数,方法) 设计变量 首先预想下,画面的那些部分需要存储在变量里 整个画面上只会有矩形,而且这些矩形整整齐齐,大小相等,原本一个矩形需要四个变量表示位置,这里,只需要两个变量(行数,列数)就能表示方块的位置 蛇头,食物可以用二元元组表示,蛇身的数量不确定,只能用包含数个元组的列表表示 另外设定窗口大小800x600,每个方块都是50x50 impo

Python入门学习:一步步教你怎么用Python写贪吃蛇游戏

前几天,有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Python(蛇)玩Snake(贪吃蛇),再合适不过了. 这里通过一个Python入门学习的例子跟大家详细讲解一下! 先通过下面这个效果图来感受下吧! 1 环境 操作系统:Windows Python版本:3.7.3 2 需求分析 我们先来回顾下贪吃蛇中的游戏元素及游戏规则. 首先呢,需要有贪吃蛇.有食物:需要能控制贪吃蛇来上下移动获取食物:贪吃蛇在吃取食物后,自身长度增加,同时食物消

13行js写贪吃蛇游戏

先上源码,版本是ES6 13行常规(700bytes) shortest snake game.html 压缩后的500bytes(当然两处document还是可以用eval压缩的) index.500bytes.html 之前很火的20行代码地址(有BUG)(900bytes) hj7jay/article/details/51011269 一维数组700char (0,0)位置的蛇身用0表示,(0,1)用1,(1,0)用10表示,以此类推 因为就13行js, 第4行 是声明 第5行 比较难理

python写贪吃蛇小游戏

python的pygame模块写的. 运行界面: # 没搞素材,丑了点 身体跟随蛇头的实现思路: 1. 通过双向链表+两个标志. 链表是为了,蛇头改变方向后,告诉后一个身体,移动后跟着主蛇方向改变,之后身体在告诉后一个身体,跟随前一个身体方向改变. 两个标志(start_flag,change_flag)是为了,每一帧依次改变方向,而不是一个帧内就循环告诉完全部身体方向改变. 2. 加上两个标志,只记录一次前者方向,那么主体发生连续两次改变会出现的情况 解决方式:身体有存前者改变方向的列表 #

java 简单贪吃蛇

说了是简单版贪吃蛇... 就3个类+方向枚举变量(本来想写贪吃蛇斜着走的..想象我的蛇是矩形 斜着难看就没写) 上下左右键控制移动 空格暂停 SnackClient类 package com.xynu.snaker; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListene

小项目特供 贪吃蛇游戏(基于C语言)

C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第二天写了第二版和第三版. 相信C语言写个小游戏或小项目是大多数计算机相关专业的学生都做的事情,但是作为一个数学专业的学生,我们教研室的老师对C语言的要求也就比较低了,大一没有让我们做个小项目实践一次.至今为止用C/C++做过的三个小项目(大作业),一个是外校同学让我帮忙写的学生信息管理系统(天呐,这

数据结构大作业-贪吃蛇

这次数据结构课程我的大作业选择的是贪吃蛇,最初我想了很久到底用什么语言来写贪吃蛇,最后想到java实现图形界面是最方便的,因为JDK里已经有AWT和SWING两个类可以实现图形界面,C语言我会用一个叫easyX的图形库,但是我感觉这个图形库用起来挺麻烦的,c++的话,我还不会用QT,MFC,之类的.这个课程供我们选择的就只有这三门语言,最后我选择了java. 由于我是这学期刚学的java,而且一个星期只有一节java课,一共只学了只有七八周的样子,所以java学的不怎么精,对有些类的理解其实我的