帮忙给个java游戏源程序。
/**************************************************************************
*关键点分析:
*1)主体部分已经集成为一个object SnakeModel,操作通过键盘控制实现。
*************************************************************************/
导入Java . awt . *;
导入Java . awt . event . *;
导入javax . swing . *;
导入Java . util . *;
//=============================================
//主类
//=============================================
公共类GreedSnake实现KeyListener
{
JFrame主机;
画布paintCanvas
JLabel labelScore//记分卡
SnakeModel snakeModel = null//蛇
public static final int canvas width = 200;
public static final int canvasHeight = 300;
公共静态final int node width = 10;
public static final int nodeHeight = 10;
// -
///GreedSnake():初始化游戏界面。
// -
公共GreedSnake()
{
//设置界面元素
mainFrame = new JFrame(" GreedSnake ");
container CP = mainframe . getcontentpane();
labelScore = new JLabel(" Score:");
cp.add(labelScore,BorderLayout。北);
paintCanvas =新画布();
paint canvas . setsize(canvas width+1,canvas height+1);
paint canvas . addkey listener(this);
cp.add(paintCanvas,BorderLayout。中心);
JPanel panel buttom = new JPanel();
panel buttom . set layout(new BorderLayout());
JLabel labelHelp//帮助信息
labelHelp=new JLabel("PageUp,PageDown表示速度;,JLabel。中心);
panel button . add(label help,BorderLayout。北);
labelHelp=new JLabel("ENTER或R或S表示开始;",JLabel。中心);
panel button . add(label help,BorderLayout。中心);
labelHelp=new JLabel("空格或P表示暂停",JLabel。中心);
panel button . add(label help,BorderLayout。南);
CP . add(panel button,BorderLayout。南);
mainframe . addkey listener(this);
大型机. pack();
mainframe . setresizable(false);
mainframe . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);
mainframe . set visible(true);
begin();
}
// -
//keyPressed():按键检测
// -
公共void按键(按键事件e)
{
int key code = e . get key code();
if(snakeModel.running)开关(键码)
{
案例关键事件。VK_UP:
snake model . change direction(snake model。UP);
打破;
案例关键事件。VK _唐:
snake model . change direction(snake model。向下);
打破;
案例关键事件。VK _左:
snake model . change direction(snake model。左);
打破;
案例关键事件。VK右:
snake model . change direction(snake model。对);
打破;
案例关键事件。VK _添加:
案例关键事件。VK _第_页起:
snake model . speedup();//加速
打破;
案例关键事件。VK减去:
案例关键事件。VK _下一页:
snake model . speeddown();//慢下来
打破;
案例关键事件。VK _空间:
案例关键事件。VK_P:
snake model . changepousestate();//暂停或继续
打破;
默认值:
}
//重新开始
if(keyCode==KeyEvent。VK_R || keyCode==KeyEvent。VK_S
|| keyCode==KeyEvent。VK _回车)
{
snakeModel.running = false
begin();
}
}
// -
//keyReleased():空函数
// -
公开无效密钥释放(密钥事件e)
{
}
// -
//keyTyped():空函数
// -
公共void键入(KeyEvent e)
{
}
// -
//repaint():绘制游戏界面(包括蛇和食物)
// -
void重画()
{
graphics g = paint canvas . get graphics();
//绘制背景
g.setColor(颜色。白色);
g.fillRect(0,0,canvasWidth,canvas height);
//画蛇
g.setColor(颜色。黑色);
linked list na = snake model . node array;
迭代器it = na . iterator();
while(it.hasNext())
{
节点n =(Node)it . next();
drawNode(g,n);
}
//画出食物
g.setColor(颜色。红色);
Node n = snakeModel.food
drawNode(g,n);
update score();
}
// -
//drawNode():绘制一个节点(蛇或食物)
// -
私有void drawNode(图形g,节点n)
{
g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,node height-1);
}
// -
//updateScore():更改记分卡。
// -
公共void updateScore()
{
string s = " Score:"+snake model . Score;
labelScore.setText
}
// -
//begin():游戏开始,放蛇。
// -
void begin()
{
if(snakeModel==null||!snakeModel.running)
{
snakeModel=new SnakeModel(this,canvasWidth/nodeWidth,
this . canvasheight/nodeHeight);
(新线程(snakeModel))。start();
}
}
// -
//main():主函数
// -
公共静态void main(String[] args)
{
GreedSnake GS = new GreedSnake();
}
}
/**************************************************************************
*关键点分析:
*1)数据结构:矩阵[][]用于存储地图上的信息。如果没有设置为假,
*设置为真;如果有食物或蛇;NodeArray是一个LinkedList,用于保存每一条蛇。
*部分;食物用来保存食物的位置;Node类存储每个位置的信息。
*2)重要功能:
* change direction(int new direction),用于改变蛇的方向,并且只有。
*保存头部的方向,因为其他方向已由位置指示。其中,newDirection
*它必须与原始方向不同,所以相反方向的值使用相同的奇偶性。测试
*使用了方向%2!=newDirection%2进行判断。
* moveOn(),用于更新蛇的位置,对于当前方向,头部位置也相应改变。如果你越界了,
*结束;否则,检测是否遇到食物(加头)或身体(尾);如果什么都没有,加上头,
*移除尾部。因为使用了LinkedList数据结构,省去了很多麻烦。
*************************************************************************/
// -
//Node:节点类
// -
类节点
{
int x;
int y;
Node(int x,int y)
{
this.x = x
this.y = y
}
}
// -
//SnakeModel:蛇模型
// -
SnakeModel类实现Runnable
{
GreedSnake gs
布尔[][]矩阵;//接口数据保存在数组中。
linked list node array = new linked list();
节点食物;
int maxX//最大宽度
int maxY//最大长度
int direction = 2;//方向
布尔运行=假;
int timeInterval = 200//间隔时间(速度)
double speedChangeRate = 0.75//速度变化程度
布尔暂停=假;//游戏状态
int得分= 0;
int count move = 0;
//上下是偶数,左右是奇数。
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
// -
//GreedModel():初始化接口
// -
public SnakeModel(GreedSnake gs,int maxX,int maxY)
{
this.gs = gs
this.maxX = maxX
this.maxY = maxY
matrix = new boolean[maxX][];
for(int I = 0;我& ltmaxX++i)
{
matrix[I]= new boolean[maxY];
Arrays.fill(matrix[i],false);//在没有蛇或食物的区域设置false。
}
//初始化Snake
int initArrayLength = maxX & gt20 ?10:maxX/2;
for(int I = 0;我& ltinitArrayLength++i)
{
int x = maxX/2+I;
int y = maxY/2;
nodeArray.addLast(新节点(x,y));
matrix[x][y]= true;//snake处置真
}
food = create food();
matrix[food . x][food . y]= true;//食品处理真
}
// -
//changeDirection():改变运动的方向。
// -
公共void change direction(int new direction)
{
如果(方向%2!=newDirection%2)//避免冲突
{
direction = newDirection
}
}
// -
//moveOn():蛇形运动函数
// -
公共布尔移动()
{
Node n =(Node)Node array . get first();
int x = n.x
int y = n.y
开关(方向)
{
案例向上:
y-;
打破;
案例向下:
y++;
打破;
案例左侧:
x-;
打破;
案例权利:
x++;
打破;
}
如果((0 & lt= x & amp& ampx & ltmaxX)和amp& amp(0 & lty & amp& ampy & ltmaxY))
{
If(matrix[x][y])//吃食物或者打身体。
{
if(x = = food . x & amp;& ampY==food.y)//吃货。
{
nodeArray.addFirst(食物);//在标头中添加一个节点。
//评分规则与移动长度和速度有关。
int score get =(10000-200 * count move)/time interval;
score+= score get & gt;0 ?score get:10;
count move = 0;
food = create food();
matrix[food . x][food . y]= true;
返回true
}
否则返回false//击中身体
}
Else//我什么都没碰
{
nodeArray.addFirst(新节点(x,y));//添加头部
matrix[x][y]= true;
n =(Node)Node array . remove last();//移除尾部
matrix[n . x][n . y]= false;
count move++;
返回true
}
}
返回false//越线(撞墙)
}
// -
//run():蛇形运动线程
// -
公共无效运行()
{
跑步=真;
(跑步时)
{
尝试
{
Thread.sleep(时间间隔);
}catch(异常e)
{
打破;
}
如果(!暂停)
{
If(moveOn())//未完成
{
GS . repaint();
}
否则//游戏结束
{
JOptionPane.showMessageDialog(空,“游戏结束”,
“游戏结束”,JOptionPane。信息_消息);
打破;
}
}
}
跑步=假;
}
// -
//createFood():生成食物并放置。
// -
私有节点createFood()
{
int x = 0;
int y = 0;
做
{
Random r = new Random();
x = r . nextint(maxX);
y = r . nextint(maxY);
} while(matrix[x][y]);
返回新节点(x,y);
}
// -
//speedUp():加快蛇的移动速度。
// -
公共void加速()
{
timeInterval * = speedChangeRate
}
// -
//speedDown():减缓蛇的速度。
// -
公共void减速()
{
time interval/= speed change rate;
}
// -
//changePauseState():改变游戏状态(暂停或继续)
// -
public void changePauseState()
{
暂停了=!暂停;
}
}