0.前言
放假已经一段时间了,前一阶段除了家教主要在调理身心,简而言之就是摆烂——摆烂生活真是让人流连忘返啊。作为康复运动,打算把这学期一些有趣的小程序传上来。
这个开学初做的,难度不大。当初我其实还传到服务器上了,可惜现在服务器到期了。要是愿意折腾,我感觉应该可以做出那种QQ游戏大厅的感觉。
1.服务器端代码
import javax.swing.*;
import java.awt.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class TicTacToeServer extends JFrame implements TicTacToeConstants {
public static void main(String[] args){
TicTacToeServer frame = new TicTacToeServer();
}
public TicTacToeServer(){
JTextArea jtaLog = new JTextArea();
JScrollPane scrollPane = new JScrollPane(jtaLog);//创建滚动条
add(scrollPane, BorderLayout.CENTER);//添加至Frame
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,300);
setTitle("井字棋");
setVisible(true);
try{
//创建socket服务
ServerSocket serverSocket = new ServerSocket(8000);
jtaLog.append(new Date()+":服务端端口号为8000\n");
//会话号码
int sessionNo = 1;
//准备为两个玩家创建会话
while (true){
jtaLog.append(new Date()+":等待玩家加入会话"+sessionNo+'\n');
//链接玩家1
Socket player1 = serverSocket.accept();
jtaLog.append(new Date()+":玩家1加入了会话"+sessionNo+'\n');
jtaLog.append("玩家1的IP地址为:"+player1.getInetAddress().getHostAddress()+'\n');
//告诉玩家1是一号玩家
new DataOutputStream(player1.getOutputStream()).writeInt(PLAYER1);
//链接玩家2
Socket player2 = serverSocket.accept();
jtaLog.append(new Date()+":玩家2加入了会话"+sessionNo+'\n');
jtaLog.append("玩家2的IP地址为:"+player1.getInetAddress().getHostAddress()+'\n');
//告诉玩家2是二号玩家
new DataOutputStream(player2.getOutputStream()).writeInt(PLAYER2);
//展示添加线程的会话号
jtaLog.append(new Date()+":为会话"+ sessionNo +"创建线程"+"\n");
sessionNo += 1;
//创建线程
HandleASession task = new HandleASession(player1,player2);
new Thread(task).start();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
//定义如何处理玩家线程
class HandleASession implements Runnable,TicTacToeConstants{
private Socket player1; private Socket player2;
//创建并初始化棋盘
private char [][] cell = new char[mapSize][mapSize];
private int newGame = 0;
private boolean player1First = false;
private DataInputStream fromPlayer1;
private DataInputStream fromPlayer2;
private DataOutputStream toPlayer1;
private DataOutputStream toPlayer2;
private boolean continueToPlay = true;
//构造函数
public HandleASession(Socket p1,Socket p2){
this.player1 = p1;
this.player2 = p2;
//初始化地图
readyStart();
}
private void readyStart(){
//初始化地图
for(int i=0;i=0;i--){
if(cell[r][i] == token){
count++;
}else{
break;
}
}
if(cell[r][c]==token) count++;// 包括当前下的这颗棋子 因为在不同人下的时候都会判断一次输赢,所以这里也要做区分
return count;
}
public int up_down(char token, int r, int c){
int count = 0;
//向上
for(int i = r-1; i>=0;i--){
if(cell[i][c] == token){
count++;
}else{
break;
}
}
//向下
for(int i = r+1;i=0&&j>=0;i--,j--){
if(cell[i][j] == token){
count++;
}else{
break;
}
}
if(cell[r][c]==token) count++;
return count;
}
public int leftDown_RightUp(char token, int r, int c){
int count = 0;
//左下
for(int i = r+1,j=c-1;i=0;i++,j--){
if(cell[i][j] == token){
count++;
}else{
break;
}
}
//右上
for(int i=r-1,j=c+1;i>=0&&j= winNum
|| up_down(token, row, column) >= winNum
|| leftUp_RightDown(token, row, column) >= winNum
|| leftDown_RightUp(token, row, column) >= winNum;
}
}
2.客户端
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class TicTacToeClient extends JFrame implements Runnable,TicTacToeConstants {
public static void main(String[] args)
{
TicTacToeClient game = new TicTacToeClient();
}
private boolean myTurn = false;//是否是我的回合
private boolean first = false;
private char myToken = ' ';
private char otherToken = ' ';
private boolean anotherGame = false;
private Cell [][] cell = new Cell[mapSize][mapSize];
//显示标题的
private JLabel jlblTitle = new JLabel();
//显示状态的
private JLabel jlblStatus = new JLabel();
private JLabel jlblFirst = new JLabel();
//显示当前选中行和列
private int rowSelected;
private int columnSelected;
//从服务端得到的,和发送的数据
private DataInputStream fromServer;
private DataOutputStream toServer;
//继续玩吗?
private boolean continuePlay = true;
//等待对面玩家下棋
private boolean waiting = true;
public int player;
//这里写服务器ip
//private String host = "39.105.109.67";
private String host = "localhost";
public TicTacToeClient(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(40*mapSize,40*mapSize);
setTitle("游戏端");
setVisible(true);
for(int i=0;i
3.接口定义
public interface TicTacToeConstants {
public static int ovalMargin =1;
public static int mapSize = 19;
public static int winNum = 5;
public static int PLAYER1 = 1;
public static int PLAYER2 = 2;
public static int PLAYERX_WON = 1;
public static int PLAYERO_WON = 2;
public static int DRAW = 3;
public static int CONTINUE = 4;
}
4.效果

有一个小小的说明,这里是TCP/IP协议,和这学期末的局域网聊天不是一个协议哦——虽然我也只是拿来主义在用,不过还是在此说明一下。
整挺好