标题:[分享]我写的贪吃蛇,大家可以看一下
只看楼主
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
结帖率:0
 问题点数:0 回复次数:92 
[分享]我写的贪吃蛇,大家可以看一下
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入
/*
* 此类是贪吃蛇的简单实现方法
* 自己可以加入在开始时的设置,比如
* 选关,初始的蛇的长度等等
* 作者:千里冰封
* 日期:2006年6月25日15:47
*/
public class Snake extends JPanel{
private Direction dir;//要走的方向
private int blockWidth=10;//块大小
private int blockSpace=2;//块之间的间隔
private long sleepTime;//重画的进间间隔
private MySnake my;
private int total;//代表蛇的长度
private Rectangle food;//代表蛇的食物
private volatile boolean go;
private int round;//表示第几关
public Snake(JFrame jf){
initOther();
//为顶级窗口类JFrame添加事件处理函数
jf.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent ke){
int code=ke.getKeyCode();
if(code==KeyEvent.VK_RIGHT){
if(dir!=Direction.WEST)
dir=Direction.EAST;
}

else if(code==KeyEvent.VK_LEFT){
if(dir!=Direction.EAST)
dir=Direction.WEST;
}

else if(code==KeyEvent.VK_UP){
if(dir!=Direction.SOUTH)
dir=Direction.NORTH;
}

else if(code==KeyEvent.VK_DOWN){
if(dir!=Direction.NORTH)
dir=Direction.SOUTH;
}
else if(code==KeyEvent.VK_ENTER){
if(!go)
initOther();
}
}
});
this.setBounds(300,300,400,400);
this.setVisible(true);
}
//随机生成一个食物的位置
private void makeFood(){
int x=40+(int)(random()*30)*12;
int y=10+(int)(random()*30)*12;
food=new Rectangle(x,y,10,10);
}
//做一些初始化的工作
private void initOther(){
dir=Direction.EAST;
sleepTime=500;
my=new MySnake();
makeFood();
total=3;
round=1;
new Thread(new Runnable(){
public void run(){
go=true;
while(go){
try{
Thread.sleep(sleepTime);
repaint();
}
catch(Exception exe){
exe.printStackTrace();
}
}
}
}).start();
}
//处理多少关的函数
private void handleRound(){
if(total==6){
round=2;
sleepTime=300;
}
else if(total==10){
round=3;
sleepTime=200;
}
else if(total==15){
round=4;
sleepTime=100;
}
else if(total==18){
round=5;
sleepTime=50;
}
else if(total==20){
round=6;
sleepTime=20;
}
else if(total>21){
round=7;
sleepTime=15;
}
}
//把自己的组件全部画出来
public void paintComponent(Graphics g){
g.setColor(Color.PINK);
g.fillRect(0,0,this.getWidth(),this.getHeight());
g.setColor(Color.BLACK);
g.drawRect(40,10,358,360);
if(go){
my.move();
my.draw(g);
g.setFont(new Font("黑体",Font.BOLD,20));
g.drawString("您的得分:"+(total*10)+" 第"+round+"关",40,400);
}
else{
g.setFont(new Font("黑体",Font.BOLD,20));
g.drawString("游戏结束,按回车(ENTER)键重玩!",40,440);
}
g.setColor(Color.RED);
g.fillRect(food.x,food.y,food.width,food.height);
}
private class MySnake{
private ArrayList<Rectangle> list;
public MySnake(){
list=new ArrayList<Rectangle>();
list.add(new Rectangle(160+24,130,10,10));
list.add(new Rectangle(160+12,130,10,10));
list.add(new Rectangle(160,130,10,10));
}
//蛇移动的方法
public void move(){
if(isDead()){
go=false;
return;
}
if(dir==Direction.EAST){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x+(blockWidth+blockSpace),rec.y,rec.width,rec.height);
list.add(0,rec1);
}
else if(dir==Direction.WEST){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x-(blockWidth+blockSpace),rec.y,rec.width,rec.height);
list.add(0,rec1);
}
else if(dir==Direction.NORTH){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x,rec.y-(blockWidth+blockSpace),rec.width,rec.height);
list.add(0,rec1);
}
else if(dir==Direction.SOUTH){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x,rec.y+(blockWidth+blockSpace),rec.width,rec.height);
list.add(0,rec1);
}
if(isEat()){
handleRound();
makeFood();
}
else{
list.remove(list.size()-1);
}

}
//判断是否吃到了食物
private boolean isEat(){
if(list.get(0).contains(food)){
total++;
return true;
}
else
return false;
}
//判断是否死了,如果碰壁或者自己吃到自己都算死了
private boolean isDead(){
Rectangle temp=list.get(0);
if(dir==Direction.EAST){
if(temp.x==388)
return true;
else{
Rectangle comp=new Rectangle(temp.x+12,temp.y,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else if(dir==Direction.WEST){
if(temp.x==40)
return true;
else {
Rectangle comp=new Rectangle(temp.x-12,temp.y,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else if(dir==Direction.NORTH){
if(temp.y==10)
return true;
else{
Rectangle comp=new Rectangle(temp.x,temp.y-12,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else if(dir==Direction.SOUTH){
if(temp.y==358)
return true;
else{
Rectangle comp=new Rectangle(temp.x,temp.y+12,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else{
return false;
}
}
//把自己画出来
public void draw(Graphics g){
for(Rectangle rec:list){
g.fillRect(rec.x,rec.y,rec.width,rec.height);
}
}

}
public static void main(String arsg[]){
JFrame jf=new JFrame("贪吃蛇");
Snake s=new Snake(jf);
jf.getContentPane().add(s,BorderLayout.CENTER);
jf.setBounds(300,300,500,500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//定义一个枚举,在此也可以用接口或者常量值代替
enum Direction{
EAST,
SOUTH,
WEST,
NORTH;
}
搜索更多相关主题的帖子: 贪吃 分享 
2006-06-25 15:48
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
此程序必须在JDK1.5或者以上的版本编译才能通过,1.5以下的就不要试了
因为里面用了很多新的东西
比如,静态导入,范型,增强的for循环,枚举等,都是1.5新加的功能

可惜不是你,陪我到最后
2006-06-25 15:50
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
Xw3sBPHr.rar (2.41 KB) [分享]我写的贪吃蛇,大家可以看一下


这个是Snake.java文件的打包版本,免得复制粘帖很麻烦

可惜不是你,陪我到最后
2006-06-25 15:52
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
贴个截图出来瞧瞧?

http://myajax95./
2006-06-25 15:53
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
很简单的,也是刚刚写的,因为最近论坛上经常有人问到有关贪吃蛇的问题
干脆写个出来,大家一起参考一下,欢迎大家提意见


可惜不是你,陪我到最后
2006-06-25 16:08
private
Rank: 1
等 级:新手上路
帖 子:110
专家分:0
注 册:2006-5-1
得分:0 
不错给人的感觉 很流畅。

2006-06-25 16:15
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
不错不错,麻雀虽小,五脏俱全。

http://myajax95./
2006-06-25 16:16
水影月圆
Rank: 4
等 级:贵宾
威 望:11
帖 子:738
专家分:0
注 册:2005-8-2
得分:0 

哎 被你抢了一步 我还没写完 我才写到怎么让蛇给倒着走 而不用切换方向来控制
那我就不急着搞这个了 先放放 手上事太多


子非鱼,安知鱼之江湖?子非我,安知我之功夫 http://20681.
2006-06-25 16:17
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
其实谁写都一样,主要是大家一起交流一下.
对于初学者来说有一定的帮助就可以了

可惜不是你,陪我到最后
2006-06-25 16:22
水影月圆
Rank: 4
等 级:贵宾
威 望:11
帖 子:738
专家分:0
注 册:2005-8-2
得分:0 
是啊 不过你的这个有的问题 运行后我要点下才能进入画面 不知道是不是我这的问题

子非鱼,安知鱼之江湖?子非我,安知我之功夫 http://20681.
2006-06-25 16:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-74716-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.738632 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved