该小游戏是为了实现电脑随机出石头,剪刀,或布,然后玩家根据电脑的要求(赢电脑,输电脑,打平),大致思路是客户端发出指令开始游戏,服务器端接收后随机选择,然后发回给客户端,玩家选择后,服务器做出判断对错。现将游戏的服务器端与客户端贴出,现在的问题是当玩家输入自己的判断后,服务器返回的值一直是“回答错误”,求解!
这是 服务器端 的程序
import java.io.*;
import java.net.*;
import java.util.*;
public class gameServer {
public static void main(String[] args) {
// TODO Auto-generated method stub
ServerSocket server = null;
DataOutputStream out=null;
DataInputStream in=null;
Socket you =null;
String s=null,s1=null;
int w=0,l=0,d=0,b=0;
int sum=0;
while(true){
try{server = new ServerSocket(4351);}
catch(IOException e1){
System.out.println("ERRO:"+e1);
}
try{
you=server.accept();
in=new DataInputStream(you.getInputStream());
out=new DataOutputStream(you.getOutputStream());
while(true){
int c =0;
c=in.readInt();
if(c==-1){
b=(int)(Math. random()*8);
d=b;
if(b==0){
s="电脑出布,要打平";
}
else if(b==1){
s="电脑出布,要输电脑";
}
else if(b==2){
s="电脑出布,要赢电脑";
}
else if(b==3){
s="电脑出石头,要打平";
}
else if(b==4){
s="电脑出石头,要输电脑";
}
else if(b==5){
s="电脑出石头,要赢电脑";
}
else if(b==6){
s="电脑出剪刀,要打平";
}
else if(b==7){
s="电脑出剪刀,要输电脑";
}
else {
s="电脑出剪刀,要赢电脑";
}
}
System.out.println(s);
if(c==1){
if(d==0&&d==5&&d==7&&d==8)
s="回答正确!";
else
s="回答错误";
}
if(c==0){
if(d==2&&d==6&&d==4)
s="回答正确!";
else
s="回答错误";
}
if(c==2){
if(d==1&&d==3)
s="回答正确!";
else
s="回答错误";
}
System.out.println(s);
out.writeUTF(s);
//sum=w*3+d;
//out.writeUTF(s);
//out.writeInt(sum);
}
}catch(IOException e){}
}
}
}
下面是 客户端 的程序
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class gameClient extends JFrame implements ActionListener{
JButton butj ,buts,butb,butl,butstart;
JPanel panel1,panel2,panel3;
JLabel label,label2;
JTextArea showText;
String s1=null;
int a=0;
int sum1=0;
Socket socket=null;
DataInputStream in=null;
DataOutputStream out=null;
public gameClient() {
setTitle("郁龑");
setLocation(250, 250);
setSize(500, 300);
showText=new JTextArea();
socket=new Socket();
panel1 = new JPanel();
panel1.setBackground(Color.yellow);
butj = new JButton("剪刀");
butb=new JButton("布");
buts = new JButton("石头");
butl=new JButton("清除");
butstart=new JButton("开始游戏");
butj.addActionListener(this);
buts.addActionListener(this);
butb.addActionListener(this);
butl.addActionListener(this);
butstart.addActionListener(this);
panel1.add(butj);
panel1.add(butb);
panel1.add(buts);
panel1.add(butl);
panel1.add(butstart);
panel2 = new JPanel();
panel2.setBackground(Color.green);
label = new JLabel("");
label2= new JLabel("");
panel2.add(label);
panel2.add(label2);
panel3 = new JPanel();
panel3.setBackground(Color.blue);
panel3.add(showText);
add(panel1,BorderLayout.SOUTH);
add(panel2,BorderLayout.CENTER);
add(panel3,BorderLayout.NORTH);
try{socket=new Socket("localhost",4351);
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());}
catch(IOException ee){
System.out.println("无法连接");
}
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==butstart){
a=-1;
}
if(e.getSource()==butj){
a=0;
}
if(e.getSource()==butb){
a=1;
}
if(e.getSource()==buts){
a=2;
}
if(e.getSource()==butl){
a=3;
}
try{
out.writeInt(a);
s1=in.readUTF();
//sum1=in.readInt();
}
catch(IOException ee){
System.out.println("无法连接");
}
label.setText(s1);
}
public static void main(String[] args) {
gameClient frame = new gameClient();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
在服务器端的if语句中,您比较的是c和d的值,但c的值是玩家输入的值,而d的值是电脑随机出的值。如果您想要让服务器正确地判断玩家输入的值是否正确,应该将d的值赋给c。
例如,在服务器端的if语句中,您可以将:
if(c == 1){
if(d == 0 && d == 5 && d == 7 && d == 9){
s1 = "回答正确";
out.writeUTF(s1);
out.flush();
}
else{
s1 = "回答错误";
out.writeUTF(s1);
out.flush();
}
}
修改为:
if(c==d){
s1="回答正确";
out.writeUTF(s1);
out.flush();
}
else{
s1="回答错误";
out.writeUTF(s1);
out.flush();
}
这样,如果玩家输入的值等于电脑随机出的值,服务器就会返回"回答正确",否则就会返回"回答错误"。
另外,建议您在连接断开后关闭服务器端的输入输出流和套接字,以免造成资源浪费。例如:
in.close();
out.close();
you.close();
这样,当玩家退出游戏时,服务器就会关闭与该玩家的连接,并释放资源。