Java小游戏示例

贪吃蛇游戏!

包com.hbsi

导入Java . awt . *;

导入Java . awt . event . *;

导入javax . swing . *;

导入Java . util . *;

//主类

公共类GreedSnake扩展KeyAdapter{

JFrame主机;

画布paintCanvas

JLabel labelScore//记分卡

SnakeModel snakeModel = null//蛇

公共静态final int DEFAULT _ WIDTH = 500

公共静态final int DEFAULT _ HEIGHT = 300

公共静态final int node width = 10;

public static final int nodeHeight = 10;

///GreedSnake():初始化游戏界面。

公共GreedSnake(){

//设置界面元素

大型机=新JFrame(《贪吃蛇游戏》);

container CP = mainframe . getcontentpane();

LabelScore=new JLabel("分数是:",JLabel。中心);

cp.add(labelScore,BorderLayout。北);

paintCanvas =新画布();

paint canvas . setsize(DEFAULT _ WIDTH+1,DEFAULT _ 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或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_S || keyCode==KeyEvent。VK _回车){

snakeModel.running = false

begin();

}

}

//repaint():绘制游戏界面(包括蛇和食物)

void repaint(){

graphics g = paint canvas . get graphics();

//绘制背景

g.setColor(颜色。浅_灰色);

g.fillRect(0,0,DEFAULT_WIDTH,DEFAULT _ 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():更改记分卡。

public void updateScore(){

string s = " score为:"+snake model . score;

labelScore.setText

}

//begin():游戏开始,放蛇。

void begin(){

if(snakeModel==null||!snakeModel.running){

snakeModel=new SnakeModel(this,DEFAULT_WIDTH/nodeWidth,

DEFAULT _ HEIGHT/nodeHeight);

(新线程(snakeModel))。start();

}

}

//main():主函数

公共静态void main(String[] args){

GreedSnake GS = new GreedSnake();

}

}

//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():改变运动的方向。

public void change direction(int new direction){

如果(方向%2!=newDirection%2){//避免冲突。

direction = newDirection

}

}

//moveOn():蛇形运动函数

公共布尔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//越线(撞墙)

}

/*我发了一个贪吃蛇游戏的代码。谁能帮我解释一下snake程序的运行过程和步骤*/

//run():蛇形运动线程

公共无效运行(){

跑步=真;

(跑步时){

尝试{

Thread.sleep(时间间隔);

}

捕捉(异常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(){

暂停了=!暂停;

}

}