/**
* 第四题 server部分
* @author mawz
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.*;
public class Server {
ServerListen s = new ServerListen();
Listen a;
// Listen繼承自Thread,用來监听socket收到的信息
class Listen extends Thread {
BufferedReader is;
Listen(BufferedReader i) {
is = i;
}
public void run() {
while (true) {
try {
String a = is.readLine();
if (a.equals("") || a == null)
continue;
String[] b = a.split(" ");
cell[Integer.valueOf(b[0])][Integer.valueOf(b[1])]
.setText(b[2]);
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
}
}
/**
* 用来创建连接
* @author mawz
*
*/
class ServerListen {
BufferedReader is;
PrintWriter os;
public void begin() {
try {
ServerSocket server = null;
try {
server = new ServerSocket(4700);
} catch (Exception e) {
System.out.println("can't listen to:" + e);
}
Socket socket = null;
try {
socket = server.accept();
} catch (Exception p) {
System.out.println("Error." + p);
}
is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
os = new PrintWriter(socket.getOutputStream());
a = new Listen(is);
JOptionPane.showMessageDialog(null, "现在有玩家加入到了游戏!游戏将自动刷新! ",
"message ", JOptionPane.OK_CANCEL_OPTION);
refresh(4);
} catch (Exception e) {
System.out.println("Error:" + e);
}
}
}
// cell用来实现各个窗格
MyField cell[][] = new MyField[9][9];
int answer[][] = new int[9][9];
/**
* refresh函数用来刷新并生成一个数独题,在更新本窗口的同时向另一个窗口发送数据
*
* @param x
* x用来标识难度
*/
public void refresh(int x) {
// 初始化
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++) {
cell[i][j].setEditable(true);
cell[i][j].setForeground(Color.black);
try {
s.os.println(i + " " + j + " true black");
s.os.flush();
} catch (Exception e) {
}
}
// 求出一个有解的数独
Create c;
while (true) {
c = new Create();
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
c.a[i][j] = 0;
// 随机9个点,然后解除该数独题的一种解
for (int j = 0; j < 9; j++)
c.a[j][(int) (Math.random() * 9)] = (int) (Math.random() * 9 + 1);
if (c.search() == true)
break;
}
// 将这个完整的数独解显示在窗体上
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++) {
cell[i][j].setText(String.valueOf(c.fanhui[i][j]));
answer[i][j] = c.fanhui[i][j];
try {
s.os.println(i + " " + j + " " + c.fanhui[i][j]);
s.os.flush();
} catch (Exception e) {
}
}
// 每个小方格中隐藏一些解,并将不能改变的点设置为不可更改
int count[] = new int[9];
for (int i = 0; i < 9; i++) {
while (true) {
if (count[i] == (9 - x))
break;
int k = (int) (Math.random() * 9);
if (!cell[k / 3 + (i / 3) * 3][k % 3 + (i % 3) * 3].getText()
.equals("")) {
count[i]++;
cell[k / 3 + (i / 3) * 3][k % 3 + (i % 3) * 3].setText("");
try {
s.os.println((k / 3 + (i / 3) * 3) + " "
+ (k % 3 + (i % 3) * 3) + " 0");
s.os.flush();
} catch (Exception e) {
}
}
}
}
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (!cell[i][j].getText().equals("")) {
cell[i][j].setEditable(false);
cell[i][j].setForeground(Color.red);
try {
s.os.println(i + " " + j + " false red");
s.os.flush();
} catch (Exception e) {
}
}
// 调整背景颜色
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (((i / 3) * 3 + j / 3) % 2 == 0)
cell[i][j].setBackground(Color.LIGHT_GRAY);
}
/**
* 检查当前各方格中的数字是否是正确解
*
* @return
*/
public Boolean check() {
int mark[][] = new int[27][9];
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++) {
if (cell[i][j].getText().isEmpty())
return false;
int x = Integer.valueOf(cell[i][j].getText());
if ((mark[i][x - 1]) == 1 || (mark[9 + j][x - 1] == 1)
|| (mark[18 + (i / 3) * 3 + j / 3][x - 1] == 1))
return false;
mark[i][x - 1] = 1;
mark[9 + j][x - 1] = 1;
mark[18 + (i / 3) * 3 + j / 3][x - 1] = 1;
}
return true;
}
/**
* MyField内部类继承自JTextField,添加了监听器,如果键盘输入不是1-9的数字,不予显示,如果数字超过一位,只显示最后一位
* 当任何一个窗口有改动时,想client发送
*
* @author mawz
*
*/
class MyField extends JTextField {
String name;
public MyField(int i, int j) {
name = i + " " + j;
this.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
String textValue = MyField.this.getText();
int len = textValue.length();
if (c == '\b') {
textValue = textValue.substring(0, len);
MyField.this.setText(textValue);
} else {
if (textValue.length() > 0)
MyField.this.setText(textValue.substring(0,
textValue.length() - 1));
if (c >= '1' && c <= '9') {
try {
s.os.println(name + " " + c);
s.os.flush();
} catch (Exception e2) {
}
return;
} else
e.consume();
}
}
});
}
}
/**
* 构造函数中生成窗体
*/
public Server() {
final JFrame f = new JFrame();
f.setTitle("Sudoku-Server");
f.setLayout(new BorderLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加按钮
JPanel k = new JPanel(new FlowLayout());
JButton check = new JButton();
check.setText("check");
// 调用check函数,并且根据结果弹出不同的对话框
check.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (check() == true)
JOptionPane.showMessageDialog(null, "正确! ", "message ",
JOptionPane.OK_CANCEL_OPTION);
else
JOptionPane.showMessageDialog(null, "错误! ", "message ",
JOptionPane.OK_CANCEL_OPTION);
}
});
JButton ans = new JButton();
ans.setText("answer");
// 用来显示正确答案
ans.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++) {
cell[i][j].setText(String.valueOf(answer[i][j]));
try {
s.os.println(i + " " + j + " " + answer[i][j]);
s.os.flush();
} catch (Exception e2) {
}
}
s.os.println("over");
s.os.flush();
}
});
// cb用于建立下拉框,设有3,4,5三种难度
final JComboBox<String> cb = new JComboBox<String>();
cb.addItem("3");
cb.addItem("4");
cb.addItem("5");
cb.setSelectedItem("4");// 默认选中南京
cb.addItemListener(new ItemListener() {
@Override
// 根据选择的不同生成不同难度的数独题
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
if (e.getStateChange() == ItemEvent.SELECTED) {
String s = e.getItem().toString();
if (s.equals("3"))
refresh(3);
else if (s.equals("4"))
refresh(4);
else
refresh(5);
}
}
});
k.add(cb);
k.add(check);
k.add(ans);
// 添加菜单栏及对应响应
JMenuBar jm = new JMenuBar();
JMenu select = new JMenu("选项");
JMenu help = new JMenu("帮助");
可联机版数独
4星 · 超过85%的资源 需积分: 50 117 浏览量
2012-11-20
17:15:05
上传
评论 3
收藏 31KB RAR 举报
mjk12
- 粉丝: 0
- 资源: 2
最新资源
- arm cmsis 5.6.0 pack
- 深度学习目标检测进行图像标注的工具
- 本课程实验旨在配合课堂理论教学,以增强学生能力结构为目标的专业技能训练
- 4位二进制比较器输出0的相等比较器或门+与非门+与门
- 轮胎侧偏刚度在不同垂直载荷下的三维插值计算
- 基于线性二自由度模型的多速度仿真与结果集成图展示(Matlab和Simulink多种方法展示)
- 自己团队一直在用的,软件研发需求文档,里边是真实的一个项目 删除了部分
- 1dbe6d23f01723766a28768a6e079f38.PNG
- 2024年4月中旬流通领域重要生产资料市场价格变动情况 .docx
- (自适应手机端)响应式家居建材类网站pbootcms模板 HTML5办公家具桌椅类网站源码下载.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈