Hi, im do this code and i have this error. send help plis 😟 I do not know why happen. This error has appeared before me but I do not know what it means or why it happens to me, if someone can solve these doubts, I would be very grateful.
ERROR:
Ld /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug/ENT_4 normal x86_64 (in target: ENT_4)
cd /Users/robertomanguezmartin/Documents/UNI_UC3M/ENT_4
export MACOSX_DEPLOYMENT_TARGET=10.14
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -L/Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug -F/Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug -filelist /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4.LinkFileList -mmacosx-version-min=10.14 -Xlinker -object_path_lto -Xlinker /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -Xlinker -dependency_info -Xlinker /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4_dependency_info.dat -o /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug/ENT_4
Undefined symbols for architecture x86_64:
"_stdscr", referenced from:
_main in main.o
_menu in main.o
"_wgetch", referenced from:
_main in main.o
_menu in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <curses.h>
#include <string.h>
#define FILAS 6
#define COLUMNAS 7
#define RAYAS 4
#define MAXIMO 1
#define MAX_PARTIDAS 3
struct partida
{
char ficha_comienzo;
int fichas;
int ganador;
int secuencia[FILAS*COLUMNAS];
};
void titulo(void);
char menu(void);
void creartablero(char [][COLUMNAS]);
int numeromenos45(char [][COLUMNAS],int [][3]);
int numero45(char [][COLUMNAS],int [][3],int);
int numerov(char [][COLUMNAS],int[][3],int);
int numeroh(char [][COLUMNAS],int[][3],int);
void juego(char [][COLUMNAS], struct partida [ ], int);
int main()
{
int i,j,k;
char tablero[FILAS][COLUMNAS];
int x=0;
char opcionmenu;
struct partida p[MAX_PARTIDAS];
//Generar título
titulo();
//Rellenar tablero de espacios
for(i=0;i<FILAS;i++)
{
for(j=0;j<COLUMNAS;j++)
{
tablero[i][j]=' ';
}
}
for(k=0;k<MAX_PARTIDAS && x!=1;k++)
{
opcionmenu=menu();
switch(opcionmenu)
{
case '1':
printf("Elige la ficha con la que comenzara el jugador 1: \n\n - x \n - o\n");
p[k].ficha_comienzo=getch();
while(p[k].ficha_comienzo!='x' && p[k].ficha_comienzo!='o')
{
printf("\nIntroduce una opcion valida. \n\n - x \n - o\n");
p[k].ficha_comienzo=getch();
}
creartablero(tablero);
juego(tablero, p,k);
break;
case '2':
break;
case '3':
break;
case '4':
x=1;
}
if (k==MAX_PARTIDAS-1)
{
printf("Se ha alcanzado el maximo de partidas (%d)", MAX_PARTIDAS);
}
}
}
//Título función
void titulo()
{
printf("╔");
for(int i=0;i<28;i++)
{
printf("═");
}
printf("╗");
printf("║ ENTREGABLE 4 - EJERCICIO 1 ║ \n");
printf("╚");
for(int i=0;i<28;i++)
{
printf("═");
}
printf("═ \n\n");
}
//Menú
char menu()
{
char elegida;
printf("Elige una de las siguientes opciones: \n\n1. Jugar partida \n2. Exportar partida \n3. Estadisticas \n4. Salir del programa \n");
elegida=getch();
while(elegida!='1' && elegida!='2' && elegida!='3' && elegida!='4')
{
printf("\nOpcion incorrecta.\n\n");
printf("Elige una de las siguientes opciones: \n\n1. Jugar partida \n2. Exportar partida \n3. Estadisticas \n4. Salir del programa \n");
elegida=getch();
}
return elegida;
}
//Generar el tablero
void creartablero(char tablero[][COLUMNAS])
{
int i;
int j;
puts("");
for(int n=0;n<COLUMNAS;n++)
{
printf(" %2d ",n+1);
}
printf("/n╔");
for(int a=0;a<COLUMNAS-1;a++)
{
printf("═══╦");
}
printf("═══╗ /n");
for(i=0; i<FILAS-1;i++)
{
for(j=0;j<COLUMNAS;j++)
{
printf("║ %c ", tablero[i][j]);
}
printf("║");
printf("%d \n",i+1);
printf("╠");
for(int a=0;a<COLUMNAS-1;a++)
{
printf("═══╬");
}
printf("═══╣ /n");
}
for(int j=0;j<COLUMNAS;j++)
{
printf("║ %c ",tablero[FILAS-1][j]);
}
printf("║");
printf("%d \n",FILAS);
printf("╚");
for(int a=1;a<=COLUMNAS-1;a++)
{
printf("═══╩");
}
printf("═══╝ /n");
}
//Detectar y contar -45º
int numeromenos45(char cuadricula[][COLUMNAS],int posicion[][3])
{
int counter=0; //Saber cuantas "O" consecutivaas hay.
int maxcounter=0; //Saber cuantas rayas de -45º hay.
int i,j,k;
for(i=0;i<FILAS-RAYAS+1;i++)//A partir de la fila FILAS-RAYAS+1 es imposible que empiece una raya de -45º, por tanto, en esas no busca.
{
for(j=0;j<COLUMNAS-RAYAS+1;j++)//A partir de la columna COLUMNAS-RAYAS+1 es imposible que empiece una raya de -45º, por tanto, en esas no busca.
{
if(cuadricula[i][j]=='O')//Solo tomar en cuenta las rayas generadas por las "O"
{
if(j==0 || i==0) //Al estar en la primera fila o en la primera columna, no hay que verificar que el anterior sea distinto, pues en teoría no hay anterior.
{
//Verificar que el elemento que se encuentra en la diagonal -45º (cuadricula[i+k+1][j+k+1]) sea una "O" también, y que no se haya alcanzado el numero maximo de rayas.
for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i+k+1][j+k+1] && maxcounter<MAXIMO;k++)
{
counter++;//Por cada "O" detectada a continuación de la inicial, sumamos 1 al contador de "O" consecutivas.
}
if(counter>=RAYAS-1)//Si hay RAYAS-1 "O" consecutivas o más después de la "O" detectada al principio, significa que hay una raya.
{
//Meter en la correspondiente fila del array "resumen" la info de la raya detectada.
posicion[maxcounter][0]=i+1;
posicion[maxcounter][1]=j+1;
posicion[maxcounter][2]=0; //Como es una raya de -45º, ponemos un 0 en la última columna para identificarla.
maxcounter++;//Se suma 1 al contador de rayas detectads.
}
}
else //En el resto de filas y columnas, comprobamos que el elemento que el elemento anterior no sea una "O", para evitar que cuente varias veces una misma raya.
{
for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i+k+1][j+k+1] && cuadricula[i][j]!=cuadricula[i-1][j-1] && maxcounter<MAXIMO;k++)
{
counter++;
}
if(counter>=RAYAS-1)
{
posicion[maxcounter][0]=i+1;
posicion[maxcounter][1]=j+1;
posicion[maxcounter][2]=0;
maxcounter++;
}
}
counter=0; //Ponemos el contador de "O" consecutivas en 0 para que se repita el proceso.
}
}
}
return maxcounter;//Devolvemos el numero de rayas detectads.
}
//Detectar y contar 45º
int numero45(char cuadricula[][COLUMNAS], int posicion[][3], int total)//Esta vez se necesitará la variable total para saber en que parte del array "resumen" almacenar la info.
{
int counter=0;
int maxcounter=0;
int i,j,k;
for(i=RAYAS-1;i<FILAS;i++)//Lo mismo de antes, solo que ahora empieza desde la fila RAYAS-1, pues en las anteriores es imposible que empiece una raya de 45º
{
for(j=0;j<COLUMNAS-RAYAS+1;j++)//Igual que antes.
{
if(cuadricula[i][j]=='O')
{
if(j==0|| i==FILAS-1)//En la primera columna y en la última fila, no hay que verificar que el elemento anterior no sea una "O", pues en teoría no hay.
{
//El elemento que está en diagonal de 45º es el cuadricula[i-k-1][j+k+1], y hay que verificar que el total de rayas detectadas sea menor que el máximo.
for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j+k+1] && maxcounter+total<MAXIMO;k++)
{
counter++;
}
if(counter>=RAYAS-1)
{
//Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
posicion[maxcounter+total][0]=i+1;
posicion[maxcounter+total][1]=j+1;
posicion[maxcounter+total][2]=1;//Lo mismo de antes, pero esta vez se pone un 1 en la última columna, para identificarla como una raya de 45º
maxcounter++;
}
}
else
{
for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j+k+1] && cuadricula[i][j]!=cuadricula[i+1][j-1] && maxcounter+total<MAXIMO;k++)
{
counter++;
}
if(counter>=RAYAS-1)
{
posicion[maxcounter+total][0]=i+1;
posicion[maxcounter+total][1]=j+1;
posicion[maxcounter+total][2]=1;
maxcounter++;
}
}
counter=0;
}
}
}
return maxcounter;
}
//Detectar y contar Verticales
int numerov(char cuadricula[][COLUMNAS], int posicion[][3], int total)
{
int counter=0;
int maxcounter=0;
int i,j,k;
for(i=RAYAS-1;i<FILAS;i++)//Comienza en la fila RAYAS-1, pues en las anteriores no puede empezar una raya.
{
for(j=0;j<COLUMNAS;j++)//No hay limitación, pues una raya vertical puede empezar en cualquier columna.
{
if(cuadricula[i][j]=='O')
{
if(i==FILAS-1)//En la última fila no hay que verificar que el elemneto anterior sea distinto, pues en tería no hay.
{
//El elemento que está arriba de la "O" detectada es el cuadricula[i-k-1][j].
for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j] && maxcounter+total<MAXIMO;k++)
{
counter++;
}
if(counter>=RAYAS-1)
{
//Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
posicion[maxcounter+total][0]=i+1;
posicion[maxcounter+total][1]=j+1;
posicion[maxcounter+total][2]=2;//Lo mismo de antes, pero esta vez se pone un 2 en la última columna, para identificarla como una raya vertical.
maxcounter++;
}
}
else
{
for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j] && cuadricula[i][j]!=cuadricula[i+1][j] && maxcounter+total<MAXIMO;k++)
{
counter++;
}
if(counter>=RAYAS-1)
{
posicion[maxcounter+total][0]=i+1;
posicion[maxcounter+total][1]=j+1;
posicion[maxcounter+total][2]=2;
maxcounter++;
}
}
counter=0;
}
}
}
return maxcounter;
}
//Detectar y contar horizontales
int numeroh(char cuadricula[][COLUMNAS], int posicion[][3], int total)
{
int counter=0;
int maxcounter=0;
int i,j,k;
for(i=0;i<FILAS;i++)//No hay limitación, pues una raya horizontal puede empezar en cualquier fila.
{
for(j=0;j<COLUMNAS-RAYAS+1;j++)//No toma en cuenta a partir de la columna COLUMNAS-RAYAS+1, pues es imposible que haya una raya horizontal
{
if(cuadricula[i][j]=='O')
{
if(j==0)//En la primera columna no hay que verificar que el elemneto anterior sea distinto, pues en tería no hay.
{
//El elemento que está a la derecha de la "O" detectada es el cuadricula[i][j+k+1].
for(k=0;k<RAYAS && cuadricula[i][j]==cuadricula[i][j+k+1] && maxcounter+total<MAXIMO;k++)
{
counter++;
}
if(counter>=RAYAS-1)
{
//Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
posicion[maxcounter+total][0]=i+1;
posicion[maxcounter+total][1]=j+1;
posicion[maxcounter+total][2]=3;//Lo mismo de antes, pero esta vez se pone un 3 en la última columna, para identificarla como una raya horizontal.
maxcounter++;
}
}
else
{
for(k=0;k<RAYAS && cuadricula[i][j]==cuadricula[i][j+k+1] && cuadricula[i][j]!=cuadricula[i][j-1] && maxcounter+total<MAXIMO;k++)
{
counter++;
}
if(counter>=RAYAS-1)
{
posicion[maxcounter+total][0]=i+1;
posicion[maxcounter+total][1]=j+1;
posicion[maxcounter+total][2]=3;
maxcounter++;
}
}
counter=0;
}
}
}
return maxcounter;
}
void juego(char tablilla[][COLUMNAS], struct partida q[], int numerop)
{
int a,k;
printf("Jugador 1 elige una columna del 1 al %d",COLUMNAS);
scanf("%d",&a);
while(a>COLUMNAS || a<1)
{
printf("Esa columna no existe wey, deja de trolliarme jaja salu3");
scanf("%d",&a);
}
for(k=0;k<FILAS && tablilla[k][a]==' ';k++)
{
if(k%2==0)
{
tablilla[k][a]=q[numerop].ficha_comienzo;
}
else
{
if(q[numerop].ficha_comienzo=='x')
{
tablilla[k][a]='o';
}
else
{
tablilla[k][a]='x';
}
}
}
creartablero(tablilla);
}