📄 pacman.java
字号:
//
// PacMan
// Another 1 day game (created in 5 hours).
//
// (C)2000
// Brian Postma
// b.postma@hetnet.nl
// http://www.homepages.hetnet.nl/~brianpostma
//
import java.awt.*;
import java.applet.Applet;
public class PacMan extends Applet implements Runnable
{
Dimension d;
Font largefont = new Font("Helvetica", Font.BOLD, 24);
Font smallfont = new Font("Helvetica", Font.BOLD, 14);
FontMetrics fmsmall, fmlarge;
Graphics goff;
Image ii;
Thread thethread;
MediaTracker thetracker = null;
Color dotcolor=new Color(192,192,0);
int bigdotcolor=192;
int dbigdotcolor=-2;
Color mazecolor;
boolean ingame=false;
boolean showtitle=true;
boolean scared=false;
boolean dying=false;
final int screendelay=120;
final int blocksize=24;
final int nrofblocks=15;
final int scrsize=nrofblocks*blocksize;
final int animdelay=8;
final int pacanimdelay=2;
final int ghostanimcount=2;
final int pacmananimcount=4;
final int maxghosts=12;
final int pacmanspeed=6;
int animcount=animdelay;
int pacanimcount=pacanimdelay;
int pacanimdir=1;
int count=screendelay;
int ghostanimpos=0;
int pacmananimpos=0;
int nrofghosts=6;
int pacsleft,score;
int deathcounter;
int[] dx,dy;
int[] ghostx, ghosty, ghostdx, ghostdy, ghostspeed;
Image ghost1,ghost2,ghostscared1,ghostscared2;
Image pacman1, pacman2up, pacman2left, pacman2right, pacman2down;
Image pacman3up, pacman3down, pacman3left, pacman3right;
Image pacman4up, pacman4down, pacman4left, pacman4right;
int pacmanx, pacmany, pacmandx, pacmandy;
int reqdx, reqdy, viewdx, viewdy;
int scaredcount, scaredtime;
final int maxscaredtime=120;
final int minscaredtime=20;
final short level1data[] = {
19,26,26,22, 9,12,19,26,22, 9,12,19,26,26,22,
37,11,14,17,26,26,20,15,17,26,26,20,11,14,37,
17,26,26,20,11, 6,17,26,20, 3,14,17,26,26,20,
21, 3, 6,25,22, 5,21, 7,21, 5,19,28, 3, 6,21,
21, 9, 8,14,21,13,21, 5,21,13,21,11, 8,12,21,
25,18,26,18,24,18,28, 5,25,18,24,18,26,18,28,
6,21, 7,21, 7,21,11, 8,14,21, 7,21, 7,21,03,
4,21, 5,21, 5,21,11,10,14,21, 5,21, 5,21, 1,
12,21,13,21,13,21,11,10,14,21,13,21,13,21, 9,
19,24,26,24,26,16,26,18,26,16,26,24,26,24,22,
21, 3, 2, 2, 6,21,15,21,15,21, 3, 2, 2,06,21,
21, 9, 8, 8, 4,17,26, 8,26,20, 1, 8, 8,12,21,
17,26,26,22,13,21,11, 2,14,21,13,19,26,26,20,
37,11,14,17,26,24,22,13,19,24,26,20,11,14,37,
25,26,26,28, 3, 6,25,26,28, 3, 6,25,26,26,28 };
final int validspeeds[] = { 1,2,3,4,6,6 };
final int maxspeed=6;
int currentspeed=3;
short[] screendata;
public String getAppletInfo()
{
return("PacMan - by Brian Postma");
}
public void init()
{
short i;
GetImages();
screendata=new short[nrofblocks*nrofblocks];
Graphics g;
d = size();
setBackground(Color.black);
g=getGraphics();
g.setFont(smallfont);
fmsmall = g.getFontMetrics();
g.setFont(largefont);
fmlarge = g.getFontMetrics();
ghostx=new int[maxghosts];
ghostdx=new int[maxghosts];
ghosty=new int[maxghosts];
ghostdy=new int[maxghosts];
ghostspeed=new int[maxghosts];
dx=new int[4];
dy=new int[4];
GameInit();
}
public void GameInit()
{
pacsleft=3;
score=0;
scaredtime=maxscaredtime;
LevelInit();
nrofghosts=6;
currentspeed=3;
scaredtime=maxscaredtime;
}
public void LevelInit()
{
int i;
for (i=0; i<nrofblocks*nrofblocks; i++)
screendata[i]=level1data[i];
LevelContinue();
}
public void LevelContinue()
{
short i;
int dx=1;
int random;
for (i=0; i<nrofghosts; i++)
{
ghosty[i]=7*blocksize;
ghostx[i]=7*blocksize;
ghostdy[i]=0;
ghostdx[i]=dx;
dx=-dx;
random=(int)(Math.random()*(currentspeed));
if (random>(currentspeed-1))
random=currentspeed-1;
ghostspeed[i]=validspeeds[random];
}
screendata[7*nrofblocks+6]=10;
screendata[7*nrofblocks+8]=10;
pacmanx=7*blocksize;
pacmany=11*blocksize;
pacmandx=0;
pacmandy=0;
reqdx=0;
reqdy=0;
viewdx=-1;
viewdy=0;
dying=false;
scared=false;
}
public void GetImages()
{
thetracker=new MediaTracker(this);
ghost1=getImage(getDocumentBase(),"pacpix/Ghost1.gif");
thetracker.addImage(ghost1,0);
ghost2=getImage(getDocumentBase(),"pacpix/Ghost2.gif");
thetracker.addImage(ghost2,0);
ghostscared1=getImage(getDocumentBase(),"pacpix/GhostScared1.gif");
thetracker.addImage(ghostscared1,0);
ghostscared2=getImage(getDocumentBase(),"pacpix/GhostScared2.gif");
thetracker.addImage(ghostscared2,0);
pacman1=getImage(getDocumentBase(),"pacpix/PacMan1.gif");
thetracker.addImage(pacman1,0);
pacman2up=getImage(getDocumentBase(),"pacpix/PacMan2up.gif");
thetracker.addImage(pacman2up,0);
pacman3up=getImage(getDocumentBase(),"pacpix/PacMan3up.gif");
thetracker.addImage(pacman3up,0);
pacman4up=getImage(getDocumentBase(),"pacpix/PacMan4up.gif");
thetracker.addImage(pacman4up,0);
pacman2down=getImage(getDocumentBase(),"pacpix/PacMan2down.gif");
thetracker.addImage(pacman2down,0);
pacman3down=getImage(getDocumentBase(),"pacpix/PacMan3down.gif");
thetracker.addImage(pacman3down,0);
pacman4down=getImage(getDocumentBase(),"pacpix/PacMan4down.gif");
thetracker.addImage(pacman4down,0);
pacman2left=getImage(getDocumentBase(),"pacpix/PacMan2left.gif");
thetracker.addImage(pacman2left,0);
pacman3left=getImage(getDocumentBase(),"pacpix/PacMan3left.gif");
thetracker.addImage(pacman3left,0);
pacman4left=getImage(getDocumentBase(),"pacpix/PacMan4left.gif");
thetracker.addImage(pacman4left,0);
pacman2right=getImage(getDocumentBase(),"pacpix/PacMan2right.gif");
thetracker.addImage(pacman2right,0);
pacman3right=getImage(getDocumentBase(),"pacpix/PacMan3right.gif");
thetracker.addImage(pacman3right,0);
pacman4right=getImage(getDocumentBase(),"pacpix/PacMan4right.gif");
thetracker.addImage(pacman4right,0);
try
{
thetracker.waitForAll();
}
catch (InterruptedException e)
{
return;
}
}
public boolean keyDown(Event e, int key)
{
if (ingame)
{
if (key == Event.LEFT)
{
reqdx=-1;
reqdy=0;
}
else if (key == Event.RIGHT)
{
reqdx=1;
reqdy=0;
}
else if (key == Event.UP)
{
reqdx=0;
reqdy=-1;
}
else if (key == Event.DOWN)
{
reqdx=0;
reqdy=1;
}
else if (key == Event.ESCAPE)
{
ingame=false;
}
}
else
{
if (key == 's' || key == 'S')
{
ingame=true;
GameInit();
}
}
return true;
}
public boolean keyUp(Event e, int key)
{
if (key == Event.LEFT || key == Event.RIGHT || key == Event.UP || key == Event.DOWN)
{
reqdx=0;
reqdy=0;
}
return true;
}
public void paint(Graphics g)
{
String s;
Graphics gg;
if (goff==null && d.width>0 && d.height>0)
{
ii = createImage(d.width, d.height);
goff = ii.getGraphics();
}
if (goff==null || ii==null)
return;
goff.setColor(Color.black);
goff.fillRect(0, 0, d.width, d.height);
DrawMaze();
DrawScore();
DoAnim();
if (ingame)
PlayGame();
else
PlayDemo();
g.drawImage(ii, 0, 0, this);
}
public void DoAnim()
{
animcount--;
if (animcount<=0)
{
animcount=animdelay;
ghostanimpos++;
if (ghostanimpos>=ghostanimcount)
ghostanimpos=0;
}
pacanimcount--;
if (pacanimcount<=0)
{
pacanimcount=pacanimdelay;
pacmananimpos=pacmananimpos+pacanimdir;
if (pacmananimpos==(pacmananimcount-1) || pacmananimpos==0)
pacanimdir=-pacanimdir;
}
}
public void PlayGame()
{
if (dying)
{
Death();
}
else
{
CheckScared();
MovePacMan();
DrawPacMan();
MoveGhosts();
CheckMaze();
}
}
public void PlayDemo()
{
CheckScared();
MoveGhosts();
ShowIntroScreen();
}
public void Death()
{
int k;
deathcounter--;
k=(deathcounter&15)/4;
switch(k)
{
case 0:
goff.drawImage(pacman4up,pacmanx+1,pacmany+1,this);
break;
case 1:
goff.drawImage(pacman4right,pacmanx+1,pacmany+1,this);
break;
case 2:
goff.drawImage(pacman4down,pacmanx+1,pacmany+1,this);
break;
default:
goff.drawImage(pacman4left,pacmanx+1,pacmany+1,this);
}
if (deathcounter==0)
{
pacsleft--;
if (pacsleft==0)
ingame=false;
LevelContinue();
}
}
public void MoveGhosts()
{
short i;
int pos;
int count;
for (i=0; i<nrofghosts; i++)
{
if (ghostx[i]%blocksize==0 && ghosty[i]%blocksize==0)
{
pos=ghostx[i]/blocksize+nrofblocks*(int)(ghosty[i]/blocksize);
count=0;
if ((screendata[pos]&1)==0 && ghostdx[i]!=1)
{
dx[count]=-1;
dy[count]=0;
count++;
}
if ((screendata[pos]&2)==0 && ghostdy[i]!=1)
{
dx[count]=0;
dy[count]=-1;
count++;
}
if ((screendata[pos]&4)==0 && ghostdx[i]!=-1)
{
dx[count]=1;
dy[count]=0;
count++;
}
if ((screendata[pos]&8)==0 && ghostdy[i]!=-1)
{
dx[count]=0;
dy[count]=1;
count++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -