?? scrabblet.java
字號:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
/**
* 主要的applet類
**/
public class Scrabblet extends Applet implements ActionListener {
// 定義實例變量集合
private ServerConnection server; // 與服務器的連接
private String serverName; // 服務器的名字
private Bag bag; // 游戲中共用的字母袋
private Board board; // 棋盤
private boolean single = false;
private boolean ourturn;
private boolean seen_pass = false;
private Letter theirs[] = new Letter[7];
private String name;
private String others_name;
private Panel topPanel;
private Label prompt;
private TextField namefield;
private Button done;
private TextField chat;
// 定義變量,用于用戶界面管理
private List idList;
private Button challenge;
private Canvas ican;
/** 建立BorderLayout,創建splash屏幕畫布 */
public void init() {
setLayout(new BorderLayout());
serverName = getCodeBase().getHost();
if (serverName.equals(""))
serverName = "localhost";
ican = new IntroCanvas();
}
/** 當重新顯示程序所在頁面時調用該方法 */
public void start() {
try {
showStatus("Connecting to " + serverName);
server = new ServerConnection(this, serverName);
server.start();
showStatus("Connected: " + serverName);
if (name == null) {
prompt = new Label("Enter your name here:");
namefield = new TextField(20);
namefield.addActionListener(this);
topPanel = new Panel();
topPanel.setBackground(new Color(255, 255, 200));
topPanel.add(prompt);
topPanel.add(namefield);
add("North", topPanel);
add("Center", ican);
} else {
if (chat != null) {
remove(chat);
remove(board);
remove(done);
}
nameEntered(name);
}
validate();
} catch (Exception e) {
single = true;
start_Game((int)(0x7fffffff * Math.random()));
}
}
/** 離開程序時調用該方法 */
public void stop() {
if (!single)
server.quit();
}
/** 當新用戶加入時調用該方法 */
void add(String id, String hostname, String name) {
delete(id); // in case it is already there.
idList.add("(" + id + ") " + name + "@" + hostname);
showStatus("Choose a player from the list");
}
/** 當用戶不想把自己標記為可選對手時調用此方法 */
void delete(String id) {
for (int i = 0; i < idList.getItemCount(); i++) {
String s = idList.getItem(i);
s = s.substring(s.indexOf("(") + 1, s.indexOf(")"));
if (s.equals(id)) {
idList.remove(i);
break;
}
}
if (idList.getItemCount() == 0 && bag == null)
showStatus("Wait for other players to arrive.");
}
/** 根據id來獲取名字,如果沒找到id,返回null */
private String getName(String id) {
for (int i = 0; i < idList.getItemCount(); i++) {
String s = idList.getItem(i);
String id1 = s.substring(s.indexOf("(") + 1, s.indexOf(")"));
if (id1.equals(id)) {
return s.substring(s.indexOf(" ") + 3, s.indexOf("@"));
}
}
return null;
}
/** 當另外一個用戶向本地用戶挑戰時,ServerConnection調用該方法 */
void challenge(String id) {
ourturn = false;
int seed = (int)(0x7fffffff * Math.random());
others_name = getName(id); // 他是誰?
showStatus("challenged by " + others_name);
// 確認信息
server.accept(id, seed);
server.delete();
start_Game(seed);
}
/** 接受挑戰 */
void accept(String id, int seed) {
ourturn = true;
others_name = getName(id);
server.delete();
start_Game(seed);
}
/** 用戶在對話框中輸入時, 服務器調用該方法 */
void chat(String id, String s) {
showStatus(others_name + ": " + s);
}
/** 對手每放置一個方格,調用一次move()方法 */
void move(String letter, int x, int y) {
for (int i = 0; i < 7; i++) {
if (theirs[i] != null && theirs[i].getSymbol().equals(letter)) {
Letter already = board.getLetter(x, y);
if (already != null) {
board.moveLetter(already, 15, 15);
}
board.moveLetter(theirs[i], x, y);
board.commitLetter(theirs[i]);
theirs[i] = bag.takeOut();
if (theirs[i] == null)
showStatus("No more letters");
break;
}
}
board.repaint();
}
/** 當對手的方塊全部移完了調用該方法 */
void turn(int score, String words) {
showStatus(others_name + " played: " + words + " worth " + score);
done.setEnabled(true);
board.othersTurn(score);
}
/** 當一方明確退出時,調用quit */
void quit(String id) {
showStatus(others_name + " just quit.");
remove(chat);
remove(board);
remove(done);
nameEntered(name);
}
/** 當提示輸入用戶名按下回車時actionPerformed()調用該方法 */
private void nameEntered(String s) {
if (s.equals(""))
return;
name = s;
if (ican != null)
remove(ican);
if (idList != null)
remove(idList);
if (challenge != null)
remove(challenge);
idList = new List(10, false);
add("Center", idList);
challenge = new Button("Challenge");
challenge.addActionListener(this);
add("North", challenge);
validate();
server.setName(name);
showStatus("Wait for other players to arrive.");
if (topPanel != null)
remove(topPanel);
}
/** 簡單的調用wepick()和theypick()來開始游戲 */
private void wepick() {
for (int i = 0; i < 7; i++) {
Letter l = bag.takeOut();
board.addLetter(l);
}
}
private void theypick() {
for (int i = 0; i < 7; i++) {
Letter l = bag.takeOut();
theirs[i] = l;
}
}
/** 在單用戶模式下,彈出splash圖形,創建棋盤,開始游戲 */
private void start_Game(int seed) {
if (single) {
Frame popup = new Frame("Scrabblet");
popup.setSize(400, 300);
popup.add("Center", ican);
popup.setResizable(false);
popup.show();
board = new Board();
showStatus("no server found, playing solo");
ourturn = true;
} else {
remove(idList);
remove(challenge);
board = new Board(name, others_name);
chat = new TextField();
chat.addActionListener(this);
add("North", chat);
showStatus("playing against " + others_name);
}
add("Center", board);
done = new Button("Done");
done.addActionListener(this);
add("South", done);
validate();
bag = new Bag(seed);
if (ourturn) {
wepick();
if (!single)
theypick();
} else {
done.setEnabled(false);
theypick();
wepick();
}
board.repaint();
}
/** 當按下challenge按鈕時調用該函數 */
private void challenge_them() {
String s = idList.getSelectedItem();
if (s == null) {
showStatus("Choose a player from the list then press Challenge");
} else {
remove(challenge);
remove(idList);
String destid = s.substring(s.indexOf('(')+1, s.indexOf(')'));
showStatus("challenging: " + destid);
server.challenge(destid);
validate();
}
}
/** 當按下done時調用該函數 */
private void our_turn() {
String word = board.findwords();
if (word == null) {
showStatus("Illegal letter positions");
} else {
if ("".equals(word)) {
if (single)
return;
if (seen_pass) {
done.setEnabled(false);
server.turn("pass", 0);
showStatus("You passed");
seen_pass = false;
} else {
showStatus("Press done again to pass");
seen_pass = true;
return;
}
} else {
seen_pass = false;
}
showStatus(word);
board.commit(server);
for (int i = 0; i < 7; i++) {
if (board.getTray(i) == null) {
Letter l = bag.takeOut();
if (l == null)
showStatus("No more letters");
else
board.addLetter(l);
}
}
if (!single) {
done.setEnabled(false);
server.turn(word, board.getTurnScore());
}
board.repaint();
}
}
/** 獲取各個組件的輸入 */
public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if(source == chat) {
server.chat(chat.getText());
chat.setText("");
}
else if(source == challenge) {
challenge_them();
}
else if(source == done) {
our_turn();
}
else if(source == namefield) {
TextComponent tc = (TextComponent)source;
nameEntered(tc.getText());
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -