帮忙给个java游戏源程序。

这是一个贪吃蛇程序,仅供参考(多给点分,代码注释很详细,100分够了):

/**************************************************************************

*关键点分析:

*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()

{

暂停了=!暂停;

}

}