网络编程五子棋代码知识分享.docx
《网络编程五子棋代码知识分享.docx》由会员分享,可在线阅读,更多相关《网络编程五子棋代码知识分享.docx(14页珍藏版)》请在冰豆网上搜索。
![网络编程五子棋代码知识分享.docx](https://file1.bdocx.com/fileroot1/2022-11/28/655bcba8-68e4-4005-9d3a-3c5674771fb2/655bcba8-68e4-4005-9d3a-3c5674771fb21.gif)
网络编程五子棋代码知识分享
网络编程五子棋代码
#include
#include
#include
#include
usingnamespacestd;
//定义棋子类
classpiece{
charcolor;
intx,y;
intwin_probability;
public:
friendostream&operator<<(ostream&os,constpiece&object);
friendclassBoard;
intChess(charc){
color=c;return0;
}
piece&operator=(constpiecec){
color=c.color;
return*this;
}
intset_coordinate(inti,intj){
x=i;
y=j;
return0;
}
};
//棋子类的输入操作符ostream&operator<<(ostream&os,constpiece&object){
os<returnos;
}
//定义棋盘类
classBoard{
pieceb[10][10];
public:
Board(){
for(inti=0;i!
=10;i++)
for(intj=0;j!
=10;j++)
if(i==0&&j==0){
piecea;a.Chess('');
b[i][j]=a;
}
elseif(i==0&&j!
=0){
piecea;
a.Chess(j+'0');
b[i][j]=a;
}
elseif(j==0&&i!
=0){
piecea;
a.Chess(i+'0');
b[i][j]=a;
}
else{
piecea;
a.Chess('_');
b[i][j]=a;
}
}
intmodify_color(constsize_t&x,constsize_t&y,constchar&);//设置棋子类的颜色属性的函数
intDisplay_board();//输出当前棋盘状态的函数
boolCompare(constsize_tx,constsize_ty,constchar&a);//比较坐标为x,y的棋子的color与参数a
boolo_win(constchar&);//判断o方是否获胜
boolx_win(constchar&);//判断x放是否获胜
booldraw_game();//判断是否和棋
};
intBoard:
:
modify_color(constsize_t&x,constsize_t&y,constchar&c){
b[x][y].Chess(c);
return0;
}
intBoard:
:
Display_board(){
for(inti=0;i!
=10;i++){
for(intj=0;j!
=10;j++)
cout<
cout<}
return0;
}
boolBoard:
:
Compare(constsize_tx,constsize_ty,constchar&a){
returnb[x][y].color==a;
}
boolBoard:
:
o_win(constchar&a){
inti,j;
for(i=0;i<10;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i,j+1,a)&&Compare(i,j+2,a)&&Compare(i,j+3,a)&&Compare(i,j+4,a))
return1;
for(j=0;j<10;j++)
for(i=0;i<6;i++)
if(Compare(i,j,a)&&Compare(i+1,j,a)&&Compare(i+2,j,a)&&Compare(i+3,j,a)&&Compare(i+4,j,a))
return1;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i+1,j+1,a)&&Compare(i+2,j+2,a)&&Compare(i+3,j+3,a)&&Compare(i+4,j+4,a))
return1;
for(i=0;i<6;i++)
for(j=9;j>3;j--)
if(Compare(i,j,a)&&Compare(i+1,j-1,a)&&Compare(i+2,j-2,a)&&Compare(i+3,j-3,a)&&Compare(i+4,j-4,a))
return1;
return0;
}
boolBoard:
:
x_win(constchar&a){
inti,j;
for(i=0;i<10;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i,j+1,a)&&Compare(i,j+2,a)&&Compare(i,j+3,a)&&Compare(i,j+4,a))
return1;
for(j=0;j<10;j++)
for(i=0;i<6;i++)
if(Compare(i,j,a)&&Compare(i+1,j+1,a)&&Compare(i+2,j+2,a)&&Compare(i+3,j+3,a)&&Compare(i+4,j+4,a))
return1;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i+1,j+1,a)&&Compare(i+2,j+2,a)&&Compare(i+3,j+3,a)&&Compare(i+4,j+4,a))
return1;
for(i=0;i<6;i++)
for(j=9;j>3;j--)
if(Compare(i,j,a)&&Compare(i+1,j-1,a)&&Compare(i+2,j-2,a)&&Compare(i+3,j-3,a)&&Compare(i+4,j-4,a))
return1;
return0;
}
boolBoard:
:
draw_game(){
for(inti=0;i<10;i++)
for(intj=0;j<10;j++){
if(Compare(i,j,'_'))
return0;
}
return1;
}
intmain(){//加载套接字
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0){
return0;
}
if(LOBYTE(wsaData.wVersion)!
=1||HIBYTE(wsaData.wVersion)!
=1){
WSACleanup();
return0;
}
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);//创建监听的套接字
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//把主机字节顺序转换为TCP/IP网络字节顺序
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//绑定套接字
listen(sockSrv,5);//监听用户请求
SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
cout<<"Welcome,Theserverisstarted!
"<SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//等待用户请求到来Boardboard;
intx,y;constcharx_t('x'),o('o');
cout<<"Boardthereare9linesof9"<board.Display_board();
while
(1){//确保客户端服务器交替下棋的死循环
while
(1){//保证客户端下完棋才轮流服务器端下棋的死循环
charrevBuf[2]={'a'};//给数组第一个元素赋值用于标记是否接收了数据,客户端会做限制,不可能发送过来字符'a'
while
(1){//等待接收客户端数据的死循环
recv(sockConn,revBuf,100,0);//接收数据
if(revBuf[0]!
='a'){//判断是否接收的了数据
cout<<"Receivedata..."<}
}
x=revBuf[0]-'0';
y=revBuf[1]-'0';
board.modify_color(x,y,o);
break;
}
board.Display_board();
if(board.o_win(o)){
cout<<"Congratulations!
OWins!
"<}
while
(1){
cout<<"Pleaseenterthecoordinatesofx:
";
cin>>x>>y;
if(board.Compare(x,y,o)||board.Compare(x,y,x_t))
cout<<"inputbeing!
"<if(x>9||y>9||x==0||y==0)
cout<<"Cross-border!
!
!
"<else{
charsendBuf[2]={x+'0',y+'0'};
board.modify_color(x,y,x_t);
send(sockConn,sendBuf,100,0);
cout<<"Senddata..."<}
}
board.Display_board();
if(board.x_win(x_t)){
cout<<"Congratulations!
XWins!
"<break;
}
if(board.draw_game()){
cout<<"DrawnGame!
"<}
}
closesocket(sockConn);
return0;
}
#include
#include
#include
usingnamespacestd;
classpiece{//piececlass
charcolor;
intx,y;
intwin_probability;
public:
friendostream&operator<<(ostream&os,constpiece&object);
friendclassBoard;
intChess(charc){
color=c;return0;
}
piece&operator=(constpiecec){
color=c.color;
return*this;
}
intset_coordinate(inti,intj){
x=i;
y=j;
return0;
}
};
ostream&operator<<(ostream&os,constpiece&object){
os<returnos;
}
classBoard{//boardclass
pieceb[10][10];
public:
Board(){
for(inti=0;i!
=10;i++)
for(intj=0;j!
=10;j++)
if(i==0&&j==0){
piecea;
a.Chess('');
b[i][j]=a;
}
elseif(i==0&&j!
=0){
piecea;
a.Chess(j+'0');
b[i][j]=a;
}
elseif(j==0&&i!
=0){
piecea;
a.Chess(i+'0');
b[i][j]=a;
}
else{
piecea;
a.Chess('_');
b[i][j]=a;
}
}
intmodify_color(constsize_t&x,constsize_t&y,constchar&);
intDisplay_board();
boolCompare(constsize_tx,constsize_ty,constchar&a);
boolo_win(constchar&);//checkowins
boolx_win(constchar&);//checkxwins
booldraw_game();//checkdrawngame
};
intBoard:
:
modify_color(constsize_t&x,constsize_t&y,constchar&c){
b[x][y].Chess(c);
return0;
}
intBoard:
:
Display_board(){
for(inti=0;i!
=10;i++){
for(intj=0;j!
=10;j++)
cout<
cout<}
return0;
}
boolBoard:
:
Compare(constsize_tx,constsize_ty,constchar&a){
returnb[x][y].color==a;
}
boolBoard:
:
o_win(constchar&a){
inti,j;
for(i=0;i<10;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i,j+1,a)&&Compare(i,j+2,a)&&Compare(i,j+3,a)&&Compare(i,j+4,a))
return1;
for(j=0;j<10;j++)
for(i=0;i<6;i++)
if(Compare(i,j,a)&&Compare(i+1,j,a)&&Compare(i+2,j,a)&&Compare(i+3,j,a)&&Compare(i+4,j,a))
return1;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i+1,j+1,a)&&Compare(i+2,j+2,a)&&Compare(i+3,j+3,a)&&Compare(i+4,j+4,a))
return1;
for(i=0;i<6;i++)
for(j=9;j>3;j--)
if(Compare(i,j,a)&&Compare(i+1,j-1,a)&&Compare(i+2,j-2,a)&&Compare(i+3,j-3,a)&&Compare(i+4,j-4,a))
return1;
return0;
}
boolBoard:
:
x_win(constchar&a){
inti,j;
for(i=0;i<10;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i,j+1,a)&&Compare(i,j+2,a)&&Compare(i,j+3,a)&&Compare(i,j+4,a))
return1;
for(j=0;j<10;j++)
for(i=0;i<6;i++)
if(Compare(i,j,a)&&Compare(i+1,j+1,a)&&Compare(i+2,j+2,a)&&Compare(i+3,j+3,a)&&Compare(i+4,j+4,a))
return1;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
if(Compare(i,j,a)&&Compare(i+1,j+1,a)&&Compare(i+2,j+2,a)&&Compare(i+3,j+3,a)&&Compare(i+4,j+4,a))
return1;
for(i=0;i<6;i++)
for(j=9;j>3;j--)
if(Compare(i,j,a)&&Compare(i+1,j-1,a)&&Compare(i+2,j-2,a)&&Compare(i+3,j-3,a)&&Compare(i+4,j-4,a))
return1;
return0;
}
boolBoard:
:
draw_game(){
for(inti=0;i<10;i++)
for(intj=0;j<10;j++){
if(Compare(i,j,'_'))
return0;
}
return1;
}
intmain(){
WORDwVersionRequested;//加载套接字
WSADATAwsaData;interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0){
return0;
}
if(LOBYTE(wsaData.wVersion)!
=1||HIBYTE(wsaData.wVersion)!
=1){
WSACleanup();
return0;
}
SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序,//127.0.0.1是回送地址,指本机,一般用来测试使用
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//向服务器发送请求
Boardboard;
intx,y;
constcharx_t('x'),o('o');
cout<<"Boardthereare9linesof9"<board.Display_board();
while
(1){//确保客户端服务器交替下棋的死循环
while
(1){
cout<<"Pleaseenterthecoordinatesofo:
";
cin>>x>>y;
if(board.Compare(x,y,o)||board.Compare(x,y,x_t))
cout<<"inputbeing!
"<if(x>9||y>9||x==0||y==0)
cout<<"Cross-border!
!
!
"<else{
charsendBuf[2]={x+'0',y+'0'
};
send(sockClient,sendBuf,100,0);
board.modify_color(x,y,o);
cout<<"Senddata..."<break;
}
}
board.Display_board();
if(board.o_win(o)){cout<<"Congratulations!
OWins!
"<}
while
(1){//保证客户端下完棋才轮流服务器端下棋的死循环
charrevBuf[2]={'a'};//给数组第一个元素赋值用于标记是否接收了数据,客户端会做限制,不可能发送过来字符'a'
cout<<"Pleasewaitting..."<while
(1){//等待接收客户端数据的死循环
recv(sockClient,revBuf,100,0);//接收数据
if(revBuf[0]!
='a'){//判断是否接收的了数据
cout<<"Receivedata..."<break;
}
}
x=revBuf[0]-'0';
y=revBuf[1]-'0';
board.modify_color(x,y,x_t);
break;
}
board.Display_board();
if(board.x_win(x_t)){
cout<<"Congratulations!
XWins!
"<break;
}
if(board.draw_game()){
cout<<"DrawnGame!
"<}
}
closesocket(sockClient);
WSACleanup();
return0;
}