贪食蛇源程序

来源:互联网 发布:papi酱网络用语进生活 编辑:程序博客网 时间:2024/04/28 08:35
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.util.Random;
import java.lang.*;
import javax.swing.border.*;
import java.applet.*;
import java.net.*;
import java.io.*;

public class NetMultiBaby {
public NetMultiBaby() {

}

public static void main(String[] args) throws Exception {

/*com.incors.plaf.alloy.AlloyLookAndFeel.setProperty("alloy.licenseCode", "yourLicenseCode");
try {
javax.swing.LookAndFeel alloyLnF = new com.incors.plaf.alloy.AlloyLookAndFeel();
javax.swing.UIManager.setLookAndFeel(alloyLnF);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
// You may handle the exception here
}*/

BabyFrame frame = new BabyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
AudioClip sound_play;
sound_play = Applet.newAudioClip(new URL("file:" + System.getProperty("user.dir") + "/"+"ycg.mid"));
sound_play.loop();
}
}

class AddrConfig extends JFrame {
public boolean is_serverFlag;
public JLabel jl_IP,jl_PORT;
public JTextField jtf_IP,jtf_PORT;
public JButton jb;
public JPanel jp_IP,jp_PORT;
public NetFrame netframe_server = null,netframe_client = null;

public AddrConfig(boolean is_server) {
this.is_serverFlag = is_server;
Container c = this.getContentPane();

this.setLocation(10,10);
if (is_serverFlag) {
this.setTitle("服务器端地址配置");
this.setSize(300,70);
}
else {
this.setTitle("客户端地址配置");
this.setSize(300,100);
}
jl_IP = new JLabel("IP:");
jtf_IP = new JTextField(20);
jtf_IP.setText("192.168.51.77");
jp_IP = new JPanel();
jp_IP.add(jl_IP);
jp_IP.add(jtf_IP);

jl_PORT = new JLabel("PORT:");
jtf_PORT = new JTextField(5);
jtf_PORT.setText("9999");
jp_PORT = new JPanel();
jp_PORT.add(jl_PORT);
jp_PORT.add(jtf_PORT);

jb = new JButton("Go");
jb.addActionListener(new MyActionListener(this));
jp_PORT.add(jb);
if (!is_serverFlag) c.setLayout(new GridLayout(2,1));
else c.setLayout(new GridLayout(1,1));
if (!is_serverFlag) c.add(jp_IP);
c.add(jp_PORT);
this.setResizable(false);
this.setVisible(true);
}

class MyActionListener implements ActionListener {
public AddrConfig addrconfig;
public MyActionListener(AddrConfig add) {
this.addrconfig = add;
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == addrconfig.jb) {
if (addrconfig.is_serverFlag) {
//if (netframe_server == null) {
netframe_server = new NetFrame(Integer.parseInt(addrconfig.jtf_PORT.getText()));
netframe_server.show();
//}
//netframe_server.show();
}
else {
//if (netframe_client == null) {
netframe_client = new NetFrame(addrconfig.jtf_IP.getText(),Integer.parseInt(addrconfig.jtf_PORT.getText()));
netframe_client.show();
//}
//netframe_client.show();
}
}
}
}
}

class BabyFrame extends JFrame implements ActionListener {

public static final int WIDTH = 300;
public static final int HEIGHT = 400;
public JMenuBar menubar;
public JMenu fileMenu;
public JMenuItem newSingleGameMenuItem,newLocalMultiGameMenuItem;
public JMenu newNetMultiGameMenu;
public JMenuItem newNetMultiGameMenuItem_server,newNetMultiGameMenuItem_client;
public JMenuItem exitMenuItem;
public JMenuItem pauseGameMenuItem;
public JMenu optionMenu;

public JCheckBoxMenuItem Border_Item;
public JMenu aboutMenu;
public JMenuItem mailMeMenuItem;
public JMenuItem aboutMenuItem;

//public BabyPanel panel;
//public BabyDialog panel_Dialog;
public AboutDialog about_Dialog;
public JButton jb_server,jb_client;
public JPanel jp;
public AddrConfig addrconfig_server = null,addrconfig_client = null;
public MultiFrame multiframe = null;
public SingleFrame singleframe = null;

public BabyFrame() {
Container contentPane = getContentPane();
//panel_Dialog = new BabyDialog(panel);
//about_Dialog = new AboutDialog(panel);

setTitle("贪食蛇sss");
setSize(WIDTH, HEIGHT);
setResizable(false);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((int)(screenSize.getWidth()/2 - WIDTH/2),(int)(screenSize.getHeight()/2 - HEIGHT/2));
menubar = new JMenuBar();
fileMenu = new JMenu("File");
fileMenu.setMnemonic(´F´);

newSingleGameMenuItem = new JMenuItem("New SingleGame...",´S´);
newSingleGameMenuItem.addActionListener(this);
newLocalMultiGameMenuItem = new JMenuItem("new Multi-Local-Game...",´M´);
newLocalMultiGameMenuItem.addActionListener(this);

newNetMultiGameMenu = new JMenu("Net MultiGame");
newNetMultiGameMenuItem_server = new JMenuItem("As Server...",´S´);
newNetMultiGameMenuItem_server.addActionListener(this);
newNetMultiGameMenuItem_client = new JMenuItem("As Client...",´C´);
newNetMultiGameMenuItem_client.addActionListener(this);

newNetMultiGameMenu.add(newNetMultiGameMenuItem_server);
newNetMultiGameMenu.add(newNetMultiGameMenuItem_client);

fileMenu.add(newSingleGameMenuItem);
fileMenu.add(newLocalMultiGameMenuItem);
fileMenu.add(newNetMultiGameMenu);


pauseGameMenuItem = new JMenuItem("Pause",´P´);
pauseGameMenuItem.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent event) {
//panel.runFlag = !panel.runFlag;
}
});

exitMenuItem = new JMenuItem("Exit",´X´);
exitMenuItem.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
fileMenu.add(pauseGameMenuItem);
fileMenu.add(exitMenuItem);

optionMenu = new JMenu("Option");
optionMenu.setMnemonic(´O´);

Border_Item = new JCheckBoxMenuItem("Snake-Border");
Border_Item.addActionListener(this);

optionMenu.add(Border_Item);

aboutMenu = new JMenu("About");
aboutMenu.setMnemonic(´A´);
aboutMenuItem = new JMenuItem("About",´A´);
aboutMenuItem.addActionListener(this);

aboutMenu.add(aboutMenuItem);
menubar.add(fileMenu);
menubar.add(optionMenu);
menubar.add(aboutMenu);
this.setJMenuBar(menubar);

}

public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == newNetMultiGameMenuItem_server)
{
if (addrconfig_server == null) {
addrconfig_server = new AddrConfig(true);
}
addrconfig_server.show();
//this.setVisible(false);
}
else
if (ae.getSource() == newNetMultiGameMenuItem_client) {
if (addrconfig_client == null) {
addrconfig_client = new AddrConfig(false);
}
addrconfig_client.show();
}

else
if (ae.getSource() == newLocalMultiGameMenuItem) {
if (multiframe == null) {
multiframe = new MultiFrame();
}
multiframe.show();
}
else
if (ae.getSource() == newSingleGameMenuItem) {
if (singleframe == null) {
singleframe = new SingleFrame();
singleframe.show();
}
singleframe.show();
}
}



}



class NetFrame extends JFrame {
public static final int WIDTH = 700;
public static final int HEIGHT = 400;
public BabyFrame babyframe;
public boolean is_serverFlag;
public NetMultiBabyPanel panel;
public String IP;
public int PORT;

public JMenuBar menubar;
public JMenu fileMenu;
public JMenuItem newGameMenuItem;
public JMenuItem exitMenuItem;
public JMenuItem pauseGameMenuItem;

public NetFrame(String ip,int port) {
this.is_serverFlag = false;
this.IP = ip;
this.PORT = port;
//this.babyframe = babyframe1;
//this.babyframe = babyframe;
//Container c = this.getContentPane();
panel = new NetMultiBabyPanel(IP,PORT);

this.setSize(700,400);
this.setTitle("贪食蛇======网络版客户端");
this.setResizable(false);
panel.thread.start();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((int)(screenSize.getWidth()/2 - WIDTH/2),(int)(screenSize.getHeight()/2 - HEIGHT/2));

menubar = new JMenuBar();

fileMenu = new JMenu("File");
fileMenu.setMnemonic(´F´);

newGameMenuItem = new JMenuItem("New",´N´);
newGameMenuItem.addActionListener(new MyActionListener(this));
pauseGameMenuItem = new JMenuItem("Pause",´P´);
pauseGameMenuItem.addActionListener(new MyActionListener(this));

exitMenuItem = new JMenuItem("Exit",´X´);
exitMenuItem.addActionListener(new MyActionListener(this));


fileMenu.add(newGameMenuItem);
fileMenu.add(pauseGameMenuItem);
fileMenu.add(exitMenuItem);
menubar.add(fileMenu);
setJMenuBar(menubar);
Container c = this.getContentPane();
c.add(panel);

this.addWindowListener(new WindowAdapter(){
//close window event
public void windowClosing(WindowEvent event)
{
//babyframe.
setVisible(false);
try{
panel.thread.stop();
panel.socket.close();
}catch (IOException e){}
}//end of window event
}
);
}

////////////////////////////////////////////////////////////
public NetFrame(int port) {
this.is_serverFlag = true;
this.PORT = port;
panel = new NetMultiBabyPanel(PORT);
this.setSize(700,400);
this.setTitle("贪食蛇======网络版服务器端");
this.setResizable(false);

panel.thread.start();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((int)(screenSize.getWidth()/2 - WIDTH/2),(int)(screenSize.getHeight()/2 - HEIGHT/2));

menubar = new JMenuBar();

fileMenu = new JMenu("File");
fileMenu.setMnemonic(´F´);

newGameMenuItem = new JMenuItem("New",´N´);
newGameMenuItem.addActionListener(new MyActionListener(this));
pauseGameMenuItem = new JMenuItem("Pause",´P´);
pauseGameMenuItem.addActionListener(new MyActionListener(this));

exitMenuItem = new JMenuItem("Exit",´X´);
exitMenuItem.addActionListener(new MyActionListener(this));


fileMenu.add(newGameMenuItem);
fileMenu.add(pauseGameMenuItem);
fileMenu.add(exitMenuItem);
menubar.add(fileMenu);
setJMenuBar(menubar);
Container c = this.getContentPane();
c.add(panel);

this.addWindowListener(new WindowAdapter(){
//close window event
public void windowClosing(WindowEvent event)
{
//babyframe.

//babyframe.setVisible(true);
setVisible(false);
try{
panel.thread.stop();
panel.serversocket.close();
//panel.socket_on_server.close();
if (!(panel.socket_on_server == null))
panel.socket_on_server.close();

}catch (IOException e){}
}



}//end of window event

);
}


private class MyActionListener implements ActionListener {
public NetFrame netframe;
public MyActionListener(NetFrame nf) {
this.netframe = nf;
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == newGameMenuItem) {
if (netframe.panel.is_serverFlag) {
netframe.panel.user1.newGame();
netframe.panel.out.println(KeyEvent.VK_R);
}
else {
netframe.panel.user2.newGame();
netframe.panel.out.println(KeyEvent.VK_2);
}
}
else
if (event.getSource() == pauseGameMenuItem) {
if (netframe.panel.is_serverFlag) {
netframe.panel.user1.runFlag = !netframe.panel.user1.runFlag;
netframe.panel.out.println(KeyEvent.VK_SPACE);
}
else {
netframe.panel.user2.runFlag = !netframe.panel.user2.runFlag;
netframe.panel.out.println(KeyEvent.VK_1);
}
}
else
if (event.getSource() == exitMenuItem) {
netframe.dispose();
}
}
}
}



class SingleFrame extends JFrame {
MultiBabyPanel multibabypanel;
public static final int WIDTH = 400;
public static final int HEIGHT = 400;
public JMenuBar menubar;
public JMenu fileMenu;
public JMenuItem newGameMenuItem;
public JMenuItem exitMenuItem;
public JMenuItem pauseGameMenuItem;

public SingleFrame() {

Container c = this.getContentPane();
multibabypanel = new MultiBabyPanel(1);

//babyframe.setVisible(false);
//this.setVisible(true);
this.setSize(330,400);
this.setTitle("贪食蛇=======本机单打");
this.setResizable(false);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((int)(screenSize.getWidth()/2 - WIDTH/2),(int)(screenSize.getHeight()/2 - HEIGHT/2));

menubar = new JMenuBar();

fileMenu = new JMenu("File");
fileMenu.setMnemonic(´F´);

newGameMenuItem = new JMenuItem("New",´N´);
newGameMenuItem.addActionListener(new MyActionListener(this));
pauseGameMenuItem = new JMenuItem("Pause",´P´);
pauseGameMenuItem.addActionListener(new MyActionListener(this));

exitMenuItem = new JMenuItem("Exit",´X´);
exitMenuItem.addActionListener(new MyActionListener(this));


fileMenu.add(newGameMenuItem);
fileMenu.add(pauseGameMenuItem);
fileMenu.add(exitMenuItem);
menubar.add(fileMenu);
setJMenuBar(menubar);
c.add(multibabypanel);
}
private class MyActionListener implements ActionListener {
public SingleFrame singleframe;
public MyActionListener(SingleFrame sf) {
this.singleframe = sf;
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == newGameMenuItem) {
singleframe.multibabypanel.user1.newGame();
}
else
if (event.getSource() == pauseGameMenuItem) {
singleframe.multibabypanel.user1.runFlag = !singleframe.multibabypanel.user1.runFlag;
}
else
if (event.getSource() == exitMenuItem) {
singleframe.dispose();
}
}
}
}

//////////////////////////////////////////////////////////////


class MultiFrame extends JFrame {
MultiBabyPanel multibabypanel;
public static final int WIDTH = 700;
public static final int HEIGHT = 400;

public JMenuBar menubar;
public JMenu fileMenu;
public JMenuItem newGameMenuItem;
public JMenuItem exitMenuItem;
public JMenuItem pauseGameMenuItem;
public MultiFrame() {

//Container c = this.getContentPane();
multibabypanel = new MultiBabyPanel(2);
//c.add(multibabypanel);
//babyframe.setVisible(false);
//this.setVisible(true);
this.setSize(700,400);
this.setTitle("贪食蛇=======本机双打");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((int)(screenSize.getWidth()/2 - WIDTH/2),(int)(screenSize.getHeight()/2 - HEIGHT/2));
this.setResizable(false);
menubar = new JMenuBar();

fileMenu = new JMenu("File");
fileMenu.setMnemonic(´F´);

newGameMenuItem = new JMenuItem("New",´N´);
newGameMenuItem.addActionListener(new MyActionListener(this));
pauseGameMenuItem = new JMenuItem("Pause",´P´);
pauseGameMenuItem.addActionListener(new MyActionListener(this));

exitMenuItem = new JMenuItem("Exit",´X´);
exitMenuItem.addActionListener(new MyActionListener(this));


fileMenu.add(newGameMenuItem);
fileMenu.add(pauseGameMenuItem);
fileMenu.add(exitMenuItem);
menubar.add(fileMenu);
setJMenuBar(menubar);
Container c = this.getContentPane();
c.add(multibabypanel);
}

private class MyActionListener implements ActionListener {
public MultiFrame multiframe;
public MyActionListener(MultiFrame mf) {
this.multiframe = mf;
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == newGameMenuItem) {
multiframe.multibabypanel.user1.newGame();
multiframe.multibabypanel.user2.newGame();
}
else
if (event.getSource() == pauseGameMenuItem) {
multiframe.multibabypanel.user1.runFlag = !multiframe.multibabypanel.user1.runFlag;
multiframe.multibabypanel.user2.runFlag = !multiframe.multibabypanel.user2.runFlag;
}
else
if (event.getSource() == exitMenuItem) {
multiframe.dispose();
}
}
}
}

class MultiBabyPanel extends JPanel implements Runnable{

User user1,user2;
public Thread thread;
public int userNum;
public Random random;
public int color_choose = 0;


public MultiBabyPanel(int userNum) {
random = new Random(100);
this.userNum = userNum;
user1 = new User(KeyEvent.VK_UP,KeyEvent.VK_DOWN,KeyEvent.VK_LEFT,KeyEvent.VK_RIGHT,KeyEvent.VK_SPACE,KeyEvent.VK_R,280,280,0,0);
myKeyListenerUser1 keyListener_user1 = new myKeyListenerUser1();
addKeyListener(keyListener_user1);
if (userNum == 2) {
System.out.println("User2 inited....");
user2 = new User(KeyEvent.VK_W,KeyEvent.VK_S,KeyEvent.VK_A,KeyEvent.VK_D,KeyEvent.VK_1,KeyEvent.VK_2,640,280,360,0);
myKeyListenerUser2 keyListener_user2 = new myKeyListenerUser2();
addKeyListener(keyListener_user2);
}



thread = new Thread(this);
thread.start();

}

public boolean isFocusTraversable() {
return true;
}

public void run() {
while (true) {
user1.goOne();
if (userNum == 2) user2.goOne();
try {
thread.sleep(5);
}catch (InterruptedException e) { }
repaint();
}
}

private class myKeyListenerUser1 implements KeyListener {
public void myKeyListenr() {}
public void keyPressed(KeyEvent ke) {
user1.doMessage(ke.getKeyCode());
}
public void keyReleased(KeyEvent ke) {}
public void keyTyped (KeyEvent ke) {}
}



///////////////keyListener for user2////////////////////////////////
private class myKeyListenerUser2 implements KeyListener {
public void myKeyListenr() {}
public void keyPressed(KeyEvent ke) {
user2.doMessage(ke.getKeyCode());
}

public void keyReleased(KeyEvent ke) {}
public void keyTyped (KeyEvent ke) {}
}



public void paintComponent(Graphics g)
{
super.paintComponent(g);

g.setColor(Color.black);

if (userNum == 2) {
g.fill3DRect(user2.panelx+10,user2.panely+10,300,300,false);
g.setColor(Color.white);
g.fill3DRect(user2.panelx+20,user2.panely+20,280,280,true);
g.setColor(Color.BLACK);
g.drawRect(user2.panelx+10,user2.panely+320,70,19);
g.fillRect(user2.panelx+12,user2.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Score : " + (user2.babyCount - 6),user2.panelx+17,user2.panely+334);
g.setColor(Color.BLACK);
g.drawRect(user2.panelx+241,user2.panely+320,70,19);
g.fillRect(user2.panelx+243,user2.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Level : " + (10-user2.sleepTime),user2.panelx+252,user2.panely+334);
}

g.setColor(Color.black);
g.fill3DRect(user1.panelx+10,user1.panely+10,300,300,false);
g.setColor(Color.white);
g.fill3DRect(user1.panelx+20,user1.panely+20,280,280,true);
g.setColor(Color.BLACK);
g.drawRect(user1.panelx+10,user1.panely+320,70,19);
g.fillRect(user1.panelx+12,user1.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Score : " + (user1.babyCount - 6),user1.panelx+17,user1.panely+334);
g.setColor(Color.BLACK);
g.drawRect(user1.panelx+241,user1.panely+320,70,19);
g.fillRect(user1.panelx+243,user1.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Level : " + (10-user1.sleepTime),user1.panelx+252,user1.panely+334);


///////////////////////////if user2 exist then draw user2//////////////////
if (userNum == 2) {
//显示图像
for (int i = 0; i < user2.Baby.size(); i++) {


//得到图像位置
int x = (int)((Point)user2.Baby.get(i)).getX();
int y = (int)((Point)user2.Baby.get(i)).getY();
//g.drawRect(x+1,y +1,18,18);
g.setColor((Color)user2.BabyColor.get(i));
g.fill3DRect(x+1,y+1,18,18,true);
}
g.setColor(Color.MAGENTA);
g.fill3DRect(user2.posx+1,user2.posy+1,18,18,true);
g.setColor(Color.red);
if ((user2.runFlag == false)&(user2.gameFlag == true)) g.drawString("PAUSE...",user2.panelx+130,user2.panely+130);
if (user2.gameFlag == false) g.drawString("Game Over!",user2.panelx+130,user2.panely+130);
}

//////////////////////draw user1/////////////////////////////////

//显示图像
for (int i = 0; i < user1.Baby.size(); i++) {


//得到图像位置
int x = (int)((Point)user1.Baby.get(i)).getX();
int y = (int)((Point)user1.Baby.get(i)).getY();
//g.drawRect(x+1,y +1,18,18);
g.setColor((Color)user1.BabyColor.get(i));
g.fill3DRect(x+1,y+1,18,18,true);
}
g.setColor(Color.MAGENTA);
g.fill3DRect(user1.posx+1,user1.posy+1,18,18,true);
g.setColor(Color.black);
if ((user1.runFlag == false)&(user1.gameFlag == true)) g.drawString("PAUSE...",user1.panelx+130,user1.panely+130);
if (user1.gameFlag == false) g.drawString("Game Over!",user1.panelx+130,user1.panely+130);
}
}

//////////////////////////////////////////////////////////////

class NetMultiBabyPanel extends JPanel implements Runnable{

public User user1,user2;
public Thread thread;
boolean is_serverFlag;
public BufferedReader in;
public PrintWriter out;
public String message_temp;
public int message;
public ServerSocket serversocket;
public Socket socket,socket_on_server;
public InetAddress a;
public int PORT=9999;
public String IP;
public boolean isConected;


public NetMultiBabyPanel(String ip,int port) {
this.is_serverFlag = false;
isConected = false;
this.IP = ip;
this.PORT = port;

user1 = new User(KeyEvent.VK_UP,KeyEvent.VK_DOWN,KeyEvent.VK_LEFT,KeyEvent.VK_RIGHT,KeyEvent.VK_SPACE,KeyEvent.VK_R,280,280,0,0);
user2 = new User(KeyEvent.VK_W,KeyEvent.VK_S,KeyEvent.VK_A,KeyEvent.VK_D,KeyEvent.VK_1,KeyEvent.VK_2,640,280,360,0);


myKeyListenerUser1 keyListenerUser1 = new myKeyListenerUser1();
myKeyListenerUser2 keyListenerUser2 = new myKeyListenerUser2();

try {
InetAddress a = InetAddress.getByName(IP);
socket = new Socket(a,PORT);
in =
new BufferedReader(new InputStreamReader(socket.getInputStream()));
out =
new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
}catch(IOException e) {}

addKeyListener(keyListenerUser2);
System.out.println("keyListenerUser2");

System.out.println("addListener");
thread = new Thread(this);
}




///////////////////////////////////////////////////////////////////////////////


public NetMultiBabyPanel(int port) {
this.PORT = port;
this.is_serverFlag = true;
isConected = false;

user1 = new User(KeyEvent.VK_UP,KeyEvent.VK_DOWN,KeyEvent.VK_LEFT,KeyEvent.VK_RIGHT,KeyEvent.VK_SPACE,KeyEvent.VK_R,280,280,0,0);
user2 = new User(KeyEvent.VK_W,KeyEvent.VK_S,KeyEvent.VK_A,KeyEvent.VK_D,KeyEvent.VK_1,KeyEvent.VK_2,640,280,360,0);


myKeyListenerUser1 keyListenerUser1 = new myKeyListenerUser1();
myKeyListenerUser2 keyListenerUser2 = new myKeyListenerUser2();

try {
serversocket = new ServerSocket(PORT);
}catch (IOException e) {}
System.out.println("Server inited!");
new MyThread().start();

addKeyListener(keyListenerUser1);
System.out.println("keyListenerUser1");
thread = new Thread(this);
}


class MyThread extends Thread {
MyThread() {
}
public void run() {

try {
socket_on_server = serversocket.accept();
in = new BufferedReader(
new InputStreamReader(
socket_on_server.getInputStream()));
System.out.println("In inited");
out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket_on_server.getOutputStream())));
isConected = true;
System.out.println("Out inited");
}catch(IOException e) {}
}

}

public boolean isFocusTraversable() {
return true;
}


public void run() {
while (true) {
if (is_serverFlag) {
if (isConected) {
try {
user1.goOne();
out.println("Go");
out.flush();
message_temp = in.readLine();
if (message_temp.startsWith("Go")) {
user2.goOne();
}
else {
message = Integer.parseInt(message_temp);
user2.doMessage(message);
}
}catch (IOException e) {}
}
}
else {

try {
out.println("Go");
out.flush();
user2.goOne();

//System.out.println("Listening....");
message_temp =in.readLine();

if (message_temp.startsWith("Go")) {
user1.goOne();
}
else
{
message = Integer.parseInt(message_temp);
user1.doMessage(message);
}
}catch (IOException e) {}
}

repaint();
try {
thread.sleep(5);
}catch(InterruptedException e ) {

}

}
}


//////////////////////keyListener for user1////////////////////////////////
private class myKeyListenerUser1 implements KeyListener {
public void myKeyListenrUser1() {}
public void keyPressed(KeyEvent ke) {
user1.doMessage(ke.getKeyCode());
out.println(ke.getKeyCode());
out.flush();
}

public void keyReleased(KeyEvent ke) {}
public void keyTyped (KeyEvent ke) {}
}

//////////////////////keyListener for user2////////////////////////////////
private class myKeyListenerUser2 implements KeyListener {
public void myKeyListenrUser2() {}
public void keyPressed(KeyEvent ke) {
user2.doMessage(ke.getKeyCode());
out.println(ke.getKeyCode());
out.flush();
}
public void keyReleased(KeyEvent ke) {}
public void keyTyped (KeyEvent ke) {}
}


//////////////////////override the paint method////////////////////////////
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//System.out.println("paintComponent.....");
g.setColor(Color.black);
g.fill3DRect(user2.panelx+10,user2.panely+10,300,300,false);
g.setColor(Color.white);
g.fill3DRect(user2.panelx+20,user2.panely+20,280,280,true);
g.setColor(Color.BLACK);
g.drawRect(user2.panelx+10,user2.panely+320,70,19);
g.fillRect(user2.panelx+12,user2.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Score : " + (user2.babyCount - 6),user2.panelx+17,user2.panely+334);
g.setColor(Color.BLACK);
g.drawRect(user2.panelx+241,user2.panely+320,70,19);
g.fillRect(user2.panelx+243,user2.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Level : " + (10-user2.sleepTime),user2.panelx+252,user2.panely+334);


g.setColor(Color.black);
g.fillRect(user1.panelx+10,user1.panely+10,300,300);
g.setColor(Color.white);
g.fillRect(user1.panelx+20,user1.panely+20,280,280);
g.setColor(Color.BLACK);
g.drawRect(user1.panelx+10,user1.panely+320,70,19);
g.fillRect(user1.panelx+12,user1.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Score : " + (user1.babyCount - 6),user1.panelx+17,user1.panely+334);
g.setColor(Color.BLACK);
g.drawRect(user1.panelx+241,user1.panely+320,70,19);
g.fillRect(user1.panelx+243,user1.panely+322,67,16);
g.setColor(Color.WHITE);
g.drawString("Level : " + (10-user1.sleepTime),user1.panelx+252,user1.panely+334);


g.setColor(Color.blue);

//显示图像
for (int i = 0; i < user2.Baby.size(); i++) {


//得到图像位置
int x = (int)((Point)user2.Baby.get(i)).getX();
int y = (int)((Point)user2.Baby.get(i)).getY();
//g.drawRect(x+1,y +1,18,18);
g.setColor((Color)user2.BabyColor.get(i));
g.fill3DRect(x+1,y+1,18,18,true);
}
g.setColor(Color.MAGENTA);
g.fill3DRect(user2.posx+1,user2.posy+1,18,18,true);
g.setColor(Color.red);
if ((user2.runFlag == false)&(user2.gameFlag == true)) g.drawString("PAUSE...",user2.panelx+130,user2.panely+130);
if (user2.gameFlag == false) g.drawString("Game Over!",user2.panelx+130,user2.panely+130);


//////////////////////draw user1/////////////////////////////////

//显示图像
for (int i = 0; i < user1.Baby.size(); i++) {


//得到图像位置
int x = (int)((Point)user1.Baby.get(i)).getX();
int y = (int)((Point)user1.Baby.get(i)).getY();
//g.drawRect(x+1,y +1,18,18);
g.setColor((Color)user1.BabyColor.get(i));
g.fill3DRect(x+1,y+1,18,18,true);
}
g.setColor(Color.green);
g.fill3DRect(user1.posx+1,user1.posy+1,18,18,true);
g.setColor(Color.black);
if ((user1.runFlag == false)&(user1.gameFlag == true)) g.drawString("PAUSE...",user1.panelx+130,user1.panely+130);
if (user1.gameFlag == false) g.drawString("Game Over!",user1.panelx+130,user1.panely+130);


}

}


class User {

//public int goOne;
public int startx,starty,panelx,panely;
public int key_up,key_down,key_left,key_right,key_pause,key_reset;

//public Thread thread;
public ArrayList Baby,BabyDir,BabyRectangle,BabyColor;
public ArrayList Change,ChangeDir,ChangeCurrent,ChangeTotal;
public int pic_choose_snake = 2,pic_choose_food = 5;
public int imageWidth,imageHeight;

public int x ,y,posx,posy,newx,newy,currentx,currenty,steps,sleepTime;
public Point pt ,ptadd ,ptlast,ptemp;

public int dircount = 4,babyCount,turnCount;
public Random random,random_color;


public boolean eated,runFlag,gameFlag,drawFlag_snake,drawFlag_food,borderFlag,isSuspend;
public Rectangle headRect,foodRect,rect1,rect2,rectTemp;

public Color[] color = {Color.red,Color.green,new Color(3,45,209),new Color(223,100,26),new Color(200,46,13),new Color(190,23,200),new Color(224,171,12),new Color(120,33,180),new Color(69,41,52)};

public int color_choose = 0;


public User(int key_up,int key_down,int key_left,int key_right,int key_pause,int key_reset,int startx,int starty,int panelx,int panely) {

this.key_up = key_up;
this.key_down = key_down;
this.key_left = key_left;
this.key_right = key_right;
this.key_pause = key_pause;
this.key_reset = key_reset;
this.startx = startx;
this.starty = starty;
this.panelx = panelx;
this.panely = panely;




isSuspend = false;
sleepTime = 5;
babyCount = 6;
turnCount = 0;
imageWidth = 20;
steps = (babyCount - 1) * imageWidth + 1;
random = new Random(400);
random_color = new Random(100);
//pup = new Point(100,100);
Change = new ArrayList();
ChangeDir = new ArrayList();
ChangeCurrent = new ArrayList();
ChangeTotal = new ArrayList();
Baby = new ArrayList();
BabyDir = new ArrayList();
BabyRectangle = new ArrayList();
BabyColor = new ArrayList();
eated = true;
runFlag = true;
gameFlag = true;
drawFlag_snake = true;
drawFlag_food = true;
borderFlag = true;
Toolkit kit = Toolkit.getDefaultToolkit();

for (int i = 0;i < 6;i++) {
color_choose = random_color.nextInt(9);
pt = new Point(startx,starty);
startx = startx+imageWidth;
add(pt,3);
BabyColor.add(color[color_choose]);
BabyRectangle.add(pt);
}
}



public void add(Point pt,int dir) {
Baby.add(pt);
BabyDir.add(new Integer(dir));
ptlast = pt;
}



public void addNode() {

int size = Baby.size();

int x = (int)((Point)Baby.get(size - 1)).getX();
int y = (int)((Point)Baby.get(size - 1)).getY();
int newDir = Integer.parseInt((BabyDir.get(size - 1).toString()));
switch (newDir) {
case 0:
y = y + imageWidth;
break;
case 1:
x = x - imageWidth;
break;
case 2:
y = y - imageWidth;
break;
case 3:
x = x + imageWidth;
break;
}

Point newPoint = new Point(x,y);
BabyRectangle.add(newPoint);
add(newPoint,newDir);
color_choose = random_color.nextInt(9);
BabyColor.add(color[color_choose]);
ptlast = newPoint;
babyCount++;
steps = (babyCount - 1) * imageWidth + 1;
if (!ChangeTotal.isEmpty()) {
for(int k = 0;k < ChangeTotal.size();k++) {
int tempadd = Integer.parseInt(ChangeTotal.get(k).toString()) + imageWidth;
ChangeTotal.set(k,new Integer(tempadd));
}}}


public void checkGame() {
if ((((Point)Baby.get(0)).getX() > panelx+300)
|| (((Point)Baby.get(0)).getY() > panely+300)
|| (((Point)Baby.get(0)).getX() < panelx+10)
|| (((Point)Baby.get(0)).getY() < panely+10))
gameFlag = false;

int rectTempx = (int)((Point)BabyRectangle.get(0)).getX();
int rectTempy = (int)((Point)BabyRectangle.get(0)).getY();
rect1 = new Rectangle(rectTempx,rectTempy,imageWidth - 5,imageWidth - 5);
for (int rectNum = 3;rectNum < BabyRectangle.size();rectNum++) {
int rectTempxx = (int)((Point)BabyRectangle.get(rectNum)).getX();
int rectTempyy = (int)((Point)BabyRectangle.get(rectNum)).getY();
rect2 = new Rectangle(rectTempxx,rectTempyy,imageWidth - 5,imageWidth - 5);

if (rect1.intersects(rect2)) {
gameFlag = false;
return;
}}}


public void cut() {
ChangeCurrent.remove(0);
ChangeTotal.remove(0);
Change.remove(0);
ChangeDir.remove(0);
}


public void checkEat() {
eated = false;
if (headRect.intersects(foodRect)) {
eated = true;
}
}


public void checkDir () {
for (int j = 0; j < Change.size(); j++) {
for (int i = 1;i < Baby.size(); i++) {
if (Baby.get(i).equals((Point)(Change.get(j)))) {
BabyDir.set(i,ChangeDir.get(j));
}
}
}
}

public void food () {
if (eated == true) {
posx = panelx+20 + random.nextInt(260);
posy = panely+20 + random.nextInt(260);
foodRect = new Rectangle(posx,posy,15,15);
}
}

public void addChangeCurrent() {
for (int i = 0;i < ChangeCurrent.size();i++) {
int ttt = Integer.parseInt((ChangeCurrent.get(i).toString())) + 1;
ChangeCurrent.set(i,new Integer(ttt));
}
}

public void checkAddChangeCurrent() {
if (!ChangeCurrent.isEmpty()) {
if (!ChangeTotal.isEmpty()) {
int tempCurrent = Integer.parseInt(ChangeCurrent.get(0).toString());
int tempTotal = Integer.parseInt(ChangeTotal.get(0).toString());
if (tempCurrent == tempTotal)
cut();
else if (tempCurrent > tempTotal) {
System.out.println("Error");
runFlag = false;
}
}
}
}

public void go() {
//System.out.println("go");
steps = (babyCount - 1) * imageWidth + 1;
newx = (int)((Point)Baby.get(0)).getX();
newy = (int)((Point)Baby.get(0)).getY();
headRect = new Rectangle(newx,newy,15,15);

for (int i = 0;i < Baby.size(); i++) {
switch (Integer.parseInt((BabyDir.get(i).toString()))) {
case 0://向上
newx = (int)((Point)Baby.get(i)).getX();
newy = (int)((Point)Baby.get(i)).getY() - 1;
ptadd = new Point(newx,newy);
Baby.set(i,ptadd);
BabyRectangle.set(i,ptadd);
break;

case 1://向右
newx = (int)((Point)Baby.get(i)).getX() + 1;
newy = (int)((Point)Baby.get(i)).getY();
ptadd = new Point(newx,newy);
Baby.set(i,ptadd);
BabyRectangle.set(i,ptadd);
break;

case 2://向下
newx = (int)((Point)Baby.get(i)).getX();
newy = (int)((Point)Baby.get(i)).getY() + 1;
ptadd = new Point(newx,newy);
Baby.set(i,ptadd);
BabyRectangle.set(i,ptadd);
break;

case 3://向左
newx = (int)((Point)Baby.get(i)).getX() - 1;
newy = (int)((Point)Baby.get(i)).getY();
ptadd = new Point(newx,newy);
Baby.set(i,ptadd);
BabyRectangle.set(i,ptadd);
break;
}
}
}

void doMessage(int message)
{
{
if (message == key_up) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 0) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 2) {
BabyDir.set(0,new Integer(0));
ptemp = (Point)Baby.get(0);
Change.add(ptemp);
ChangeDir.add(new Integer(0));
ChangeCurrent.add(new Integer(0));
ChangeTotal.add(new Integer(steps));
System.out.println("up");
}}}

else
if (message == key_right) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 1) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 3) {
BabyDir.set(0,new Integer(1));
ptemp = (Point)Baby.get(0);
Change.add(ptemp);
ChangeDir.add(new Integer(1));
ChangeCurrent.add(new Integer(0));
ChangeTotal.add(new Integer(steps));
System.out.println("right");
}}}

else
if (message == key_down) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 2) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 0) {
BabyDir.set(0,new Integer(2));
ptemp = (Point)Baby.get(0);
Change.add(ptemp);
ChangeDir.add(new Integer(2));
ChangeCurrent.add(new Integer(0));
ChangeTotal.add(new Integer(steps));
System.out.println("down");

}}}

else

if (message == key_left) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 3) {
if (Integer.parseInt((BabyDir.get(0).toString())) != 1) {
BabyDir.set(0,new Integer(3));
ptemp = (Point)Baby.get(0);
Change.add(ptemp);
ChangeDir.add(new Integer(3));
ChangeCurrent.add(new Integer(0));
ChangeTotal.add(new Integer(steps));
System.out.println("left");
}}}

/*else if (ke.getKeyChar() == ke.VK_1) {
if (sleepTime > 1) sleepTime--;
}

else if (ke.getKeyChar() == ke.VK_2) sleepTime++;
*/

else
if (message == key_pause) {
if (runFlag ) {
runFlag = !runFlag;
}
else {
runFlag = !runFlag;
}
}

else
if (message == key_reset) newGame();
}
}

public void goOne() {
if (runFlag == true) {
if (gameFlag == true) {
food();
checkGame();
checkDir();
go();
addChangeCurrent();
checkAddChangeCurrent();
checkEat();
if (eated == true) addNode();
}
}
}

public void newGame() {

sleepTime = 5;
x = startx;
y = starty;
babyCount = 6;
while (!Baby.isEmpty()) Baby.remove(0);
while (!BabyDir.isEmpty()) BabyDir.remove(0);
while (!BabyRectangle.isEmpty()) BabyRectangle.remove(0);



while (!Change.isEmpty()) Change.remove(0);
while (!ChangeDir.isEmpty()) ChangeDir.remove(0);
while (!ChangeCurrent.isEmpty()) ChangeCurrent.remove(0);
while (!ChangeTotal.isEmpty()) ChangeTotal.remove(0);

for (int j = 0;j < 6;j++) {
pt = new Point(x,y);
x = x+imageWidth;
add(pt,3);
BabyRectangle.add(pt);
eated = true;
gameFlag = true;
runFlag = true;
}
}
}

class AboutDialog extends JPanel {
private int WIDTH = 310,HEIGHT = 200;
//public BabyPanel babyPanel;
public JLabel jl_auther,jl_date,jl_company,jl_qq,jl_email;
public JButton jb_ok;
private JDialog dialog;
public JPanel jp1,jp2;
public Border border;
public AboutDialog() {
//this.babyPanel = babypanel;
setSize(WIDTH,HEIGHT);
setLayout(new BorderLayout());
jp1 = new JPanel();

jp2 = new JPanel();
jp1.setLayout(new GridLayout(5,1,10,10));
border = BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),"Info");
jp1.setBorder(border);
jl_auther = new JLabel("Auther: 张恩来");
jl_date = new JLabel("Date: 2004-11-3");
jl_company = new JLabel("Company: 山东济南中创软件");
jl_qq = new JLabel("QQ: 36798636");
jl_email = new JLabel("E-Mail: zhang_elai@cvicse.com");
jb_ok = new JButton("OK");
jb_ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
setRunFlag(true);
dialog.setVisible(false);
}
});
jp1.add(jl_auther);
jp1.add(jl_date);
jp1.add(jl_company);
jp1.add(jl_qq);
jp1.add(jl_email);

jp2.add(jb_ok);

add(jp1,BorderLayout.NORTH);
add(jp2,BorderLayout.SOUTH);
}

public void setRunFlag(boolean flag) {
//babyPanel.user2.runFlag = flag;
}

public void showDialog(Component parent,String title) {

JFrame owner = null;
if (parent instanceof JFrame)
owner = (JFrame) parent;

if (dialog == null || dialog.getOwner() != owner) {
owner = null;
dialog = new JDialog(owner,false);
dialog.getContentPane().add(this);
dialog.pack();
}

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
dialog.setLocation((int)(screenSize.getWidth()/2 - WIDTH/2),(int)(screenSize.getHeight()/2 - HEIGHT/2));

dialog.setTitle(title);
dialog.show();

}

 
原创粉丝点击