下面是我最近写的一个贪吃蛇游戏
基本功能都能实现,就是游戏开始后不能暂停游戏
有一个线程挂起的方法,但我不会用,哪位高手能帮帮我??
小弟先谢了.
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;class tcs extends JFrame implements Runnable
{
int maxnum=21;/////蛇身最长度
int num;////////过关长度
int number=4;///蛇身长度
int score; int tempx;//////临时判断
int tempy;//////临时判断 int spd=0;//游戏是否开始 int ranx;///////随机数
int rany;///////随机数 int vx[]=new int[maxnum];
int vy[]=new int[maxnum]; int part;////运动方向
int ascll;////键盘ascll码
boolean bool=true;//游戏是否结束
boolean pause=false;//游戏是否暂停 Thread t1;////////线程 int vaa[][]=new int[20][20]; ////****************主函数******************
public static void  main(String a[])
{
new tcs(6,0);
}
////****************主函数****************** ///////******构造函数********************
public tcs(int item,int tscore)
{
super("游戏--贪吃蛇");
ranx=shuiji(20);
rany=shuiji(20);
num=item;
score=tscore;
System.out.println(ranx+"  "+rany);
part=1;
t1=new Thread(this);
vx[0]=5; vx[1]=4; vx[2]=3; vx[3]=2;
vy[0]=1; vy[1]=1; vy[2]=1; vy[3]=1;
for(int i=0;i<number;i++)
{
vaa[vx[i]][vy[i]]=2;
}
setSize(410,400);
setVisible(true);
addKeyListener(new key());//键盘监听
repaint();
}
///////******构造函数******************** //////*********************产生随机数********************
public int shuiji(int temp)
{
double a=Math.random();
a=a*10000;
return (int)a%temp;
}
//////*********************产生随机数******************** /////*****************线程方法********************************************************
public void run()
{
while(true)
{
if (bool==false||number>num)
{
repaint();
t1.stop();
} ///*****异常处理*********
try
{
Thread.sleep(300-(num-6)*20);//线程睡眠
}
catch(Exception e)
{}
///*****异常处理*********


//////////**********是否吃子或自杀****************
switch(part)
{
case 1:
tempx=vx[0]+1;
tempy=vy[0];
break; case 2:
tempy=vy[0]+1;
tempx=vx[0];
break; case 3:
tempx=vx[0]-1;
tempy=vy[0];
break; case 4:
tempy=vy[0]-1;
tempx=vx[0];
break;
}
try
{
if(vaa[tempx][tempy]==3)
{
number++;
score=score+1000;
ranx=shuiji(20);
rany=shuiji(20);
}
if(vaa[tempx][tempy]==2)
{
bool=false;
}
}
catch(Exception e)
{
bool=false;
repaint();

}
//////////**********是否吃子或自杀****************
/////*********运动处理******************
for(int i1=maxnum-1;i1>0;i1--)
{
vy[i1]=vy[i1-1];
vx[i1]=vx[i1-1];
}
switch(part)
{

case 1:
vx[0]=vx[0]+1;
break; case 2:
vy[0]=vy[0]+1;
break; case 3:
vx[0]=vx[0]-1;
break; case 4:
vy[0]=vy[0]-1;
break;
}
/////*********运动处理******************
////*********清除界面*********
for(int x1=0;x1<20;x1++)
{
for(int y1=0;y1<20;y1++)
{
vaa[x1][y1]=0;
}
}
////*********清除界面*********

////*********重画数字模型**************
try
{
for(int i=0;i<number;i++)
{
vaa[vx[i]][vy[i]]=2;
}
}
catch(Exception e)
{
bool=false;
repaint();
}
vaa[ranx][rany]=3;
////*********重画数字模型**************
repaint();
}

}
/////*****************线程方法******************************************************** ////////***************************键盘事件************************
class key implements KeyListener
{
public void keyPressed(KeyEvent e)
{
ascll=e.getKeyCode();
if(ascll==37&&part!=1)/////向左移
{
part=3;
}
if(ascll==38&&part!=2)///向上移
{
part=4;
}
if(ascll==39&&part!=3)///向右移
{
part=1;
}
if(ascll==40&&part!=4)//////向下移
{
part=2;
}
if(ascll==83)//////向下移
{
try
{
t1.start();
spd=2;
}
catch(Exception e1)
{}
}
if(ascll==82&&bool==false)//////向下移
{
new tcs(num,0);
dispose();
}
if(ascll==80)//////暂停线程
{
if(pause==true)
{
pause=false;
}
else
{
pause=true;
}
}
System.out.println(ascll);
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
}
////////***************************键盘事件************************ /////////***************************************画图*****************************
public void paint(Graphics g)
{
int i=15;  //方块长宽度
int xx=0;
int yy=0;
g.clearRect(0,0,size().width,size().height);
g.setColor(Color.getHSBColor(105,105,105));
g.fillRect(15,40,i*20,i*20); g.setColor(Color.black); g.drawLine(15,0*i+40,21*15,0*i+40);//画横线
g.drawLine(15,20*i+40,21*15,20*i+40);//画横线

g.drawLine(0*i+15,40,0*i+15,20*15+40);/////////////画竖线
g.drawLine(20*i+15,40,20*i+15,20*15+40);/////////////画竖线

g.setColor(Color.blue);
g.drawString("第"+(num-5)+"关",22*15,60);
g.drawString("得分: "+score,22*15,80);
g.drawString("作者:曾德富",17*i,22*15+40);
for(;xx<20;xx++)
{
for(;yy<20;yy++)
{

if(vaa[xx][yy]==2)
{
g.setColor(Color.red);
g.fillRect((xx+1)*i+1,yy*i+40+1,13,13);////////画方格
}
if(vaa[xx][yy]==3)
{
g.setColor(Color.blue);
g.fillRect((xx+1)*i+1,yy*i+40+1,14,14);////////画方格
}

}
yy=0;
}

/////***********判断游戏是否开始或结束******************
if(spd==0)
{
g.setColor(Color.WHITE);
g.setFont(new Font("宋体",Font.BOLD,24));
g.drawString("第"+(num-5)+"关",9*i,10*i);
g.drawString("按S键开始游戏",6*i,13*i);
}
if(bool==false)
{
g.setColor(Color.WHITE);
g.setFont(new Font("宋体",Font.BOLD,24));
g.drawString("GAME OVER",7*i,10*i);
g.drawString("按R键重新游戏",6*i,13*i);
}
if(number>num)
{
g.setColor(Color.WHITE);
g.setFont(new Font("宋体",Font.BOLD,24));
g.drawString("闯关成功",7*i,10*i);
new tcs(num+1,score);
dispose();
}
/////***********判断游戏是否结束****************** }
/////////***************************************画图*****************************
}/**本程序完成于2005年4月14日,作者:曾德富*/

解决方案 »

  1.   

    你的整个东西,都应该写在一自定义线程类中!
    即你把你的方块移动写在一个线程中,线程就有暂停的方法,不是可以直接用吗?
    楼主,Java是面向对象的语言,看一下封装性!
      

  2.   

    试试 wait() 和 notify()。
    把 run() 中的主循环瘦身一下,具体的功能放在函数里,这样程序的流程更容易把握。