java源代码:贪吃蛇Java源代码的实现



/**************************************************************************
*文件名:GreedSnake.java
*作者:C.Jason
*要点分析:
*1)主要部分已经集成为个对象SnakeModel利用键盘控制实现操作
*************************************************************************/
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
//=============================================
//MainClass
//=============================================
publicGreedSnakeimplementsKeyListener
{
JFrameFrame;
CanvaspaCanvas;
JLabellabelScore;//计分牌
SnakeModelsnakeModel=null;//蛇
publicfinalcanvasWidth=200;
publicfinalcanvasHeight=300;
publicfinalnodeWidth=10;
publicfinalnodeHeight=10;
//----------------------------------------------------------------------
//GreedSnake:化游戏界面
//----------------------------------------------------------------------
publicGreedSnake
{
//设置界面元素
Frame=JFrame(’GreedSnake’);
Containercp=Frame.getContentPane;
labelScore=JLabel(’Score:’);
cp.add(labelScore,BorderLayout.NORTH);
paCanvas=Canvas;
paCanvas.Size(canvasWidth+1,canvasHeight+1);
paCanvas.addKeyListener(this);
cp.add(paCanvas,BorderLayout.CENTER);
JPanelpanelButtom=JPanel;
panelButtom.Layout(BorderLayout);
JLabellabelHelp;//帮助信息
labelHelp=JLabel(’PageUp,PageDownforspeed;’,JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.NORTH);
labelHelp=JLabel(’ENTERorRorSforstart;’,JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.CENTER);
labelHelp=JLabel(’SPACEorPforpause’,JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.SOUTH);
cp.add(panelButtom,BorderLayout.SOUTH);
Frame.addKeyListener(this);
Frame.pack;
Frame.Resizable(false);
Frame.DefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame.Visible(true);
begin;
}
//----------------------------------------------------------------------
//keyPressed:按键检测
//----------------------------------------------------------------------
publicvoidkeyPressed(KeyEvente)
{
keyCode=e.getKeyCode; [Page]
(snakeModel.running)switch(keyCode)
{
KeyEvent.VK_UP:
snakeModel.changeDirection(SnakeModel.UP);
;
KeyEvent.VK_DOWN:
snakeModel.changeDirection(SnakeModel.DOWN);
;
KeyEvent.VK_LEFT:
snakeModel.changeDirection(SnakeModel.LEFT);
;
KeyEvent.VK_RIGHT:
snakeModel.changeDirection(SnakeModel.RIGHT);
;
KeyEvent.VK_ADD:
KeyEvent.VK_PAGE_UP:
snakeModel.speedUp;//加速
;
KeyEvent.VK_SUBTRACT:
KeyEvent.VK_PAGE_DOWN:
snakeModel.speedDown;//减速
;
KeyEvent.VK_SPACE:
KeyEvent.VK_P:
snakeModel.changePauseState;//暂停或继续
;
default:
}
//重新开始
(keyCodeKeyEvent.VK_R||keyCodeKeyEvent.VK_S
||keyCodeKeyEvent.VK_ENTER)
{
snakeModel.running=false;
begin;
}
}
//----------------------------------------------------------------------
//keyReleased():空
//----------------------------------------------------------------------
publicvoidkeyReleased(KeyEvente)
{
}
//----------------------------------------------------------------------
//keyTyped():空
//----------------------------------------------------------------------
publicvoidkeyTyped(KeyEvente)
{
}
//----------------------------------------------------------------------
//repa():绘制游戏界面(包括蛇和食物)
//----------------------------------------------------------------------
voidrepa
{
Graphicsg=paCanvas.getGraphics;
//drawbackground
g.Color(Color.WHITE);
g.fillRect(0,0,canvasWidth,canvasHeight);
//drawthesnake
g.Color(Color.BLACK);
LinkedListna=snakeModel.nodeArray;
Iteratorit=na.iterator;
while(it.hasNext)
{
Noden=(Node)it.next;
drawNode(g,n);
}
//drawthefood
g.Color(Color.RED);
Noden=snakeModel.food;
drawNode(g,n);
updateScore;
}
//----------------------------------------------------------------------


//drawNode():绘画某结点(蛇身或食物)
//----------------------------------------------------------------------
privatevoiddrawNode(Graphicsg,Noden)
{
g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);
}
//----------------------------------------------------------------------
//updateScore():改变计分牌
//----------------------------------------------------------------------
publicvoidupdateScore
{
Strings=’Score:’+snakeModel.score; [Page]
labelScore.Text(s);
}
//----------------------------------------------------------------------
//begin():游戏开始放置贪吃蛇
//----------------------------------------------------------------------
voidbegin
{
(snakeModelnull||!snakeModel.running)
{
snakeModel=SnakeModel(this,canvasWidth/nodeWidth,
this.canvasHeight/nodeHeight);
(Thread(snakeModel)).start;
}
}
//----------------------------------------------------------------------
//():主
//----------------------------------------------------------------------
publicvoid(Stringargs)
{
GreedSnakegs=GreedSnake;
}
}
/**************************************************************************
*文件名:SnakeModel.java
*作者:C.Jason
*要点分析:
*1)数据结构:matrix用来存储地图上面信息如果什么也没有设置为false
*如果有食物或蛇设置为true;nodeArray个LinkedList用来保存蛇
*节;food用来保存食物位置;而Node类是保存每个位置信息
*2)重要:
*changeDirection(Direction)用来改变蛇前进方向而且只是
*保存头部前进方向其他前进方向已经用位置来指明了其中Direction
*必须和原来direction不是相反方向所以相反方向值用了同样奇偶性在测试
*时候使用了direction%2!=Direction%2进行判断
*moveOn,用来更新蛇位置对于当前方向把头部位置进行相应改变如果越界
*结束;否则检测是否遇到食物(加头部)或身体(结束);如果什么都没有加上头部
*去掉尾部由于用了LinkedList数据结构省去了相当多麻烦
*************************************************************************/
importjava.util.*;
importjavax.swing.*;
//----------------------------------------------------------------------
//Node:结点类
//----------------------------------------------------------------------
Node
{
x;
y;
Node(x,y)
{
this.x=x;
this.y=y;
}
}
//----------------------------------------------------------------------
//SnakeModel:贪吃蛇模型
//----------------------------------------------------------------------
SnakeModelimplementsRunnable
{
GreedSnakegs;
booleanmatrix;//界面数据保存在
LinkedListnodeArray=LinkedList;
Nodefood;
maxX;//最大宽度
maxY;//最大长度
direction=2;//方向
booleanrunning=false;
timeInterval=200;//间隔时间(速度)
doublespeedChangeRate=0.75;//速度改变程度 [Page]
booleanpaused=false;//游戏状态
score=0;
countMove=0;
//UP和DOWN是偶数RIGHT和LEFT是奇数
publicfinalUP=2;
publicfinalDOWN=4;
publicfinalLEFT=1;
publicfinalRIGHT=3;
//----------------------------------------------------------------------
//GreedModel:化界面
//----------------------------------------------------------------------
publicSnakeModel(GreedSnakegs,maxX,maxY)
{
this.gs=gs;
this.maxX=maxX;
this.maxY=maxY;
matrix=boolean[maxX];
for(i=0;i<maxX;i)
{
matrix[i]=boolean[maxY];
Arrays.fill(matrix[i],false);//没有蛇和食物地区置false
}
//化贪吃蛇
initArrayLength=maxX>20?10:maxX/2;
for(i=0;i<initArrayLength;i)
{
x=maxX/2+i;
y=maxY/2;
nodeArray.addLast(Node(x,y));
matrix[x][y]=true;//蛇身处置true
}
food=createFood;
matrix[food.x][food.y]=true;//食物处置true
}
//----------------------------------------------------------------------
//changeDirection:改变运动方向
//----------------------------------------------------------------------
publicvoidchangeDirection(Direction)
{
(direction%2!=Direction%2)//避免冲突
{
direction=Direction;
}
}
//----------------------------------------------------------------------
//moveOn:贪吃蛇运动
//----------------------------------------------------------------------


publicbooleanmoveOn
{
Noden=(Node)nodeArray.getFirst;
x=n.x;
y=n.y;
switch(direction)
{
UP:
y--;
;
DOWN:
y;
;
LEFT:
x--;
;
RIGHT:
x;
;
}
((0<=x&&x<maxX)&&(0<=y&&y<maxY))
{
(matrix[x][y])//吃到食物或者撞到身体
{
(xfood.x&&yfood.y)//吃到食物
{
nodeArray.addFirst(food);//在头部加上结点
//计分规则和移动长度和速度有关
scoreGet=(10000-200*countMove)/timeInterval;
scorescoreGet>0?scoreGet:10;
countMove=0;
food=createFood;
matrix[food.x][food.y]=true;
true;
}
false;//撞到身体
}
//什么都没有碰到
{
nodeArray.addFirst(Node(x,y));//加上头部
matrix[x][y]=true;
n=(Node)nodeArray.removeLast;//去掉尾部
matrix[n.x][n.y]=false; [Page]
countMove;
true;
}
}
false;//越界(撞到墙壁)
}
//----------------------------------------------------------------------
//run:贪吃蛇运动线程
//----------------------------------------------------------------------
publicvoidrun
{
running=true;
while(running)
{
try
{
Thread.sleep(timeInterval);
}catch(Exceptione)
{
;
}
(!paused)
{
(moveOn)//未结束
{
gs.repa;
}
//游戏结束
{
JOptionPane.showMessageDialog(null,’GAMEOVER’,
’GameOver’,JOptionPane.INFORMATION_MESSAGE);
;
}
}
}
running=false;
}
//----------------------------------------------------------------------
//createFood:生成食物及放置地点
//----------------------------------------------------------------------
privateNodecreateFood
{
x=0;
y=0;
do
{
Randomr=Random;
x=r.nextInt(maxX);
y=r.nextInt(maxY);
}while(matrix[x][y]);
Node(x,y);
}
//----------------------------------------------------------------------
//speedUp:加快蛇运动速度
//----------------------------------------------------------------------
publicvoidspeedUp
{
timeInterval*=speedChangeRate;
}
//----------------------------------------------------------------------
//speedDown:放慢蛇运动速度
//----------------------------------------------------------------------
publicvoidspeedDown
{
timeInterval/=speedChangeRate;
}
//----------------------------------------------------------------------
//changePauseState:改变游戏状态(暂停或继续)
//----------------------------------------------------------------------
publicvoidchangePauseState
{
paused=!paused;
}
}
Tags:  java游戏源代码 java计算器源代码 java源代码

延伸阅读

最新评论

发表评论