⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrabblet.java

📁 用java编写的小游戏 支持多用户 支持网络
💻 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 + -