📄 scrabblet.java
字号:
package srabblet;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Scrabblet extends Applet implements ActionListener {
private ServerConnection server;// 与运行游戏服务器的Web服务器的连接
private String serverName;// 服务器名
private Bag bag;// 字母袋;两个游戏参与者有各自的装字母块的口袋,这两个口袋被初始化为相同的随机序列以此保持同步
private Board board;// 是棋盘的副本;两个人各有一个棋盘,在每一个回合后,由游戏保持这两个棋盘的同
private boolean single = false;// 是否为单用户模
private boolean ourturn;
private boolean seen_pass = false;// 是否已经按下过Done按钮
private Letter theirs[] = new Letter[7];// 已选择的方块拷贝;检查对手是否有作弊
private String name;// 自己
private String others_name;// 对手
private Panel topPanel;// 保存prompt
private Label prompt;
private TextField namefield;// 保存在启动时得到的用户
private Button done;
private TextField chat;// 用于输入对话的消息
private List idList;// 显示可选的对手
private Button challenge;// 将自己和对手连接在一起
private Canvas ican;// 保存起始阶段显示的游戏名和版权声
public void init() {
try {
setLayout(new BorderLayout());
serverName = getCodeBase().getHost();
if (serverName.equals(""))
serverName = "localhost";
ican = new IntroCanvas();
System.out.println("OK init()");
} catch (Exception e) {
e.printStackTrace();
}
}
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) {
e.printStackTrace();
single = true;
start_Game((int) (0x7fffffff * Math.random()));
}
}
public void stop() {
if (!single)
server.quit();
}
public void add(String id, String hostname, String name) {
delete(id);
idList.add("(" + id + ") " + name + "@" + hostname);
showStatus("Choose a player from the list");
}
public 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.");
}
public 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;
}
public 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);
}
public void accept(String id, int seed) {
ourturn = true;
others_name = getName(id);
server.delete();
start_Game(seed);
}
public void chat(String id, String s) {
showStatus(others_name + ": " + s);
}
public 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); // on the tray.
}
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();
}
public void turn(int score, String words) {
showStatus(others_name + " played: " + words + " worth " + score);
done.setEnabled(true);
board.othersTurn(score);
}
public void quit(String id) {
showStatus(others_name + " just quit.");
remove(chat);
remove(board);
remove(done);
nameEntered(name);
}
public 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);
}
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;
}
}
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();
}
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();
}
}
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 + -