自己用java一个贪吃蛇,但有两个小问题,希望大神解答

我使用java和swing编写了一个贪吃蛇的程序,可以顺利运行,但有两个小问题,一直不知道如何解决。第一个是当蛇吃到随机出来的点时,蛇的长度会加1,但蛇身后面会出来一个
新的点,随着蛇移动蛇身的距离而消失;第二个问题是有时候运行游戏会不能控制,希望大神费心解答一下。

package game;

import java.awt.Color;

public class SnakeNode {//定义蛇身集合中的各个元素点
    private int x;
    private int y;
    private Color color;
    public SnakeNode() {
        super();
        // TODO Auto-generated constructor stub
    }
    public SnakeNode(int x, int y, Color color) {
        super();
        this.x = x;
        this.y = y;
        this.color = color;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public Color getColor() {
        return color;
    }
    public void setColor(Color color) {
        this.color = color;
    }



}

 package game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Random;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MainGame extends JPanel{
    private final int length = 20;//定义画板的长
    private final int width = 30;//定义画板的宽
    private final int unit = 20;//定义单位长度
    private ArrayList<SnakeNode> snake = new ArrayList<>();//定义蛇身的集合
    private int Direction;//定义蛇头的方向
    private int Length ;//定义蛇身的长度
    private SnakeNode newNode = new SnakeNode(1,1,Color.BLACK);//定义随机点
    Timer time = new Timer(100,new ThingsListener());

    public int getDirection() {
        return Direction;
    }

    public void setDirection(int direction) {
        Direction = direction;
    }

    public int getLength() {
        return Length;
    }

    public void setLength(int length) {
        Length = length;
    }

    public SnakeNode getNewNode() {
        return newNode;
    }

    public void setNewNode(SnakeNode newNode) {
        this.newNode = newNode;
    }

    public MainGame() {//初始化各项数据与方法
        snake.add(new SnakeNode(width/2,length/2,Color.GREEN));
        snake.add(new SnakeNode(width/2,length/2,Color.BLUE));
        snake.add(new SnakeNode(width/2,length/2,Color.RED));

        Direction = 1;//定义初始方向为向上
        Length = 3;//蛇身长度为3
        CreateNode();//产生随机点

        this.addKeyListener(new KeyAdapter() {//捕捉键盘的按键事件
            public void keyPressed(KeyEvent e) {
                int direction = 0;//定义一个按下按钮后要去的方向
                switch(e.getKeyCode()) {
                    case KeyEvent.VK_UP://按下向上,返回1
                        direction = 1;
                        break;
                    case KeyEvent.VK_DOWN://按下向下,返回-1
                        direction = -1;
                        break;
                    case KeyEvent.VK_LEFT://按下相左,返回2
                        direction = 2;
                        break;
                    case KeyEvent.VK_RIGHT://按下向右,返回-2
                        direction = -2;
                        break;
                    default:
                        break;
                }
                if(direction + Direction !=0) {//不能反向运动
                    Direction = direction;
                    Move(direction);
                    repaint();
                }
            }
        });
        time.start();

    }
    public void Move(int direction) {//定义蛇身移动的方法
        int FirstX = snake.get(0).getX();//获取蛇第一个点
        int FirstY = snake.get(0).getY();//获取蛇第二个点

        switch(direction) {
            case 1:
                FirstY--;
                break;
            case -1:
                FirstY++;
                break;
            case 2:
                FirstX--;
                break;
            case -2:
                FirstX++;
                break;
            default:
                break;
        }

        if(FirstX == newNode.getX()&&FirstY == newNode.getY()) {//当碰到随机点时
            getNode();
            repaint();
        }

        for(int x = 0; x < Length; x++) {//当碰到蛇身自己时
            if((FirstX==snake.get(x).getX())&&(FirstY == snake.get(x).getY())) {
                Dead("你碰到自己啦~~~");
            }
        }

        if(FirstX < 0 || FirstX > width -1 || FirstY < 0 || FirstY > length -1) {
            Dead("菜鸡,你撞墙啦~~~~~");
        }



        for(int x = Length - 1; x > 0; x--) {
            snake.get(x).setX(snake.get(x-1).getX());
            snake.get(x).setY(snake.get(x-1).getY());
        }
        snake.get(0).setX(FirstX);
        snake.get(0).setY(FirstY);
        repaint();
    }

    public void getNode() {
        SnakeNode addNode = new SnakeNode(newNode.getX(),newNode.getY(),newNode.getColor());
        snake.add(addNode);
        Length++;
        for(int x = Length-1; x >0; x--) {
            snake.get(x).setX(snake.get(x-1).getX());
            snake.get(x).setY(snake.get(x-1).getY());
            snake.get(x).setColor(snake.get(x-1).getColor());
        }
        snake.get(0).setX(addNode.getX());
        snake.get(0).setY(addNode.getY());
        snake.get(0).setColor(addNode.getColor());
        CreateNode();
        repaint();


    }

    public void Dead(String s) {
        Date date = new Date();
        SimpleDateFormat sd = new SimpleDateFormat();
        String str2 = sd.format(date);
        String str = s +"\n" +"所以说游戏不得已将结束了";
        JOptionPane.showMessageDialog(this, str2 + "\n" + str   );
        System.exit(0);
    }

    public void CreateNode() {//创造随机点的方法
        int newX = 0;
        int newY = 0;
        Boolean flag = true;
        while(flag) {
        newX = new Random().nextInt(width);
        newY = new Random().nextInt(length);

        for(int i = 0; i < Length; i++) {
            if(snake.get(i).getX()==newX && snake.get(i).getY()==newY) {
                flag = true;
                break;
            }
                flag= false;
            }
        }

        Color color = new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255));
        newNode.setX(newX);
        newNode.setY(newY);
        newNode.setColor(color);
        snake.get(0).setColor(newNode.getColor());

    }

    class ThingsListener implements ActionListener {//设置一个监听器事件
        public void actionPerformed(ActionEvent e) {
            Move(Direction);
            repaint();
        }
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(newNode.getColor());
        g.fillOval(newNode.getX()*unit, newNode.getY()*unit, unit, unit);
        g.setColor(newNode.getColor());
        g.drawRect(0, 0, width*unit, length*unit);
        for(int x = 0; x < Length; x++) {
            g.setColor(snake.get(x).getColor());
            g.fillOval(snake.get(x).getX()*unit, snake.get(x).getY()*unit, unit, unit);
        }

    }




}

 package game;

import java.awt.Color;

import javax.swing.JFrame;

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame("贪吃蛇————————————made by chenjiaheng");
        frame.setBackground(Color.white);
        frame.setBounds(0,0,800,500);
        MainGame sn = new MainGame();
        frame.add(sn);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        sn.requestFocus();
    }

}

2个回答

此题目我已解决,谢谢大家的帮助。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
两个小问题。求大神解答
请问rn1.我想获得Linux的发行版信息,例如我这个a.out在RHEL上运行的时候是red hat xxxxx 6.x,而在Centos和debian分别是Centos 6.x 和deban 7.x。就是获得两个信息,第一是发行商名称,第二个是发行版本。别跟我说sys/utsname.h的uname。我要的是发行版信息,不是内核信息和主机名硬件平台啥的。rn2.我想知道怎么实现clear的功能,别说用ANSI的\e[2j。我试过了,效果不一样。
JAVA初学者的一个小问题,求大神解答
![图片说明](https://img-ask.csdn.net/upload/201603/02/1456908822_814438.png)n执行完System.out.println("lime");这句后为什么没有换行?n新人,望大神勿喷
求大神解答!!!一个小问题
程序如下:rn<% rn Set rs1=Server.CreateObject("adodb.recordset")rn[color=#993300] sql="select * from category where id="&request("id")[/color]rn rs1.open sql,conn,1,1 %>rn rn 新闻列表首页-<%=rs1("category")%>rn rn rn 首页rn <% set rs=server.CreateObject("adodb.recordset")rn sql="select * from category"rn rs.open sql,conn,1,1rn while not rs.eofrn %>rn ><%=rs("category") %>rn <% rs.movenextrn wendrn rs.closern %>rn 联系我们rn rn rn 新闻列表 -><%=rs1("category")%>rn <%rn page=cint(request("page"))rn if page=""thenrn page=1rn end ifrn mypagesize =8rn Set rs=server.CreateObject("adodb.recordset")rn [color=#993300] sql="select * from news where categoryid="&id &" order by id desc"[/color]rn rs.open sql,conn,1,1rn rs.pagesize=mypagesizern pages=cint(rs.pagecount)rn if page<1 or page> pages thenrn page=1rn end ifrn rs.absolutepage=page %>rn rn rn 标题 添加时间rn 点击次数rn rn <% for i=1 to rs.pagesize %>rn rn "target="_blank"><%=rs("title") %>rn <%=rs("addtime")%>rn <%=rs("hits")%>rn <%rn rs.movenextrn if rs.eof thenrn exit forrn end ifrn nextrn rs.close %>rn rn rn 一共<%=pages %>页,每页<%=mypagesize %>条 rn <% rn if pages>1 and page>1 thenrn Response.Write("第一页 ")rn end ifrn if page>1 and pages>1 thenrn Response.Write("上一页 ")rn end ifrn if page1 thenrn Response.Write("下一页 ")rn end ifrn if page1 thenrn Response.Write("尾页 ")rn end if %>rn rn问题为:rn[color=#993300]Microsoft Access Database Engine 错误 '80040e14'rnrn语法错误 (操作符丢失) 在查询表达式 'categoryid=' 中。[/color]rnrn求大神解答rnrnrnrn
两个Javascript的小问题,希望大家给予解答
问题一:rn在页面上有一个多选框和一个按钮rn rnrnrnrn如何实现一次全部删除多选框中的值?rnrn问题二:rn在页面上有一个iframe和一个按钮rn rnrn rnrnrn如何实现将iframe中页面的值清空?我用如下语句不行:rndocument.frames.message.document.body.innertHTML = "";
小问题 希望得到解答!
如何在dreamweaver 中控制窗体的大小?等待哪位高手的回答 谢谢!!!
java 中碰到的小问题 求大神解答
/*从键盘读入学生成绩,找出最高分,并输出学生成绩等级。rn 成绩>=最高分-10 等级为’A’ 成绩>=最高分-20 等级为’B’rn 成绩>=最高分-30 等级为’C’ 其余 等级为’D’rn*/rnrnimport java.util.Scanner;rnclass Fault rn public static void main(String[] args) rn Scanner s=new Scanner(System.in);rn System.out.println("请输入学生个数:");rn int count=s.nextInt(); rn int []scores=new int[count];rn for (int i=0;imaxscore)rn maxscore=scores[i];rn rn rn rn System.out.println("最高分为:"+maxscore);rn rn char level;rn for (int i=0;i=maxscore-10)rn level='A';rnrn rn else if (scores[i]>=maxscore-20)rn level='B';rnrn rn else if (scores[i]>=maxscore-30)rn level='C';rnrn rn rn else level='D';rn rn rn rnrnrn rn rnSystem.out.println("student"+i+"score is"+scores[i]+"grade is"+level);rnrnrnrnrn rnrn[img=https://img-bbs.csdn.net/upload/201610/11/1476151884_285248.png][/img]rn问题:我明明声明了变量maxscore,为什么结果说找不到maxscore
关于StringBuffer的一个小问题,希望解答下!
如图,就是提示出错,本来不就是一个类吗,它就是不认识啊[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/35.gif][/img]怎么回事啊?rn 事先也问了度娘,说的都是它们之间的用法,所以来问问大家,还有最重要的,中秋快乐!!![img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/16.gif][/img]rnrn[img=https://img-bbs.csdn.net/upload/201710/04/1507125813_994576.jpg][/img]
遇到的一个小问题,希望高手能解答
想使用map容器记录连续几个时间段的消息,但是map容器的键是不可以修改的,c++中有没有键和值都可以修改的东西,我想用一个“键”来存时间作标志,不断变化
一个小问题,希望各位大虾给予解答
从一个框架网页通过reidrect跳转到无框架的网页,现在我想从无框架的网页通过redirect返回到有框架的网页,不知则么做??????
一个程序的小问题,希望得到解答~
#include rnusing namespace std;rnrnint main()rnrn int a = -1;rn int d=1;rn int c=2;rn cout << "~d=" << ~d << endl;rn cout << "~c=" << ~c << endl;rn cout << "~a=" << ~a << endl;rn cout << "a=" << a << endl;rn bool b;rn b = true;rn cout << "b=" << b << endl;rn cout << "!b=" << !b << endl;rnrnrnrn输出后:rn~a=0rn~d=-2rn~c=-3rnrn这是为什么,搞不懂
请教一个小问题,希望高手解答!感激不尽
开发工具bc31,语言是c语言。rn我在程序中打开一个二进制文件。用fopen打开的。rn我在文件末尾追加数据。当数据量大于64k 的时候。就出现文件指针复位问题。文件始终不能大于64k。rn我的目的是形成一个大小可能为2m大小的bin文件。rn如何解决?rn望高手给点建议。rn感激不尽!rn
一个小问题,希望有人能解答!
我在一个商品信息录入窗口的保存按钮的CLICKED事件里有如下代码:rn//rndw_goods.update()rnif SQLCA.sqlcode=0 thenrn messagebox("系统提示!","申请存盘成功!所有修改已经被保存!",information!)rnelsern messagebox("系统错误!","申请存盘失败!请与系统管理员联系!",StopSign!)rnend ifrn//rn但是明明录入窗口的字段没有录入完整(不容许为空),系统也提示了某些字段不能为空的错误,这段代码给我的MESSAGEBOX提示却是存盘成功!rn这是怎么回事啊?rn
菜鸟疑问希望大神解答
// vector_stl3.cpp : 定义控制台应用程序的入口点。rn//rnrn#include "stdafx.h"rn#include rn#include rn#include rn#include rn#include rn#include rn#include rnusing namespace std;rnrnvoid show_strin(const string &str);rnrnchar toLower(char ch) return tolower(ch);rnrnstring& ToLower(string&str);rnrnint main( ) rnrn rn vector letters;rn string plater;rnrn while(cin>>plater&&plater!="quit")rn letters.push_back(plater);rnrn set words;rn transform(plater.begin(),plater.end(),insert_iterator >(words,words.begin()),ToLower);rn cout<d:\vs2010\vc\include\algorithm(1043): error C2664: “std::string &(std::string &)”: 不能将参数 1 从“char”转换为“std::string &”rn1> d:\vs2010\vc\include\algorithm(1069): 参见对正在编译的函数 模板 实例化“_OutIt std::_Transform<_InIt,_OutIt,std::string&(__cdecl *)(std::string &)>(_InIt,_InIt,_OutIt,_Fn1)”的引用rn到底该怎么改菜鸟求大神帮忙谢谢了。
java执行过程(自己的理解,希望大神指点)
1.编译过程:java源程序为.java文件通过编译成.class文件,这里会进行检查错误。 2.执行过程:class文件执行需要JRE, 执行过程为:1.首先创建一个JVM实例,即一个虚拟机进程负责运行.class文件。                        2.JVM进程创建一个Bootloader加载器(类加载器的功能,就是把类从静态的硬盘里(.class文件),复制一份放到内
.NET一个小问题,求大神解答
 搜索rn打开的时候系统提示源代码出现错误,找了半天也没找到。。
this指针的一个小问题,求大神解答下,谢谢。
[code=c]void Dialog::paintEvent(QPaintEvent *e)rnrn QPainter pait(this);//这里加了thisrn pait.drawLine(0,0,100,100);rn QPen mypen(Qt::black);rn mypen.setWidth(6);rnrn QPoint p1;//像这种就没加rn p1.setX(10);rn p1.setY(10);rnrn QPoint p2;rn p2.setY(100);rn/ p2.setX(100);rnrn pait.setPen(mypen);rn pait.drawLine(p1,p2);rnrnrnrn[/code]rn具体都在什么时候加this呢?有的一声明一个他就加了,有的就不加。有没有规律?感觉好迷茫,新手求教。rn还有就是类声明的时候,有的用new声明,有的比如这里的QPoint他就不用new,为什么呢?有规律吗?
求大神解答StringBuilder的一个小问题
package p1.stringbuilder.test;rnrnpublic class StringBuilderTest rn public static void main(String[] args) rnrn StringBuilder s1 = new StringBuilder("hello");rn StringBuilder s2 = new StringBuilder("java");rn rn show(s1,s2);rn System.out.println(s1+"......."+s2);rn rn rnrn private static void show(StringBuilder s1, StringBuilder s2) rn rn s1.append(s2);rn s1 = s2;rnrn rn rnrnrns1输出为什么不是java啊?rn
java 一个小问题,希望明解
return (a>b?((a
问个小问题。希望高手解答
unit unGetFolderContents;rnrninterfacernrnuses SysUtils,Classes,Forms;rnrntypern TFileFoundEvent = procedure (Sender: TObject; Directory: String;rn SearchRec: TSearchRec; var Stop : Boolean) of object;rn TGetFolderContents = class(TThread)rn privatern FOnFound: TFileFoundEvent;rnrn以下为代码rnrnprocedure TGetFolderContents.DoFound;rnbeginrn if Assigned(FOnFound) thenrn beginrn Delete(SRoot,1,Length(FRoot));rn FOnFound(Self, SRoot, Found, FTerminated);rn end;rnend;rnrn请问,我如何才能得到 SRoot ,Found ,FTerminated 的信息
Eclipse小问题求大神解答
学习使用Eclipse在参照书本写基于TCP的socket小实例时遇到服务器java无法在server上运行的问题。因为是初学者,很多问题会很幼稚,请大神们见谅!rn[img=https://img-bbs.csdn.net/upload/201410/26/1414292266_989116.jpg][/img]rn这是服务器代码server.java代码rn放在包里右键点击run on server出现所选选项不包含可以在服务器端运行的资源,如图rn[img=https://img-bbs.csdn.net/upload/201410/26/1414292640_493560.jpg][/img]rn不知道是什么原因,希望能得到大神们指导指导,谢谢各位!
安卓开发 小问题,求大神解答~
[img=https://img-bbs.csdn.net/upload/201607/13/1468400733_829100.png][/img][img=https://img-bbs.csdn.net/upload/201607/13/1468400739_58639.png][/img][img=https://img-bbs.csdn.net/upload/201607/13/1468400744_183685.png][/img]rnrnrn为什么不显示内容,rnrnrnrn 小白一只。
python 小问题,求大神解答
#self.configFile = self.pathToGasp + 'gaspserver/plate-based-assembly-from-ols-pool-config.json'rn rnself.configFile = self.pathToGasp + sys.argv[1];rnrn上面两个语句,我想把路径固定路径改为参数,但是会报错!!表示不知为啥??请大神帮忙啊
SQL 小问题 求大神解答
[img=https://img-bbs.csdn.net/upload/201504/03/1428028466_631651.png][/img]rnrn问题是这样子的 这个表已经生成了 但是我想在VIN 里面添加内容 rnrnrn如是我写了一段代码如下:rnINSERT INTO car_table rn(VIN)rnVALUESrn('RNKLK66N33G213481'),rn('SAED44B175B041123'),rn('3GYEK63NT2G280668');rnrn为什么出现的效果是这样子:rnrn[img=https://img-bbs.csdn.net/upload/201504/03/1428028572_37911.png][/img]rnrn为什么不是就是补全上面的空白区rnrn它为什么另外生成了3行呀 rnrn谢谢
单例设计模式 java 两个小问题 ,求解答
nn```n class ArrayUtilnn nn // 1)必须在该类中,自己创建一个对象nn private final ArrayUtil Instance = new ArrayUtil[];nn //2)私有化自身的构造器,防止外界通过构造器创建新的对象nn private ArrayUtil()nn nn nn //3)向外暴露一个公共的静态方法,用于获取自身的对象。nn Public static ArrayUtil getInstance()nn nn return Instance;nn nn return ArrayUtil;nn nn public void sort(int[] arr)nn nn System.out.println("真是纠结");nn nn nn class SingletonDemonn nn public static void main(String[] args)nn nn Arrayutil.getInstance.sort(null);nn Arrayutil.getInstance.sort(null);nn Arrayutil.getInstance.sort(null);nn Arrayutil.getInstance.sort(null);nn nn nnn```n这个是单例设计模型,有几个猜测想得到确认。nn1. 向外暴露一个公共的静态方法,用于获取自身的对象。是不是说防止调用者过多创建引用,从而导致不必要的浪费呢?nn2. 执行下列语句: class SingletonDemonn nn public static void main(String[] args)nn nn ArrayUtil Instance = new ArrayUtil[];nn nn n为什么我在主方法类中也可以实例化其他类的对象,是我记错了还是说这是一种特殊情况? 请大神解释一下n
qt小问题求大神解答
1> Moc'ing BackgrdScat_thread.h...rn1> 系统找不到指定的路径。rn1> Moc'ing glWidget.h...rn1> 系统找不到指定的路径。rn1> Moc'ing mainwindow.h...rn1> 系统找不到指定的路径。rn1> Moc'ing modtran.h...rn1> 系统找不到指定的路径。rn1> Moc'ing widgetSolar.h...rn1> 系统找不到指定的路径。rn1> Uic'ing mainwindow.ui...rn1> 系统找不到指定的路径。rn1> Uic'ing modtran.ui...rn1> 系统找不到指定的路径。rn1> Uic'ing widget1.ui...rn1> 系统找不到指定的路径。rn1> Rcc'ing mainwindow.qrc...rn1> 系统找不到指定的路径。rn1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): error MSB6006: “cmd.exe”已退出,代码为 3。rn不知道这是什么意思啊
求大神解答这个小问题!
本人win8系统,最近用VS2012,遇到了这样一个问题,ASP.NET尚未在Web服务器上注册。您需要手动将Web服务器配置为使用ASP.NET 4.5,这样您的网站才能正确运行,之前试过网上进cmd运行aspnet_regiis的办法,但是不管用,求各位大神解答一下!
贪吃蛇中的一个小问题
#include rn#include rn#include rn#define N 200rn#define LEFT 0x4b00rn#define RIGHT 0x4d00rn#define DOWN 0x5000rn#define UP 0x4800rn#define Esc 0x011brnint i,key;rnint score = 0; /*得分*/rnint gamespeed = 80000; /*游戏速度可以自己调整*/rnstruct Foodrnrn int x;/*食物的横坐标*/rn int y;/*食物的纵坐标*/rn int yes;/*判断是否要出现食物的变量*/rn food;/*食物的结构体*/rnrnstruct Snakernrn int x[N];rn int y[N];rn int node;/*蛇的节数*/rn int direction;/*蛇的移动方向*/rn int life;/*蛇的生命,0活着,1死亡*/rn snake;rnrn void Init(void);/*图形驱动*/rn void Close(void);/*图形结束*/rn void DrawK(void);/*开始画面*/rn void GameOver(void);/*结束游戏*/rn void GamePlay(void);/*玩游戏的具体过程*/rn void PrScore(void);/*输出成绩*/rnrn /*主函数*/rn void main(void)rn rn Init();/*图形驱动*/rn DrawK();/*开始画面*/rn GamePlay();/*玩游戏的具体过程*/rn Close();/*图形结束*/rn rn /*图形驱动*/rn void Init(void)rn rn int gd=DETECT,gm;rn initgraph(&gd,&gm,"D:\\Win_TC\\projects");rn cleardevice();rn rn /*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/rn void DrawK()rn rn /*setbkcolor(LIGHTGREEN);*/rn setcolor(11);rn setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/rn for(i=50;i<=600;i+=10)/*画围墙*/rn rn rectangle(i,40,i+10,49);/*上边*/rn rectangle(i,451,i+10,460);/*下边*/rn rn for(i=40;i<=450;i+=10)rn rn rectangle(50,i,59,i+10);/*左边*/rn rectangle(601,i,610,i+10);/*右边*/rn rn rnrnrn /*玩游戏的具体过程*/rn void GamePlay(void)rn rn randomize();/*随机数发生器*/rn food.yes=1;/*1表示需要出现新食物,0表示存在食物*/rn snake.life=0;/*活着*/rn snake.direction=1;/*方向向右*/rn snake.x[0]=100;snake.y[0]=100;/*蛇头*/rn snake.x[1]=110;snake.y[1]=100;rn snake.node=2;/*节数*/rn PrScore();/*输出得分*/rn while(1)/*可以重复玩游戏,按Esc键结束*/rn rnrn while(!kbhit()) /*在没有按键的情况下,蛇自己移动身体*/ /*????那kbhit()哪来的?*/rn rn if(food.yes==1)/*需要出现新食物*/rn rn food.x=rand()%400+60;rn food.y=rand()%350+60;rn while(food.x%10!=0)/*食物随机 出现后必须让食物能够在整格内,这样才可以让蛇吃到*/rn food.x++;rn while(food.y%10!=0)rn food.y++;rnrn food.yes=0;/*画面上有食物了*/rn rn if(food.yes==0)/*画面上有食物了就要显示*/rn rn setcolor(GREEN);rn rectangle(food.x,food.y,food.x+10,food.y-10);rn rnrn for(i=snake.node-1;i>0;i--)rn /*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/rn rn snake.x[i]=snake.x[i-1];rn snake.y[i]=snake.y[i-1];rn rnrn /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动 蛇头*/rn switch(snake.direction)rn rnrn case 1: snake.x[0]+=10;break;rn case 2: snake.x[0]-=10;break;rn case 3: snake.y[0]-=10;break;rn case 4: snake.y[0]+=10;break;rnrn rnrn for(i=3;i595||snake.y[0]<55||snake.y[0]>455)/*蛇是否撞到墙了*/rn rnrn GameOver();/*本次游戏结束*/rn snake.life=1;/*蛇死*/rn rnrn if(snake.life==1)/*以上两种后,如果蛇死就跳出内循环,重新开始*/rn break;rnrn if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物后*/rn rnrn setcolor(0);/*把画面上的食物去掉*/rn rectangle(food.x,food.y,food.x+10,food.y-10);rn snake.x[snake.node]=-20; /*??????????问rn snake.y[snake.node]=-20; 题之处???*/rn /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/rn snake.node++;/*蛇的身体长一节*/rn food.yes=1; /*画面上需要出现新的食物*/rn score+=10;rn PrScore();/*输出 新得分*/rn rnrn setcolor(4);/*画出蛇*/rn for(i=0;i
自己用java制作贪吃蛇小游戏
import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; public class snate extends JFrame implements KeyListener,Runnable { JLabel j; Canvas j1; public static final int canvasWidth = 200; public static final int canvasHeight = 300; public static final int nodeWidth = 10; public static final int nodeHeight = 10; //SnakeModel se=null; //222222 // 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 paused = false; int score = 0; int countMove = 0; // UP and DOWN should be even // RIGHT and LEFT should be odd public static final int UP = 2; public static final int DOWN = 4; public static final int LEFT = 1; public static final int RIGHT = 3; snate() { super(); //setSize(500,400); Container c=getContentPane(); j=new JLabel("Score:"); c.add(j,BorderLayout.NORTH); j1=new Canvas(); j1.setSize(canvasWidth+1,canvasHeight+1); j1.addKeyListener(this); c.add(j1,BorderLayout.CENTER); JPanel p1 = new JPanel(); p1.setLayout(new BorderLayout()); JLabel j2; j2 = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER); p1.add(j2, BorderLayout.NORTH); j2 = new JLabel("ENTER or R or S for start;", JLabel.CENTER); p1.add(j2, BorderLayout.CENTER); j2 = new JLabel("SPACE or P for pause",JLabel.CENTER); p1.add(j2, BorderLayout.SOUTH); c.add(p1,BorderLayout.SOUTH); addKeyListener(this); pack(); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); // begin(); // //2222222 // this.gs = gs; this.maxX = maxX; this.maxY = maxY; // initial matirx matrix = new boolean[maxX][]; for(int i=0; i<maxX; ++i){ matrix[i] = new boolean[maxY]; Arrays.fill(matrix[i],false); } // initial the snake int initArrayLength = maxX > 20 ? 10 : maxX/2; for(int i = 0; i < initArrayLength; ++i){ int x = maxX/2+i; int y = maxY/2; nodeArray.addLast(new Node(x, y)); matrix[x][y] = true; } food = createFood(); matrix[food.x][food.y] = true; } public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_UP) { //se.changeDirection(SnakeModel.UP); } if(e.getKeyCode()==KeyEvent.VK_DOWN) { //se.changeDirection(SnakeModel.DOWN); } if(e.getKeyCode()==KeyEvent.VK_LEFT) { //se.changeDirection(SnakeModel.LEFT); } if(e.getKeyCode()==KeyEvent.VK_RIGHT) { //se.changeDirection(SnakeModel.RIGHT); } if(e.getKeyCode()==KeyEvent.VK_R||e.getKeyCode()==KeyEvent.VK_S||e.getKeyCode()==KeyEvent.VK_ENTER) { } } public void keyTyped(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public void repaint() { Graphics g = j1.getGraphics(); //背景 g.setColor(Color.red); g.fillRect(0,0,canvasWidth,canvasHeight); //蛇 //g.setColor(Color.BLUE); } public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(10,10,10,10); } // //222222 // public void changeDirection(int newDirection){ if (direction % 2 != newDirection % 2){ direction = newDirection; } } public boolean moveOn(){ Node n = (Node)nodeArray.getFirst(); int x = n.x; int y = n.y; switch(direction){ case UP: y--; break; case DOWN: y++; break; case LEFT: x--; break; case RIGHT: x++; break; } if ((0 <= x && x < maxX) && (0 <= y && y < maxY)){ if (matrix[x][y]){ if(x == food.x && y == food.y){ nodeArray.addFirst(food); int scoreGet = (10000 - 200 * countMove) / timeInterval; score += scoreGet > 0? scoreGet : 10; countMove = 0; food = createFood(); matrix[food.x][food.y] = true; return true; } else return false; } else{ nodeArray.addFirst(new Node(x,y)); matrix[x][y] = true; n = (Node)nodeArray.removeLast(); matrix[n.x][n.y] = false; countMove++; return true; } } return false; } public void run(){ running = true; while (running){ try{ Thread.sleep(timeInterval); } catch(Exception e){ break; } if(!paused){ if (moveOn()){ gs.repaint(); } else{ JOptionPane.showMessageDialog( null, "you failed", "Game Over", JOptionPane.INFORMATION_MESSAGE); break; } } } running = false; } private Node createFood(){ int x = 0; int y = 0; do{ Random r = new Random(); x = r.nextInt(maxX); y = r.nextInt(maxY); }while(matrix[x][y]); 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 = ""; for(int i=0; i<nodeArray.size(); ++i){ Node n = (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; } } public static void main(String[] args) { //Graphics g=j1.getGraphics(); snate s=new snate(); //s.draw_something(g); //s.setVisible(true); } }
用Java写一个贪吃蛇的游戏,请大神
[img=https://img-bbs.csdn.net/upload/201711/26/1511698653_394000.png][/img]rn这就是开始页面
自己写的一个贪吃蛇
自己感觉写的不是很好,但基本可以用,有不懂的地方可以联系我
自己用js做的一个贪吃蛇小游戏
本人小白一个,刚学js,做了一个贪吃蛇小游戏,可能存在一些小bug。html部分,css部分,js部分都需要自己创一个文件夹,再放进去。-------------------------------------------------------------------------------------------------------------------------------html部...
两个小问题,希望大家指点!
1、除了Application.Run可以让一个窗体运行外,还有什么其它的方法可以做到,我因为引用了Word,它老是报错,说Application是不明确的引用rn2、如何将字符串类型转换为引用类型,在C#对Word编程的时候,老是要求参数是ref类型的,可是我是路径名或者文件名,怎么把它编程引用类型呢?rnrn有谁能告诉我,不甚感激!!
两个小问题,希望高手指点
在VC中的某一子函数中申请以下变量:rnLPCTSTR pChar = new THCAR[10];rnrn在该子函数结尾处用以下语句释放:rndelete[] pChar;会报错;rnrn另外我做了一个自动关机的程序,当调用ExitWindowsEx这个函数时,无法关机后来在MSDN中找到下面的程序样例加入我的代码中就能正常关机了,但我对这段代码不了解,请高手指点.rnrnBOOL MySystemShutdown()rnrn HANDLE hToken; rn TOKEN_PRIVILEGES tkp; rn rn // Get a token for this process. rn rn if (!OpenProcessToken(GetCurrentProcess(), rn TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) rn return( FALSE ); rn rn // Get the LUID for the shutdown privilege. rn rn LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, rn &tkp.Privileges[0].Luid); rn rn tkp.PrivilegeCount = 1; // one privilege to set rn tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; rn rn // Get the shutdown privilege for this process. rn rn AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, rn (PTOKEN_PRIVILEGES)NULL, 0); rn rn if (GetLastError() != ERROR_SUCCESS) rn return FALSE; rn rn // Shut down the system and force all applications to close. rn rn if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) rn return FALSE; rnrn return TRUE;rnrn
java 一个class的两个小问题
public List[color=#FF0000][/color] getAll() throws Exception rn Connection conn = null;rn Statement state = null;rn ResultSet rs = null;rnrn List list = new ArrayList();rn try rn conn = DbUtils.getConn();rn state = conn.createStatement();rn rs = state.executeQuery("select * from contact");rnrn while (rs.next()) rn [color=#FF0000]Contact [/color]contact = new Contact();rn contact.setId(rs.getLong("id"));rn contact.setUsername(rs.getString("username"));rn contact.setSex(rs.getString("sex"));rn contact.setEmail(rs.getString("email"));rn contact.setQq(rs.getString("qq"));rn contact.setDescn(rs.getString("descn"));rnrn list.add(contact);rn rn finally rn DbUtils.close(rs, state, conn);rn rn return list;rnrnrn写红字的地方有些不明白,帮帮忙!
java 求大神解答
public class Usefinrnrn final int a=1;rn int b;rn public void print()rn rn System.out.println("a+b="+a+b);rn rn rn rnrnclass Usefin1rnrn public static void main(String args[] )rn rn Usefin a1=new Usefin();rn a1.b=2;rn a1.print();rn rnrn书上结果为12,自己运行错误为:在类Usefin中找不到住方法
关于vc的两个小问题,希望给与解答,谢谢!!!
1。vc主框架窗口上的叉按钮(也就是关闭按钮)怎么才能去掉。在哪个地方怎么修 改!!!rn2。我做了个多文档的例子,我想要程序启动的时候,不弹出子框架窗口或者说文档,等我选择菜单打开的时候再弹出,应该怎么做呢?
两个小问题,请帮忙解答
(1)为什么以下两个过程都编译不过?rninterfacernprocedure p1(i : ^integer);rnprocedure p2(a : array of integer);rnimplementationrnrnprocedure p1(i : ^integer);rnbeginrn new(i);rnend;rnprocedure p2(a : array of integer);rnbeginrn SetLength(a);rnendrnrnrn(2)DELPHI里的指针能象C++里这么用嘛?rninteger* i;rni = new integer(10);
请帮忙解答两个小问题
1。functor和function有什么区别?在java里怎么实现functor?rnrn2。请帮我讲下callback到底是什么东西?能不能写段java程序分析下,谢谢了~~~~~~~~
两个小问题,请高手解答
第一个:使用TQuery控件进行模糊查询,我知道要使用Like及%,但程序应该按什么格式写?rn第二个:服务器端使用应用服务器中的TQuery控件及TDataSetProvider与远程数据模块中的数据库表相连,客户端使用TClientDataSet控件与应用服务器端的TDataSetProvider控件相连,TDataSetProvider的DateSet属性为TQuery控件,将TClientDataSet控件传递过来的参数提交给TQuery控件进行查询后将数据包返回客户端,小弟编写的程序要对多个字段进行查询,而这几个字段又不一定都参加查询,只有客户端传递过来的参数进行查询,请问如何在SQL语句生成之前查询客户端传递过来的参数个数或SQL语句应该怎么写,让没有值的参数不参加查询。
本人自己用java编写的一个贪吃蛇程序
本人刚刚接触java,这是本人自己用java编写的第一个小程序--贪吃蛇,附上源代码!有需要的同学可以看看
相关热词 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天 c#func链接匿名方法 c#怎么创建文件夹 c#从键盘接收空格 c#da/ad c#部门请假管理系统 c#服务器socket c# 默认的访问修饰符