五子棋对战(网络版)
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <getch.h>
#include <network.h>char current_player = '$';
char chessboard[15][15] =
{{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
int path_x = 0, path_y = 0;
Network *server_nw, *client_nw; void print_chessboard()
{for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){if (i == path_x && j == path_y) {printf(" %c",current_player); } else {printf(" %c", chessboard[i][j]);}}printf("\n");}
}
int count_direction(int go_x, int go_y)
{int count = 0;for (int x = path_x + go_x, y = path_y + go_y; x >= 0 && x < 15 && y >= 0 && y < 15; x += go_x, y += go_y){if (chessboard[x][y] == chessboard[path_x][path_y]){count++;}else{break;}}return count;
}
bool has_continuous_chess(int x, int y)
{if (chessboard[x][y] != '#'){path_x = x;path_y = y;if (count_direction(1, 0) + count_direction(-1, 0) >= 4){return true;}if (count_direction(0, 1) + count_direction(0, -1) >= 4){return true;}if (count_direction(1, 1) + count_direction(-1, -1) >= 4){return true;}if (count_direction(1, -1) + count_direction(-1, 1) >= 4){return true;}}return false;
}int main(int argc, const char *argv[])
{server_nw = init_nw(SOCK_STREAM,atoi(argv[2]),argv[1],true);client_nw = accept_nw(server_nw);bool game_over = false;while (!game_over) {system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);if (current_player == '$') {int ch = getch(); switch (ch) {case 183: if (path_x > 0) path_x--; break; case 184: if (path_x < 14) path_x++; break; case 185: if (path_y < 14) path_y++; break; case 186: if (path_y > 0) path_y--; break; case '\n': if (chessboard[path_x][path_y] == '#') {chessboard[path_x][path_y] = current_player;int move[2] = {path_x, path_y};send_nw(client_nw, move, sizeof(move));if (has_continuous_chess(path_x, path_y)) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@';}break;}} else {int move[2];recv_nw(client_nw, move, sizeof(move));chessboard[move[0]][move[1]] = current_player;system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);if (has_continuous_chess(move[0], move[1])) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@';}}close_nw(client_nw);close_nw(server_nw);return 0;
}
客户端
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <getch.h>
#include <network.h>char current_player = '$';
char chessboard[15][15] =
{{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
int path_x = 0, path_y = 0;
Network *client_nw;void print_chessboard()
{for (int i = 0; i < 15; i++){for (int j = 0; j < 15; j++){if (i == path_x && j == path_y) {printf(" %c",current_player); } else {printf(" %c", chessboard[i][j]);}}printf("\n");}
}
int count_direction(int go_x, int go_y)
{int count = 0;for (int x = path_x + go_x, y = path_y + go_y; x >= 0 && x < 15 && y >= 0 && y < 15; x += go_x, y += go_y){if (chessboard[x][y] == chessboard[path_x][path_y]){count++;}else{break;}}return count;
}
bool has_continuous_chess(int x, int y)
{if (chessboard[x][y] != '#'){path_x = x;path_y = y;if (count_direction(1, 0) + count_direction(-1, 0) >= 4){return true;}if (count_direction(0, 1) + count_direction(0, -1) >= 4){return true;}if (count_direction(1, 1) + count_direction(-1, -1) >= 4){return true;}if (count_direction(1, -1) + count_direction(-1, 1) >= 4){return true;}}return false;
}int main(int argc, const char *argv[])
{client_nw = init_nw(SOCK_STREAM,atoi(argv[2]),argv[1],false);bool game_over = false;while (!game_over) {system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);if (current_player == '@') {int ch = getch(); switch (ch) {case 183: if (path_x > 0) path_x--; break;case 184: if (path_x < 14) path_x++; break;case 185: if (path_y < 14) path_y++; break;case 186: if (path_y > 0) path_y--; break;case '\n': if (chessboard[path_x][path_y] == '#') {chessboard[path_x][path_y] = current_player;int move[2] = {path_x, path_y};send_nw(client_nw, move, sizeof(move));if (has_continuous_chess(path_x, path_y)) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@'; }break;}} else {int move[2];recv_nw(client_nw, move, sizeof(move));chessboard[move[0]][move[1]] = current_player;system("clear");print_chessboard();printf("当前玩家:%c\n", current_player);if (has_continuous_chess(move[0], move[1])) {system("clear");print_chessboard();printf("玩家 %c 获胜!\n", current_player);game_over = true;}current_player = (current_player == '@') ? '$' : '@';}}close_nw(client_nw);return 0;
}