View difference between Paste ID: KKqfw1ZX and kQVvbL78
SHOW: | | - or go back to the newest paste.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#include <sys/socket.h>
5
#include <arpa/inet.h>
6
#include <unistd.h>
7
#include <time.h>
8
9
#define SERVER_ADDRESS "127.0.0.1"
10
#define SERVER_PORT 8888
11
12
#define OPEN 1
13
#define CLOSE 0
14
15
// Função para imprimir o tabuleiro
16
void imprimirTabuleiro(char tabuleiro[3][3]) {
17
    printf("\n  1 | 2 | 3\n");
18
    printf(" -----------\n");
19
    printf("  4 | 5 | 6\n");
20
    printf(" -----------\n");
21
    printf("  7 | 8 | 9\n\n");
22
23
    printf("Tabuleiro atual:\n\n");
24
25
    printf("  %c | %c | %c\n", tabuleiro[0][0], tabuleiro[0][1], tabuleiro[0][2]);
26
    printf(" -----------\n");
27
    printf("  %c | %c | %c\n", tabuleiro[1][0], tabuleiro[1][1], tabuleiro[1][2]);
28
    printf(" -----------\n");
29
    printf("  %c | %c | %c\n\n", tabuleiro[2][0], tabuleiro[2][1], tabuleiro[2][2]);
30
}
31
32
// Função para verificar se há um vencedor
33
char verificarVencedor(char tabuleiro[3][3]) {
34
    // Verificar linhas e colunas
35
    for (int i = 0; i < 3; i++) {
36
        if (tabuleiro[i][0] == tabuleiro[i][1] && tabuleiro[i][1] == tabuleiro[i][2] && tabuleiro[i][0] != ' ')
37
            return tabuleiro[i][0];
38
        if (tabuleiro[0][i] == tabuleiro[1][i] && tabuleiro[1][i] == tabuleiro[2][i] && tabuleiro[0][i] != ' ')
39
            return tabuleiro[0][i];
40
    }
41
    // Verificar diagonais
42
    if (tabuleiro[0][0] == tabuleiro[1][1] && tabuleiro[1][1] == tabuleiro[2][2] && tabuleiro[0][0] != ' ')
43
        return tabuleiro[0][0];
44
    if (tabuleiro[0][2] == tabuleiro[1][1] && tabuleiro[1][1] == tabuleiro[2][0] && tabuleiro[0][2] != ' ')
45
        return tabuleiro[0][2];
46
47
    // Verificar empate
48
    int empate = 1;
49
    for (int i = 0; i < 3; i++) {
50
        for (int j = 0; j < 3; j++) {
51
            if (tabuleiro[i][j] == ' ') {
52
                empate = 0;
53
                break;
54
            }
55
        }
56
        if (!empate)
57
            break;
58
    }
59
    if (empate)
60
        return 'D'; // Indica empate
61
62
    return ' '; // Se nenhum vencedor ainda
63
}
64
65
// Função para verificar se a célula está vazia
66
int celulaVazia(char tabuleiro[3][3], int posicao) {
67
    int linha = (posicao - 1) / 3;
68
    int coluna = (posicao - 1) % 3;
69
    return tabuleiro[linha][coluna] == ' ';
70
}
71
72
// Função para fazer a jogada do computador
73
int jogadaComputador(char tabuleiro[3][3]) {
74
    printf("Turno do computador (O):\n");
75
    int posicao;
76
77
    // Primeiro, verifique se há uma jogada vencedora disponível
78
    for (posicao = 1; posicao <= 9; posicao++) {
79
        if (celulaVazia(tabuleiro, posicao)) {
80
            int linha = (posicao - 1) / 3;
81
            int coluna = (posicao - 1) % 3;
82
            tabuleiro[linha][coluna] = 'O';
83
            if (verificarVencedor(tabuleiro) == 'O')
84
                return posicao; // Jogada vencedora encontrada
85
            tabuleiro[linha][coluna] = ' '; // Desfazer a jogada
86
        }
87
    }
88
89
    // Em seguida, verifique se há uma jogada do oponente para bloquear
90
    for (posicao = 1; posicao <= 9; posicao++) {
91
        if (celulaVazia(tabuleiro, posicao)) {
92
            int linha = (posicao - 1) / 3;
93
            int coluna = (posicao - 1) % 3;
94
            tabuleiro[linha][coluna] = 'X';
95
            if (verificarVencedor(tabuleiro) == 'X') {
96
                tabuleiro[linha][coluna] = 'O'; // Bloquear a jogada do oponente
97
                return posicao;
98
            }
99
            tabuleiro[linha][coluna] = ' '; // Desfazer a jogada
100
        }
101
    }
102
103
    // Se não houver jogadas vencedoras ou de bloqueio, escolha uma célula aleatória
104
    srand(time(NULL)); // Semente do gerador de números aleatórios
105
    do {
106
        posicao = rand() % 9 + 1;
107
    } while (!celulaVazia(tabuleiro, posicao));
108
109
    int linha = (posicao - 1) / 3;
110
    int coluna = (posicao - 1) % 3;
111
    tabuleiro[linha][coluna] = 'O';
112
113
    return posicao;
114
}
115
116
void delay(int delayTime) {
117
    usleep(delayTime * 1000);
118
}
119
120
void initSocket(int* sock, char* buffer){
121
122
    struct sockaddr_in serv_addr;
123
124
    // Create a socket
125
    if ((*sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
126
        printf("\n Socket creation error \n");
127
        exit(1);
128
    }
129
130
    // Set the server address and port
131
    memset(&serv_addr, '0', sizeof(serv_addr));
132
    serv_addr.sin_family = AF_INET;
133
    serv_addr.sin_port = htons(SERVER_PORT);
134
135
    // Convert IPv4 and IPv6 addresses from text to binary form
136
    if (inet_pton(AF_INET, SERVER_ADDRESS, &serv_addr.sin_addr) <= 0) {
137
        printf("\n Invalid address/ Address not supported \n");
138
        exit(1);
139
    }
140
141
    // Connect to the server
142
    if (connect(*sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
143
        printf("\n Connection Failed \n");
144
        exit(1);
145
    }
146
}
147
148
void movJoints(int sock, char* buffer, float j1, float j2, float j3, float j4, float j5,float j6, int state){
149
    sprintf(buffer, "%f,%f,%f,%f,%f,%f,%d", j1, j2, j3, j4, j5, j6,state);
150
    send(sock, buffer, strlen(buffer), 0);
151
    int valread = read(sock, buffer, 2048);
152
    printf("Result: %s\n", buffer);
153
}
154
155
void meumovJoints(int sock, char* buffer, float* j, int state){
156
    sprintf(buffer, "%f,%f,%f,%f,%f,%f,%d", j[0], j[1], j[2], j[3], j[4], j[5],state);
157
    send(sock, buffer, strlen(buffer), 0);
158
    int valread = read(sock, buffer, 2048);
159
    printf("Result: %s\n", buffer);
160
}
161
162
void pegarPeca(int sock){
163
    //int sock = 0;
164
    char buffer[2048] = {0};
165
166
    float PosPrePeca[6]= {-1.58,-0.26, -0.89,-0.07,0.18,0.08};
167
    float PosPeca[6] = {-1.60,-0.50,-0.77,-0.07,0.18,0.09};
168
    meumovJoints(sock, buffer, PosPrePeca, OPEN);
169
    delay(1000);
170
    meumovJoints(sock, buffer, PosPeca, OPEN);
171
    delay(350);
172
    meumovJoints(sock, buffer, PosPeca, CLOSE);
173
    delay(350);
174
    meumovJoints(sock, buffer, PosPrePeca, CLOSE);
175
    delay(150);
176
}
177
178
int main(int argc, char *argv[]) {
179
    
180
    //variaveis para conexcao com o robo NAO MEXER
181
    int sock = 0;
182
    char buffer[2048] = {0};
183
184
    //conexao com o robo NAO MEXER
185
    initSocket(&sock, buffer);
186
187
    //Programe aqui ---------------------------------------------------
188
    float Pos1[6] = {-0.25, -0.66, -0.46, -0.18, -0.43, -0.03};
189
    float Pos2[6] = {-0.05,-0.63,-0.48,-0.03,-0.51,-0.18};
190
    float Pos3[6] = {0.18,-0.62,-0.45,0.04,-0.49,-0.05};
191
    float Pos4[6] = {-0.22,-0.81,-0.12,-0.10,-0.60,-0.16};
192
    float Pos5[6] = {-0.05, -0.75, -0.23, 0.00, -0.49, -0.04};
193
    float Pos6[6] = {0.13,-0.80,-0.14,-0.03,-0.60,-0.18};
194
    float Pos7[6] = {-0.19, -0.90,0.06,-0.12,-0.49,-0.07};
195
    float Pos8[6] = {-0.03, -0.93, 0.08, -0.03, -0.49, 0.06};
196
    float Pos9[6] = {0.12, -0.93, 0.07, 0.11, -0.49, -0.04};
197
    float PosPrePeca[6]= {-1.58,-0.26, -0.89,-0.07,0.18,0.08};
198
    float PosPeca[6] = {-1.60,-0.50,-0.77,-0.07,0.18,0.09};
199
200
    float posicoes[11][6]= {{-0.25, -0.66, -0.46, -0.18, -0.43, -0.03},
201
                      {-0.05,-0.63,-0.48,-0.03,-0.51,-0.18},
202
                      {0.18,-0.62,-0.45,0.04,-0.49,-0.05},
203
                      {-0.22,-0.81,-0.12,-0.10,-0.60,-0.16},
204
                      {-0.05, -0.75, -0.23, 0.00, -0.49, -0.04},
205
                      {0.13,-0.80,-0.14,-0.03,-0.60,-0.18},
206
                      {-0.19, -0.90,0.06,-0.12,-0.49,-0.07},
207
                      {-0.03, -0.93, 0.08, -0.03, -0.49, 0.06},
208
                      {0.12, -0.93, 0.07, 0.11, -0.49, -0.04},
209
                      {-1.58, -0.26, -0.89,-0.07,0.18,0.08},
210
                      {-1.60,-0.50,-0.77,-0.07,0.18,0.09}}; //de 1 pra 9 e depois a pré-peça e peça
211
212
    
213
    
214
215
    char tabuleiro[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
216
217
    printf("Bem-vindo ao Jogo da Velha!\n");
218
    printf("Você é o jogador X. Faça sua jogada digitando um número de 1 a 9 correspondente à posição no tabuleiro.\n");
219
220
    while (1) {
221
        imprimirTabuleiro(tabuleiro);
222
223
        // Verificar se houve um vencedor ou empate
224
        char resultado = verificarVencedor(tabuleiro);
225
        if (resultado != ' ') {
226
            if (resultado == 'D')
227
                printf("Empate!\n");
228
            else if (resultado == 'X')
229
                printf("Parabéns! Você venceu!\n");
230
            else
231
                printf("O computador venceu!\n");
232
            break;
233
        }
234
235
        // Obter a jogada do jogador
236
        int posicao;
237
        printf("Sua vez (X), digite sua jogada (1 a 9): ");
238
        scanf("%d", &posicao);
239
        
240
241
        // Verificar se a jogada é válida
242
        if (posicao < 1 || posicao > 9 || !celulaVazia(tabuleiro, posicao)) {
243
            printf("Jogada inválida! Tente novamente.\n");
244
            continue;
245
        }
246
        pegarPeca(sock);
247-
        meumovJoints(sock, buffer, posicoes[posicao-1], OPEN);
247+
        meumovJoints(sock, buffer, posicoes[posicao-1], OPEN);  //jogada do humano feita pelo braço robótico
248
249
        // Atualizar o tabuleiro com a jogada do jogador
250
        int linha = (posicao - 1) / 3;
251
        int coluna = (posicao - 1) % 3;
252
        tabuleiro[linha][coluna] = 'X';
253
254
        // Verificar se houve um vencedor ou empate após a jogada do jogador
255
        resultado = verificarVencedor(tabuleiro);
256
        if (resultado != ' ')
257
            continue;
258
259
        // Jogada do computador
260
        int jogada_pc = jogadaComputador(tabuleiro);
261
        printf("O computador jogou na posição: %d\n", jogada_pc);
262
        pegarPeca(sock);
263
        meumovJoints(sock, buffer, posicoes[jogada_pc-1], OPEN);
264
    }
265
266
    imprimirTabuleiro(tabuleiro);
267
    return 0;
268
    //-----------------------------------------------------------------
269
270
    // Encerra a conexao NAO MEXER
271
    close(sock);
272
273
    return 0;
274
}
275