游戏编程java教程
/**
* File: ControlPanel.java
* User:相思无偿
* Date: 2004.12.3
* Describe: 俄罗斯方块的 Java 实现
*/
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import java.awt.*;
import java.awt.event.*;
/**
* 控制面板类,继承自JPanel.
* 上边安放预显窗口、等级、得分、控制按钮
* 主要用来控制游戏进程。
*/
class ControlPanel extends JPanel {
private JTextField
tfLevel = new JTextField("" + ErsBlocksGame.DEFAULT_LEVEL),
tfScore = new JTextField("0");
private JButton
btPlay = new JButton("Play"),
btPause = new JButton("Pause"),
btStop = new JButton("Stop"),
btTurnLevelUp = new JButton("Turn hard"),
btTurnLevelDown = new JButton("Turn easy");
private JPanel plTip = new JPanel(new BorderLayout());
private TipPanel plTipBlock = new TipPanel();
private JPanel plInfo = new JPanel(new GridLayout(4, 1));
private JPanel plButton = new JPanel(new GridLayout(5, 1));
private Timer timer;
private ErsBlocksGame game;
private Border border = new EtchedBorder(
EtchedBorder.RAISED, Color.white, new Color(148, 145, 140));
/**
* 控制面板类的构造函数
* @param game ErsBlocksGame, ErsBoxesGame类的一个实例引用,
* 方便直接控制ErsBoxesGame类的行为。
*/
public ControlPanel(final ErsBlocksGame game) {
setLayout(new GridLayout(3, 1, 0, 4));
this.game = game;
plTip.add(new JLabel("Next block"), BorderLayout.NORTH);
plTip.add(plTipBlock);
plTip.setBorder(border);
plInfo.add(new JLabel("Level"));
plInfo.add(tfLevel);
plInfo.add(new JLabel("Score"));
plInfo.add(tfScore);
plInfo.setBorder(border);
tfLevel.setEditable(false);
tfScore.setEditable(false);
plButton.add(btPlay);
plButton.add(btPause);
plButton.add(btStop);
plButton.add(btTurnLevelUp);
plButton.add(btTurnLevelDown);
plButton.setBorder(border);
add(plTip);
add(plInfo);
add(plButton);
addKeyListener(new ControlKeyListener());
btPlay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
game.playGame();
}
});
btPause.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
if (btPause.getText().equals(new String("Pause"))) {
game.pauseGame();
} else {
game.resumeGame();
}
}
});
btStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
game.stopGame();
}
});
btTurnLevelUp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
try {
int level = Integer.parseInt(tfLevel.getText());
if (level < ErsBlocksGame.MAX_LEVEL)
tfLevel.setText("" + (level + 1));
} catch (NumberFormatException e) {
}
requestFocus();
}
});
btTurnLevelDown.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
try {
int level = Integer.parseInt(tfLevel.getText());
if (level > 1)
tfLevel.setText("" + (level - 1));
} catch (NumberFormatException e) {
}
requestFocus();
}
});
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent ce) {
plTipBlock.fanning();
}
});
timer = new Timer(500, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
tfScore.setText("" + game.getScore());
int scoreForLevelUpdate =
game.getScoreForLevelUpdate();
if (scoreForLevelUpdate >= ErsBlocksGame.PER_LEVEL_SCORE
&& scoreForLevelUpdate > 0)
game.levelUpdate();
}
});
timer.start();
}
/**
* 设置预显窗口的样式,
* @param style int,对应ErsBlock类的STYLES中的28个值
*/
public void setTipStyle(int style) {
plTipBlock.setStyle(style);
}
/**
* 取得用户设置的游戏等级。
* @return int, 难度等级,1 - ErsBlocksGame.MAX_LEVEL
*/
public int getLevel() {
int level = 0;
try {
level = Integer.parseInt(tfLevel.getText());
} catch (NumberFormatException e) {
}
return level;
}
/**
* 让用户修改游戏难度等级。
* @param level 修改后的游戏难度等级
*/
public void setLevel(int level) {
if (level > 0 && level < 11) tfLevel.setText("" + level);
}
/**
* 设置"开始"按钮的状态。
*/
public void setPlayButtonEnable(boolean enable) {
btPlay.setEnabled(enable);
}
public void setPauseButtonLabel(boolean pause) {
btPause.setText(pause ? "Pause" : "Continue");
}
/**
* 重置控制面板
*/
public void reset() {
tfScore.setText("0");
plTipBlock.setStyle(0);
}
/**
* 重新计算TipPanel里的boxes[][]里的小框的大小
*/
public void fanning() {
plTipBlock.fanning();
}
/**
* 预显窗口的实现细节类
*/
private class TipPanel extends JPanel {
private Color backColor = Color.darkGray, frontColor = Color.lightGray;
private ErsBox[][] boxes =
new ErsBox[ErsBlock.BOXES_ROWS][ErsBlock.BOXES_COLS];
private int style, boxWidth, boxHeight;
private boolean isTiled = false;
/**
* 预显窗口类构造函数
*/
public TipPanel() {
for (int i = 0; i < boxes.length; i++) {
for (int j = 0; j < boxes[i].length; j++)
boxes[i][j] = new ErsBox(false);
}
}
/**
* 预显窗口类构造函数
* @param backColor Color, 窗口的背景色
* @param frontColor Color, 窗口的前景色
*/
public TipPanel(Color backColor, Color frontColor) {
this();
this.backColor = backColor;
this.frontColor = frontColor;
}
/**
* 设置预显窗口的方块样式
* @param style int,对应ErsBlock类的STYLES中的28个值
*/
public void setStyle(int style) {
this.style = style;
repaint();
}
/**
* 覆盖JComponent类的函数,画组件。
* @param g 图形设备环境
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (!isTiled) fanning();
int key = 0x8000;
for (int i = 0; i < boxes.length; i++) {
for (int j = 0; j < boxes[i].length; j++) {
Color color = (((key & style) != 0) ? frontColor : backColor);
g.setColor(color);
g.fill3DRect(j * boxWidth, i * boxHeight,
boxWidth, boxHeight, true);
key >>= 1;
}
}
}
/**
* 根据窗口的大小,自动调整方格的尺寸
*/
public void fanning() {
boxWidth = getSize().width / ErsBlock.BOXES_COLS;
boxHeight = getSize().height / ErsBlock.BOXES_ROWS;
isTiled = true;
}
}
private class ControlKeyListener extends KeyAdapter {
public void keyPressed(KeyEvent ke) {
if (!game.isPlaying()) return;
ErsBlock block = game.getCurBlock();
switch (ke.getKeyCode()) {
case KeyEvent.VK_DOWN:
block.moveDown();
break;
case KeyEvent.VK_LEFT:
block.moveLeft();
break;
case KeyEvent.VK_RIGHT:
block.moveRight();
break;
case KeyEvent.VK_UP:
block.turnNext();
break;
default:
break;
}
}
}
}
㈡ 多用户五子棋游戏 JAVA编程
java网络五子棋
下面的源代码分为4个文件;
chessClient.java:客户端主程序。
chessInterface.java:客户端的界面。
chessPad.java:棋盘的绘制。
chessServer.java:服务器端。
可同时容纳50个人同时在线下棋,聊天。
没有加上详细注释,不过绝对可以运行,j2sdk1.4下通过。
/*********************************************************************************************
1.chessClient.java
**********************************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
class clientThread extends Thread
{
chessClient chessclient;
clientThread(chessClient chessclient)
{
this.chessclient=chessclient;
}
public void acceptMessage(String recMessage)
{
if(recMessage.startsWith("/userlist "))
{
StringTokenizer userToken=new StringTokenizer(recMessage," ");
int userNumber=0;
chessclient.userpad.userList.removeAll();
chessclient.inputpad.userChoice.removeAll();
chessclient.inputpad.userChoice.addItem("所有人");
while(userToken.hasMoreTokens())
{
String user=(String)userToken.nextToken(" ");
if(userNumber>0 && !user.startsWith("[inchess]"))
{
chessclient.userpad.userList.add(user);
chessclient.inputpad.userChoice.addItem(user);
}
userNumber++;
}
chessclient.inputpad.userChoice.select("所有人");
}
else if(recMessage.startsWith("/yourname "))
{
chessclient.chessClientName=recMessage.substring(10);
chessclient.setTitle("Java五子棋客户端 "+"用户名:"+chessclient.chessClientName);
}
else if(recMessage.equals("/reject"))
{
try
{
chessclient.chesspad.statusText.setText("不能加入游戏");
chessclient.controlpad.cancelGameButton.setEnabled(false);
chessclient.controlpad.joinGameButton.setEnabled(true);
chessclient.controlpad.creatGameButton.setEnabled(true);
}
catch(Exception ef)
{
chessclient.chatpad.chatLineArea.setText("chessclient.chesspad.chessSocket.close无法关闭");
}
chessclient.controlpad.joinGameButton.setEnabled(true);
}
else if(recMessage.startsWith("/peer "))
{
chessclient.chesspad.chessPeerName=recMessage.substring(6);
if(chessclient.isServer)
{
chessclient.chesspad.chessColor=1;
chessclient.chesspad.isMouseEnabled=true;
chessclient.chesspad.statusText.setText("请黑棋下子");
}
else if(chessclient.isClient)
{
chessclient.chesspad.chessColor=-1;
chessclient.chesspad.statusText.setText("已加入游戏,等待对方下子...");
}
}
else if(recMessage.equals("/youwin"))
{
chessclient.isOnChess=false;
chessclient.chesspad.chessVictory(chessclient.chesspad.chessColor);
chessclient.chesspad.statusText.setText("对方退出,请点放弃游戏退出连接");
chessclient.chesspad.isMouseEnabled=false;
}
else if(recMessage.equals("/OK"))
{
chessclient.chesspad.statusText.setText("创建游戏成功,等待别人加入...");
}
else if(recMessage.equals("/error"))
{
chessclient.chatpad.chatLineArea.append("传输错误:请退出程序,重新加入 \n");
}
else
{
chessclient.chatpad.chatLineArea.append(recMessage+"\n");
chessclient.chatpad.chatLineArea.setCaretPosition(
chessclient.chatpad.chatLineArea.getText().length());
}
}
public void run()
{
String message="";
try
{
while(true)
{
message=chessclient.in.readUTF();
acceptMessage(message);
}
}
catch(IOException es)
{
}
}
}
public class chessClient extends Frame implements ActionListener,KeyListener
{
userPad userpad=new userPad();
chatPad chatpad=new chatPad();
controlPad controlpad=new controlPad();
chessPad chesspad=new chessPad();
inputPad inputpad=new inputPad();
Socket chatSocket;
DataInputStream in;
DataOutputStream out;
String chessClientName=null;
String host=null;
int port=4331;
boolean isOnChat=false; //在聊天?
boolean isOnChess=false; //在下棋?
boolean isGameConnected=false; //下棋的客户端连接?
boolean isServer=false; //如果是下棋的主机
boolean isClient=false; //如果是下棋的客户端
Panel southPanel=new Panel();
Panel northPanel=new Panel();
Panel centerPanel=new Panel();
Panel westPanel=new Panel();
Panel eastPanel=new Panel();
chessClient()
{
super("Java五子棋客户端");
setLayout(new BorderLayout());
host=controlpad.inputIP.getText();
westPanel.setLayout(new BorderLayout());
westPanel.add(userpad,BorderLayout.NORTH);
westPanel.add(chatpad,BorderLayout.CENTER);
westPanel.setBackground(Color.pink);
inputpad.inputWords.addKeyListener(this);
chesspad.host=controlpad.inputIP.getText();
centerPanel.add(chesspad,BorderLayout.CENTER);
centerPanel.add(inputpad,BorderLayout.SOUTH);
centerPanel.setBackground(Color.pink);
controlpad.connectButton.addActionListener(this);
controlpad.creatGameButton.addActionListener(this);
controlpad.joinGameButton.addActionListener(this);
controlpad.cancelGameButton.addActionListener(this);
controlpad.exitGameButton.addActionListener(this);
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(false);
southPanel.add(controlpad,BorderLayout.CENTER);
southPanel.setBackground(Color.pink);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(isOnChat)
{
try
{
chatSocket.close();
}
catch(Exception ed)
{
}
}
if(isOnChess || isGameConnected)
{
try
{
chesspad.chessSocket.close();
}
catch(Exception ee)
{
}
}
System.exit(0);
}
public void windowActivated(WindowEvent ea)
{
}
});
add(westPanel,BorderLayout.WEST);
add(centerPanel,BorderLayout.CENTER);
add(southPanel,BorderLayout.SOUTH);
pack();
setSize(670,548);
setVisible(true);
setResizable(false);
validate();
}
public boolean connectServer(String serverIP,int serverPort) throws Exception
{
try
{
chatSocket=new Socket(serverIP,serverPort);
in=new DataInputStream(chatSocket.getInputStream());
out=new DataOutputStream(chatSocket.getOutputStream());
clientThread clientthread=new clientThread(this);
clientthread.start();
isOnChat=true;
return true;
}
catch(IOException ex)
{
chatpad.chatLineArea.setText("chessClient:connectServer:无法连接,建议重新启动程序 \n");
}
return false;
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==controlpad.connectButton)
{
host=chesspad.host=controlpad.inputIP.getText();
try
{
if(connectServer(host,port))
{
chatpad.chatLineArea.setText("");
controlpad.connectButton.setEnabled(false);
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
chesspad.statusText.setText("连接成功,请创建游戏或加入游戏");
}
}
catch(Exception ei)
{
chatpad.chatLineArea.setText("controlpad.connectButton:无法连接,建议重新启动程序 \n");
}
}
if(e.getSource()==controlpad.exitGameButton)
{
if(isOnChat)
{
try
{
chatSocket.close();
}
catch(Exception ed)
{
}
}
if(isOnChess || isGameConnected)
{
try
{
chesspad.chessSocket.close();
}
catch(Exception ee)
{
}
}
System.exit(0);
}
if(e.getSource()==controlpad.joinGameButton)
{
String selectedUser=userpad.userList.getSelectedItem();
if(selectedUser==null || selectedUser.startsWith("[inchess]") ||
selectedUser.equals(chessClientName))
{
chesspad.statusText.setText("必须先选定一个有效用户");
}
else
{
try
{
if(!isGameConnected)
{
if(chesspad.connectServer(chesspad.host,chesspad.port))
{
isGameConnected=true;
isOnChess=true;
isClient=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName);
}
}
else
{
isOnChess=true;
isClient=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName);
}
}
catch(Exception ee)
{
isGameConnected=false;
isOnChess=false;
isClient=false;
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chatpad.chatLineArea.setText("chesspad.connectServer无法连接 \n"+ee);
}
}
}
if(e.getSource()==controlpad.creatGameButton)
{
try
{
if(!isGameConnected)
{
if(chesspad.connectServer(chesspad.host,chesspad.port))
{
isGameConnected=true;
isOnChess=true;
isServer=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName);
}
}
else
{
isOnChess=true;
isServer=true;
controlpad.creatGameButton.setEnabled(false);
controlpad.joinGameButton.setEnabled(false);
controlpad.cancelGameButton.setEnabled(true);
chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName);
}
}
catch(Exception ec)
{
isGameConnected=false;
isOnChess=false;
isServer=false;
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
ec.printStackTrace();
chatpad.chatLineArea.setText("chesspad.connectServer无法连接 \n"+ec);
}
}
if(e.getSource()==controlpad.cancelGameButton)
{
if(isOnChess)
{
chesspad.chessthread.sendMessage("/giveup "+chessClientName);
chesspad.chessVictory(-1*chesspad.chessColor);
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chesspad.statusText.setText("请建立游戏或者加入游戏");
}
if(!isOnChess)
{
controlpad.creatGameButton.setEnabled(true);
controlpad.joinGameButton.setEnabled(true);
controlpad.cancelGameButton.setEnabled(false);
chesspad.statusText.setText("请建立游戏或者加入游戏");
}
isClient=isServer=false;
}
}
public void keyPressed(KeyEvent e)
{
TextField inputWords=(TextField)e.getSource();
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
if(inputpad.userChoice.getSelectedItem().equals("所有人"))
{
try
{
out.writeUTF(inputWords.getText());
inputWords.setText("");
}
catch(Exception ea)
{
chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 \n");
userpad.userList.removeAll();
inputpad.userChoice.removeAll();
inputWords.setText("");
controlpad.connectButton.setEnabled(true);
}
}
else
{
try
{
out.writeUTF("/"+inputpad.userChoice.getSelectedItem()+" "+inputWords.getText());
inputWords.setText("");
}
catch(Exception ea)
{
chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 \n");
userpad.userList.removeAll();
inputpad.userChoice.removeAll();
inputWords.setText("");
controlpad.connectButton.setEnabled(true);
}
}
}
}
public void keyTyped(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
}
public static void main(String args[])
{
chessClient chessClient=new chessClient();
}
}
/******************************************************************************************
下面是:chessInteface.java
******************************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class userPad extends Panel
{
List userList=new List(10);
userPad()
{
setLayout(new BorderLayout());
for(int i=0;i<50;i++)
{
userList.add(i+"."+"没有用户");
}
add(userList,BorderLayout.CENTER);
}
}
class chatPad extends Panel
{
TextArea chatLineArea=new TextArea("",18,30,TextArea.SCROLLBARS_VERTICAL_ONLY);
chatPad()
{
setLayout(new BorderLayout());
add(chatLineArea,BorderLayout.CENTER);
}
}
class controlPad extends Panel
{
Label IPlabel=new Label("IP",Label.LEFT);
TextField inputIP=new TextField("localhost",10);
Button connectButton=new Button("连接主机");
Button creatGameButton=new Button("建立游戏");
Button joinGameButton=new Button("加入游戏");
Button cancelGameButton=new Button("放弃游戏");
Button exitGameButton=new Button("关闭程序");
controlPad()
{
setLayout(new FlowLayout(FlowLayout.LEFT));
setBackground(Color.pink);
add(IPlabel);
add(inputIP);
add(connectButton);
add(creatGameButton);
add(joinGameButton);
add(cancelGameButton);
add(exitGameButton);
}
}
class inputPad extends Panel
{
TextField inputWords=new TextField("",40);
Choice userChoice=new Choice();
inputPad()
{
setLayout(new FlowLayout(FlowLayout.LEFT));
for(int i=0;i<50;i++)
{
userChoice.addItem(i+"."+"没有用户");
}
userChoice.setSize(60,24);
add(userChoice);
add(inputWords);
}
}
/**********************************************************************************************
下面是:chessPad.java
**********************************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
class chessThread extends Thread
{
chessPad chesspad;
chessThread(chessPad chesspad)
{
this.chesspad=chesspad;
}
public void sendMessage(String sndMessage)
{
try
{
chesspad.outData.writeUTF(sndMessage);
}
catch(Exception ea)
{
System.out.println("chessThread.sendMessage:"+ea);
}
}
public void acceptMessage(String recMessage)
{
if(recMessage.startsWith("/chess "))
{
StringTokenizer userToken=new StringTokenizer(recMessage," ");
String chessToken;
String[] chessOpt={"-1","-1","0"};
int chessOptNum=0;
while(userToken.hasMoreTokens())
{
chessToken=(String)userToken.nextToken(" ");
if(chessOptNum>=1 && chessOptNum<=3)
{
chessOpt[chessOptNum-1]=chessToken;
}
chessOptNum++;
}
chesspad.netChessPaint(Integer.parseInt(chessOpt[0]),Integer.parseInt(chessOpt[1]),Integer.parseInt(chessOpt[2]));
}
else if(recMessage.startsWith("/yourname "))
{
chesspad.chessSelfName=recMessage.substring(10);
}
else if(recMessage.equals("/error"))
{
chesspad.statusText.setText("错误:没有这个用户,请退出程序,重新加入");
}
else
{
//System.out.println(recMessage);
}
}
public void run()
{
String message="";
try
{
while(true)
{
message=chesspad.inData.readUTF();
acceptMessage(message);
}
}
catch(IOException es)
{
}
}
}
class chessPad extends Panel implements MouseListener,ActionListener
{
int chessPoint_x=-1,chessPoint_y=-1,chessColor=1;
int chessBlack_x[]=new int[200];
int chessBlack_y[]=new int[200];
int chessWhite_x[]=new int[200];
int chessWhite_y[]=new int[200];
int chessBlackCount=0,chessWhiteCount=0;
int chessBlackWin=0,chessWhiteWin=0;
boolean isMouseEnabled=false,isWin=false,isInGame=false;
TextField statusText=new TextField("请先连接服务器");
Socket chessSocket;
DataInputStream inData;
DataOutputStream outData;
String chessSelfName=null;
String chessPeerName=null;
String host=null;
int port=4331;
chessThread chessthread=new chessThread(this);
chessPad()
{
setSize(440,440);
setLayout(null);
setBackground(Color.pink);
addMouseListener(this);
add(statusText);
statusText.setBounds(40,5,360,24);
statusText.setEditable(false);
}
public boolean connectServer(String ServerIP,int ServerPort) throws Exception
{
try
{
chessSocket=new Socket(ServerIP,ServerPort);
inData=new DataInputStream(chessSocket.getInputStream());
outData=new DataOutputStream(chessSocket.getOutputStream());
chessthread.start();
return true;
}
catch(IOException ex)
{
statusText.setText("chessPad:connectServer:无法连接 \n");
}
return false;
}
public void chessVictory(int chessColorWin)
{
this.removeAll();
for(int i=0;i<=chessBlackCount;i++)
{
chessBlack_x[i]=0;
chessBlack_y[i]=0;
}
for(int i=0;i<=chessWhiteCount;i++)
{
chessWhite_x[i]=0;
chessWhite_y[i]=0;
}
chessBlackCount=0;
chessWhiteCount=0;
add(statusText);
statusText.setBounds(40,5,360,24);
if(chessColorWin==1)
{ chessBlackWin++;
statusText.setText("黑棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待白棋下子...");
}
else if(chessColorWin==-1)
{
chessWhiteWin++;
statusText.setText("白棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待黑棋下子...");
}
}
public void getLocation(int a,int b,int color)
{
if(color==1)
{
chessBlack_x[chessBlackCount]=a*20;
chessBlack_y[chessBlackCount]=b*20;
chessBlackCount++;
}
else if(color==-1)
{
chessWhite_x[chessWhiteCount]=a*20;
chessWhite_y[chessWhiteCount]=b*20;
chessWhiteCount++;
}
}
public boolean checkWin(int a,int b,int checkColor)
{
int step=1,chessLink=1,chessLinkTest=1,chessCompare=0;
if(checkColor==1)
{
chessLink=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a+step)*20==chessBlack_x[chessCompare]) && ((b*20)==chessBlack_y[chessCompare]))
{
chessLink=chessLink+1;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a-step)*20==chessBlack_x[chessCompare]) && (b*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if((a*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if((a*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a-step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a+step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
chessLink=1;
chessLinkTest=1;
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a+step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(chessLinkTest+1))
chessLinkTest++;
else
break;
}
for(step=1;step<=4;step++)
{
for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++)
{
if(((a-step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
㈢ Java游戏编程的图书信息(一)
ISBN: 7030129423
印刷时间: 2004-6第1次印刷
开 本: 16
价 格(元): 68 第一部分 Java游戏基础
第1章 Java线程 1. 1 什么是线程 1. 2 在Java中生成与运行线程 1. 2. 1 扩展Thread类 1. 2. 2 实现Runnable接口 1. 2. 3 使用匿名内类 1. 2. 4 等待线程完成 1. 2. 5 休眠线程 1. 3 同步 1. 3. 1 为什么要同步 1. 3. 2 如何同步 1. 3. 3 同步是什么 1. 3. 4 不同步是什么 1. 3. 5 避免死锁 1. 4 使用wait 与notify 1. 5 Java事件模型 1. 6 何时使用线程 1. 7 何时不使用线程 1. 8 线程池 1. 9 小结
第2章 二维图形与动画 2. 1 全屏图形 2. 1. 1 屏幕布局 2. 1. 2 像素颜色与位深度 2. 1. 3 刷新率 2. 1. 4 将显示切换到全屏方式 2. 1. 5 抗齿边 2. 1. 6 选用显示方式 2. 2 图像 2. 2. 1 透明度 2. 2. 2 文件格式2. 2. 3 读取图像 2. 2. 4 硬件加速图像 2. 2. 5 图形绘制基准程序 2. 2. 6 动画 2. 2. 7 活动绘制 2. 2. 8 动画循环 2. 3 避免闪烁与裂开 2. 3. 1 双缓存 2. 3. 2 翻页2. 3. 3 监视刷新与裂开 2. 3. 4 BufferStrategy类 2. 3. 5 生成屏幕管理器 2. 3. 6 幽灵 2. 4 简单效果 2. 5 小结
第3章 交互性与用户界面 3. 1 AWT事件模型 3. 2 键盘输入 3. 3 鼠标输入 3. 4 通过鼠标移动的观看模式 3. 5 创建输入管理器 3. 6 使用输入管理器 3. 6. 1 暂停游戏 3. 6. 2 增加重力 3. 7 设计直观用户界面 3. 8 使用Swing组件 3. 8. 1 Swing基础 3. 8. 2 在全屏方式中使用Swing 3. 9 创建简单菜单 3. 10 游戏者配置键盘 3. 11 小结
第4章 声效与音乐 4. 1 声音基础 4. 2 JavaSoundAPl 4. 2. 1 打开声音文件 4. 2. 2 使用Line 4. 3 播放声音 4. 4 创建实时声音过滤体系结构 4. 5 创建实时回响过滤 4. 6 仿真三维声音 4. 6. 1 生成三维过滤器的思路 4. 6. 2 实现三维过滤器 4. 6. 4 测试三维过滤器 4. 7 创建声音管理器 4. 7. 1 Sound类 4. 7. 2 SoundManager类 4. 7. 3 线程局部变量4. 8 播放音乐 4. 8. 1 播放光盘声频 4. 8. 2 播放MP3与OggVorbis 4. 8. 3 播放MIDI音乐4. 8. 4 生成适配音乐 4. 9 小结
第5章 创建二维平台游戏 5. 1 生成基于地砖的地图 5. 1. 1 实现Tile地图 5. 1. 2 读取Tile地图 5. 1. 3 绘制Tile地图 5. 1. 4 绘制幽灵 5. 1. 5 视差滚动 5. 1. 6 充电器 5. 1. 7 简单坏人 5. 2 碰撞探测 5. 2. 1 探测碰撞 5. 2. 2 处理碰撞 5. 2. 3 幽灵碰撞 5. 3 完成与加速 5. 4 生成可执行的.jar文件 5. 5 扩展游戏 5. 6 小结
第6章 多人游戏 6. 1 Java I/O库的变革 6. 1. 1 JDK 1. 4NIO库的概述 6. 1. 2 信道 6. 1. 3 缓存 6. 1. 4 选择器与SelectionKeys 6. 2 基本多方游戏应用程序6. 2. 1 服务器端 6. 2. 2 建立与运行服务器 6. 2. 3 客户端6. 2. 4 建立与运行客户机 6. 3 多方游戏服务器框架 6. 3. 1 设计目标与战术 6. 3. 2 设计 6. 3. 3 共用类与接口 6. 3. 4 服务器实现 6. 3. 5 客户机 6. 4 RPS游戏 石头. 布. 剪刀 6. 4. 1 类 6. 4. 2 运行RPS游戏 6. 5 建立框架 6. 5. 1 客户机GUI 6. 5. 2 持久性 6. 5. 3 伙伴名单. 门厅与闲聊 6. 6 服务器管理 6. 6. 1 登记 6. 6. 2 启动/关闭 6. 6. 3 服务器管理控制台 6. 6. 4 游戏监查 6. 7 高级课题 6. 7. 1 切断与重接 6. 7. 2 HTTP隧道 6. 7. 3 量化测试 6. 7. 4 Modem连接 6. 7. 5 性能剖析与统计 6. 7. 6 性能调整 6. 8 小结
第二部分 三维图形与高级技术
第7章 三维图形 7. 1 三维绘制的类型 7. 2 回顾曾经学过的数学 7. 2. 1 三角学和直角三角形 7. 2. 2 向量数学 7. 3 3D的基础 7. 4 3D的数学 7. 5 多边形 7. 6 三维变换 7. 6. 1 旋转 7. 6. 2 包装旋转和平移变换 7. 6. 3 采用变换 7. 6. 4 旋转顺序 7. 7 3D的简单管道 7. 8 镜头移动 7. 9 实体和背面删除 7. 9. 1 点积 7. 9. 2 交积 7. 9. 3 再谈点积和交积 7. 10 扫描转换多边形 7. 11 三维剪取 7. 12 最后绘制管道 7. 13 小结
第8章 纹理贴图与照明 8. 1 透视正确纹理贴图的基础 8. 2 简单纹理贴图器 8. 3 优化纹理贴图 8. 3. 1 纹理的存储格式 8. 3. 2 原始优化 8. 3. 3 内联方法 8. 3. 4 快速纹理贴图演示程序 8. 4 简单灯光 8. 4. 1 扩散反射 8. 4. 2 环境光 8. 4. 3 光源强度 8. 4. 4 距离减弱 8. 4. 5 实现点光源 8. 5 实现纹理照明 8. 6 使用阴影图的高级照明 8. 6. 1 求出边界矩形 8. 6. 2 采用色档图 8. 6. 3 建立色档图 8. 6. 4 建立表面 8. 6. 5 缓存表面 8. 6. 6 阴影表面演示程序 8. 7 其他概念 8. 7. 1 深度提示 8. 7. 2 伪阴影 8. 7. 3 MIP贴图 8. 7. 4 双线性插值 8. 7. 5 三线性插值 8. 7. 6 法线图与深度 8. 7. 7 其他类型的光 8. 8 小结
第9章 三维对象 9. 1 表面消隐 9. 1. 1 油画算法 9. 1. 2 反油画算法 9. 1. 3 Z缓存 9. 1. 4 使用1/Z的Z缓存 9. 1. 5 计算Z深度 9. 2 三维动画 9. 2. 1 空间运动 9. 2. 2 角度运动 9. 3 多边形组 9. 4 从OBJ文件装入多边形组 9. 4. 1 0BJ文件格式 9. 4. 2 MTL文件格式 9. 5 游戏实体 9. 6 管理游戏实体 9. 7 综合起来 9. 8 改进 9. 9 小结
第10章 用BSP树管理三维视景 10. 1 BSP树简介 10. 2 二叉树基础 10. 3 一维BSP树 10. 4 二维BSP树 10. 4. 1 建立BSP树 10. 4. 2 BSP树遍历实例 10. 5 实现二维BSP树 10. 5. 1 BSPLine 10. 5. 2 确定点相对于直线的边 10. 5. 3 BSP多边形 10. 5. 4 遍历BSP树 10. 5. 5 中序遍历 10. 5. 6 由前到后遍历 10. 5. 7 树的建立 10. 5. 8 两条线求交 10. 5. 9 用直线剪取多边形 10. 5. 10 删除T形接头 10. 5. 11 测试BSP树 10. 6 从前到后画多边形 10. 7
第一个BSP树例子 10. 8 在视景中画实体 10. 9 从文中装入贴图 10. 10 综合起来 10. 11 改进 10. 12 小结
第11章 碰撞探测 11. 1 碰撞基础 11. 2 实体间碰撞 11. 2. 1 减少测试 11. 2. 2 边框球 11. 2. 3 边框圆柱 11. 2. 4 离散时间问题 11. 3 实体与世界碰撞 11. 3. 1 测试地板的边框 11. 3. 2 寻找特定位置的BSP叶 11. 3. 3 实现地板和天花板高度测试 11. 3. 4 测试墙的边框 11. 3. 5 BSP树的线段交点 11. 3. 6 角问题 11. 3. 7 实现实体/世界碰撞探测 11. 4 基本碰撞探测演示程序 11. 5 滑动与碰撞处理 11. 5. 1 实体间滑动 11. 5. 2 实体沿墙的滑动 11. 5. 3 重力与爬楼梯 实体沿地 面滑动 11. 5. 4 实现跳动 11. 6 碰撞探测与滑动演示程序 11. 7 改进 11. 8 小结
第12章 路径搜索 12. 1 路径寻找基础 12. 2 初步路径寻找方法 12. 3 A*算法基础 12. 4 采用A*算法 12. 5 BSP树与A*算法 12. 5. 1 门户 12. 5. 2 实现门户 12. 6 一般性路径寻找 12. 7 建立PathBot 12. 8 改进A*搜索 12. 9 小结
第13章 人工智能 13. 1 人工智能基础13. 2 减少Bot的神力 13. 2. 1 视觉 13. 2. 2 听觉 13. 3 状态机与响应 13. 4 概率机 13. 5 决策 13. 6 模式 13. 6. 1 躲避 13. 6. 2 攻击 13. 6. 3 跑开 13. 6. 4 瞄准 13. 6. 5 射击 13. 7 实体派生 13. 8 综合起来 13. 8. 1 大脑 13. 8. 2 健康与死亡 13. 9 进化 13. 9. 1 再生 13. 9. 2 进化Bot 13. 9. 3 演示改进 13. 10 进化 13. 11 小结
第14章 游戏脚本14. 1 关于脚本 14. 2 实现接触与释放通知 14. 3 游戏实体监听器 14. 4 脚本 14. 4. 1 设计脚本 14. 4. 2 嵌入BeanShell解释器14. 5 延迟事件 14. 6 综合起来 14. 7 改进 14. 8 小结
第15章 保存游戏 15. 1 游戏保存基础 15. 2 对游戏状态保存使用Java序列化 API 15. 2. 1 序列化简介 15. 2. 2 序列化基础 15. 2. 3 序列化规则 15. 2. 4 序列化问题 15. 2. 5 覆盖缺省行为 15. 3 生成游戏屏幕图形 15. 3. 1 生成屏幕略图图形 15. 3. 2 保存图形 15. 4 将游戏保存到正确目的地 15. 5 小结
第三部分 调整与完成游戏
第16章 优化技术 16. 1 优化规则 16. 2 剖析 16. 2. 1 基准测试 16. 2. 2 使用HotSpot剖析器 16. 3 HotSpot 16. 3. 1 Java特定优化 16. 3. 2 死亡代码消除 16. 3. 3 循环不变项提升 16. 3. 4 公共子表达式消除 16. 3. 5 常量传递 16. 3. 6 内联方法 16. 4 优化技巧 16. 4. 1 算法 16. 4. 2 移位 16. 4. 3 求模 16. 4. 4 乘法 16. 4. 5 指数 16. 4. 6 更多循环不变项提升 16. 4. 7 查找表 16. 4. 8 定点算术 16. 4. 9 异常 16. 4. 10 输入/输出 16. 4. 11 内存贴图文件 16. 5 内存使用与回收 16. 5. 1 Java堆与内存回收 16. 5. 2 监视内存回收 16. 5. 3 监视内存使用 16. 5. 4 调整堆 16. 5. 5 调用内存回收单元 16. 5. 6 减少对象生成 16. 5. 7 对象复用 16. 5. 8 对象池 16. 6 感觉性能 16. 7 小结
第17章 生成游戏图形与声音 17. 1 选择外观 17. 1. 1 寻找灵感 17. 1. 2 保持一致 17. 2 取得自由版权游戏媒体 17. 3 与艺术家和声效工程师合作 17. 4 工具 17. 5 生成声音 17. 6 生成纹理与幽灵 17. 6. 1 图形文件格式 17. 6. 2 生成无缝纹理 17. 6. 3 生成替换纹理 17. 6. 4 生成过渡纹理 17. 6. 5 生成多层纹理 17. 7 生成漂亮屏幕与HUD图形 17. 8 生成UI图形 17. 9 生成字体17. 10 小结
第18章 游戏设计与最后10% 18. 1 最后10% 18. 1. 1 效果 18. 1. 2 游戏状态机 18. 2 游戏设计要素 18. 2. 1 环境 18. 2. 2 故事要素 18. 2. 3 玩游戏 18. 2. 4 告诉用户怎么玩 18. 3 生成贴图编辑器18. 4 调试 18. 4. 1 调试Java2D问题 18. 4. 2 日志 18. 5 保护代码 18. 6 游戏部署 18. 7 JavaWebStart游戏部署 18. 7. 1 从jar文件取得资源 18. 7. 2 签名jar文件 18. 7. 3 生成JNLP文件 18. 7. 4 设置Web服务器 18. 8 自然编译游戏部署 18. 9 更新与补丁18. 10 带宽问题 18. 11 反馈与Beta测试18. 12 赚钱 18. 13 综合起来 18. 14 小结
第19章 未来 19. 1 Java的演变 19. 1. 1 Java社团 19. 1. 2 缺陷天堂 BugParade 19. 2 Java 1. 5 Tiger 19. 2. 1 一般 JSRl4 19. 2. 2 枚举 JSR201 19. 2. 3 静态导入口 JR201 19. 2. 4 改进for循环 JSR201 19. 2. 5 编译器API JSRl99 19. 2. 6 网络传输格式 JSR200 19. 2. 7 共享虚拟机JSR121 19. 3 Java平台需要什么 19. 3. 1 更多鼠标与键盘输入选项 19. 3. 2 游戏杆输入 19. 3. 3 硬件加速半透明图像 19. 3. 4 高精度定时器19. 3. 5 Linux中的硬件加速图形和全屏 方式 19. 3. 6 运行环境中的硬件加速三维 特性 19. 3. 7 HotSpotSIMD优化 19. 3. 8 更多字体光顺选项 19. 3. 9 其他情况 19. 4 新设备与Java Games Profile JSR134 19. 5 小结
Java 是一个由 Sun 公司开发而成的新一代编程语言。使用它可在各式各样不同机器、不同操作平台的网络环境中开发软件。
游戏编程属于软件开发。用编程制作软件属于编程,但是指在进行中,而一但编制完整就属于软件开发了。
㈣ Java游戏高级编程的内容简介
在第1章“配置开发环境”中,我向读者介绍了将要在整本书中使用的代码库。描述了这个库的设计,并给出了编译示例游戏的说明。可能会在游戏开发环境中使用的一些附加代码、图形和音频文件,也在本章确定了下来,还介绍了软件开发的一些流行工具。以模板的形式给出了一个演示Java游戏编程基础知识的游戏示例。
在第2章“部署框架”中,我们关注的重点是在可以安装在多种不同类型的平台上的一个框架中部署游戏。在动画线程管理技术的相关内容中,介绍了一个被广泛使用的框架接口以及applet生命周期。在对适合于游戏的不同发布而进行不同部署的选项进行了一个简要的回顾以后,给出了允许游戏部署在不同开发环境中而不需要任何修改的一个抽象层的源代码示例。
在第3章“Swing动画”中,介绍了一个基于Swing的动画库,这个动画库会在整本书中使用。这一章主要考虑的问题是动画的性能和灵活性。在介绍核心动画引擎类的源代码时简单介绍了优化权衡。
在第4章“动画库”中,介绍了通用动画任务的一个类集合。这些类提供了很多功能,例如场景管理和Sprite实现。它们也用来介绍怎样开发与核心动画引擎类互操作的游戏特定代码。
在第5章“高级图形技术”中,介绍了高级图形技术,包括硬件加速图形、多缓冲和全屏独占模式。给出了使这些技术的使用变得更加方便的可重用类和使用这些可重用类的示例游戏。对其中的每一个技术,都介绍了关于它们使用方法的一些限制。
在第6章“持久数据”中,对在各种部署框架中加载和保存游戏数据的机制进行了对比。在这个过程中还介绍了可以用于大多数游戏编程的可重用数据持久性的类库。对更加高级的持久性需求的其他选择也进行了考虑。
在第7章“游戏体系结构”中,介绍了适合于Java游戏开发的面向对象的软件体系结构的优点。使用这种体系结构的一个示例游戏是作为新游戏开发模板进行介绍的。本章还简单介绍了一下数据驱动的设计。
在第8章“A*算法”中,介绍了现在在游戏行业中最流行和最常用的一个人工智能(AI)算法的实现。本章还介绍了使用A*算法绕过障碍物寻找路径的示例。
在第9章“HTTP隧道技术”中,介绍一个可以在大部分Java游戏部署环境里常见的安全限制以内进行操作的一个联网库。本章还给出了一个示例,在这个示例中,数据在服务器和客户机之间进行传递。
在第10章“HTTP轮询机制”中,将联网库扩展以支持在线多玩家游戏。使用轮询来同步客户机和服务器上的游戏状态。在由单玩家游戏向多玩家联网游戏的转换中,介绍了我所推荐的软件体系结构的灵活性。
在第11章“HTTP Pulling机制”中,事件驱动的消息是作为轮询的另一个选择而推荐使用的。使用在前面两章中介绍的这些类,演示了这是怎样在无符号applet的安全限制以内实现的。使用这些技术进行进一步开发的一些建议已经超出了本书的范围,这里只进行简单的介绍。
本书合作站点
本书应该保持其“高级性”。为此,我专门为这本书建立了一个Web站点。从这个站点上,您能够订阅与本书相关的电子邮件列表,包括补充的指南和勘误表。您将能够测试和运行本书所介绍的示例游戏,并下载开放源代码库和用来创建这些游戏的公共领域的多媒体文件。针对老师,我已经在Creative Commons Attribution License下发布了我在讲授游戏开发课程中使用的课程提纲、幻灯片和布置给学生的作业。我也提供了我的联系方式,这样您可以将您的建议和意见反馈给我,以便我以后进行更正。
在开始阅读第1章以前,请先访问网站,并订阅Advanced Java Game Programming通知邮件列表。
IV
Java游戏高级编程