游戲編程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游戲高級編程