//****************************************************************************** // Tron.java: Applet // //****************************************************************************** import java.applet.*; import java.awt.*; //============================================================================== // Main Class for applet Tron // //============================================================================== public class Tron extends Applet implements Runnable { // THREAD SUPPORT: // m_Tron is the Thread object for the applet //-------------------------------------------------------------------------- private Thread m_Tron = null; private final int SIZE_X=320; private final int SIZE_Y=240; private final int NUM_PLAYERS=4; private int first_paint; private byte[] map; private int[] px; private int[] py; private int[] pdir; private int[] palive; private int[] pcolor; // Tron Class Constructor //-------------------------------------------------------------------------- public Tron() { int i; map=new byte[SIZE_X*SIZE_Y]; for(i=0; i0) DoAI(i); tx=px[i]+dx[pdir[i]]; ty=py[i]+dy[pdir[i]]; if((tx<0) || (tx>=SIZE_X) || (ty<0) || (ty>=SIZE_Y) || (map[tx+ty*SIZE_X]!=0)) { palive[i]=0; } else { px[i]=tx; py[i]=ty; map[tx+ty*SIZE_X]=(byte)(i+1); } } if(palive[i]==1) { alive_cnt++; g.setColor(new Color(pcolor[i])); g.drawLine(px[i],py[i],px[i],py[i]); } } if(palive[0]==0) { g.setColor(new Color(0xff7070)); g.drawString("You Lose!",50,120); repaint(); stop(); } else if(alive_cnt==1) { g.setColor(new Color(0x7070ff)); g.drawString("You Win!",50,120); repaint(); stop(); } repaint(); Thread.sleep(25); } catch (InterruptedException e) { // TODO: Place exception-handling code here in case an // InterruptedException is thrown by Thread.sleep(), // meaning that another thread has interrupted this one g.drawString("IException!",50,100); repaint(); stop(); } catch (Exception e) { g.drawString("Exception:"+e.toString()+"\n",50,100); repaint(); } } } private void DoAI(int pnum) { int[] dx={0,1,0,-1}; int[] dy={-1,0,1,0}; int tdir; if(palive[pnum]!=1) return; if(map[(px[pnum]+dx[pdir[pnum]])+(py[pnum]+dy[pdir[pnum]])*SIZE_X]!=0) { if(Math.random()>0.5) { tdir=(pdir[pnum]+1)%4; if(map[(px[pnum]+dx[tdir])+(py[pnum]+dy[tdir])*SIZE_X]==0) pdir[pnum]=tdir; else pdir[pnum]=(pdir[pnum]+3)%4; } else { tdir=(pdir[pnum]+3)%4; if(map[(px[pnum]+dx[tdir])+(py[pnum]+dy[tdir])*SIZE_X]==0) pdir[pnum]=tdir; else pdir[pnum]=(pdir[pnum]+1)%4; } } else if(Math.random()>0.985) { if(Math.random()>0.5) { tdir=(pdir[pnum]+1)%4; if(map[(px[pnum]+dx[tdir])+(py[pnum]+dy[tdir])*SIZE_X]==0) pdir[pnum]=tdir; } else { tdir=(pdir[pnum]+3)%4; if(map[(px[pnum]+dx[tdir])+(py[pnum]+dy[tdir])*SIZE_X]==0) pdir[pnum]=tdir; } } } public boolean keyDown(Event evt,int nKey) { if(evt.key==106) pdir[0]=(pdir[0]+3)%4; if(evt.key==107) pdir[0]=(pdir[0]+1)%4; if(evt.key==Event.LEFT) pdir[0]=(pdir[0]+3)%4; if(evt.key==Event.RIGHT) pdir[0]=(pdir[0]+1)%4; return(true); } private void ResizeImage() { resize(SIZE_X,SIZE_Y); } }