以下是一个使用C++编写的简单井字棋程序示例,该程序使用套接字进行通信,并在主循环中实现无限循环。该程序使用TCP套接字进行通信,并在服务器和客户端之间传递游戏状态。
服务器端代码:
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
void printBoard(char board[3][3]) {
std::cout << "---------" << std::endl;
for (int i = 0; i < 3; i++) {
std::cout << "|";
for (int j = 0; j < 3; j++) {
std::cout << " " << board[i][j] << " |";
}
std::cout << std::endl << "---------" << std::endl;
}
}
bool checkWin(char board[3][3], char symbol) {
// 检查行
for (int i = 0; i < 3; i++) {
if (board[i][0] == symbol && board[i][1] == symbol && board[i][2] == symbol) {
return true;
}
}
// 检查列
for (int j = 0; j < 3; j++) {
if (board[0][j] == symbol && board[1][j] == symbol && board[2][j] == symbol) {
return true;
}
}
// 检查对角线
if ((board[0][0] == symbol && board[1][1] == symbol && board[2][2] == symbol) ||
(board[0][2] == symbol && board[1][1] == symbol && board[2][0] == symbol)) {
return true;
}
return false;
}
int main() {
int serverSocket, newSocket;
struct sockaddr_in serverAddr, clientAddr;
char buffer[1024] = {0};
// 创建套接字
if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
std::cerr << "套接字创建失败" << std::endl;
return -1;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
// 绑定套接字到指定的IP和端口
if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
std::cerr << "套接字绑定失败" << std::endl;
return -1;
}
// 监听传入的连接
if (listen(serverSocket, 3) < 0) {
std::cerr << "监听失败" << std::endl;
return -1;
}
std::cout << "等待连接..." << std::endl;
socklen_t addrLen = sizeof(clientAddr);
if ((newSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen)) < 0) {
std::cerr << "接受连接失败" << std::endl;
return -1;
}
std::cout << "连接成功" << std::endl;
char board[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
int row, col;
bool gameOver = false;
while (!gameOver) {
// 接收客户端发送的坐标
memset(buffer, 0, sizeof(buffer));
if (recv(newSocket, buffer, sizeof(buffer), 0) < 0) {
std::cerr << "接收数据失败" << std::endl;
return -1;
}
sscanf(buffer, "%d %d", &row, &col);
std::cout << "接收到坐标:" << row << " " << col << std::endl;
// 更新棋盘
board[row][col] = 'X';
printBoard(board);
// 检查胜利条件
if (checkWin(board, 'X')) {
std::cout << "服务器获胜" << std::endl;
gameOver = true;
break;
}
// 检查平局
bool isDraw