Para quién entienda de lenguaje C

Hola,
soy estudiante de primer año de informatica y nos hacen hacer un tetris como trabajo
de final de primero.

Como todas las universidades representa que se tiene que entrar sacandote el ESO y el BAT
y allí llegas siendo el amo, pero se prefieren a los que vienen de modulos que lo saben hacer todo
y no te ayudan en nada. En el caso de informatica llegas allí sin saber nada de programar si no eres
muy friki y los de modulo ya saben hacer de todo y por eso no nos ayudan.

Aqui ire colgando preguntas que tenga durante el proceso de programación del tetris (siempre que
vea que haya gente activa que me conteste)


Mi primera duda es sobre como incluir las flechas del teclado en el programa?

se que las <-- es el 75 y la --> el 77 pero no se como debo incluirlas para que me las lea el programa,
y el ESCape tampoco se como introducirlo sabiendo que es el numero 27.


De momento tengo planteado un programa que controle la linea horizontal que no se vaya de los límites (con
numeros) si aprieto la letra a (como <-- porque no se poner la flecha) el numero que he generado con rand()
se va desplazando hacia abajo hasta que llega al 0 y no baja mas y al revés igual hasta llegar al 20.
Lo he hecho con el switch.


Como lo tengo que hacer?? he buscado pero en ningun sitio hay respuestas espero que aqui tengan alguna.

Si hay dudas pregunten y les contare mas si no me he explicado bien





Gracias
ISO C no tiene el concepto de teclas de dirección ni teclas de función. Puedes usar alguna librería no estándar o usar otras teclas.

PD: Yo empecé la carrera siendo "muy friki" y me leí un libro de programación en C
Pero usais solo "C" o C++ ?? usais algun tipo de librerias o entorno grafico o es modo consola??
Usais opengl o gtk o similar en caso de que sea "grafico" ??

Esque no has dejado muy claro como lo estais intentando hacer si en c o c++ que de uno a otro varia ya que uno es oriendado a objetos y el otro no.
Luego esta el tema de si es en modo consola o si utilizais ventanitas graficas y que usais para dibujarlo y sacar graficos por pantalla...
GTK es muy comun sobretodo en C++ (de hecho gtk esta hecho en C) para aprender a hacer aplicaciones graficas...

Por ejemplo mi experiencia personal esque yo soy estudiante de segundo de DAI (Fp superior de informatica, el dedicado a programacion) y en primero dimos C (nada de c++ ni orientado a objetos) 6 meses pero todo en terminal nada de grafico.
Luego 2 o 3 meses de java paraintroducir en el mundo de orientacion de objetos y este año hemos pasado a c# con Mono y ahora estamos enpezando con el tema grafico en C# usamos GTK 2, pero informacion sobre GTK# hay muy poca y siempre toca buscar la de GTK++ y apañarnos la vida que todo no es tan bonito ;)

De mi clase solo 3 vamos bien el resto como el culo y o se lo sacan de milagro o repiten...
Y desde luego que si vamos a la uni tenemos carencias increibles en fisica, matematicas y dibujo tecnico... Increibles no DESCOMUNALES, y patinamos y muchisimo en eso asi que todo no es tan bonito...

Cada uno tiene sus carencias y tiene que buscarse la vida en conseguir suplirlas.

Es por eso que veo bien que pidas ayuda, te apuntes algun sitio o te leas algun libro de C pero no critiques diciendo que los de FP tenemos la vida mas facila al llegar a la uni porque no es cierto.
Miren primero de todo lo siento, se que también es dificil entrar en la uni con un modulo pero una vez
estas dentro eres de los que esta mas alto en la materia a la que te vas a dedicar, cierto que mates, .....
estas super mal porque hace años que no lo haces pero yo vengo de bachiller y estoy igual o peor que
uno de modulo jaja pero se tiene que ir tirando....


Miren sobre el programa:

Nosotros aún no hemos empezado tan fuerte con el programa del tetris. Usamos el Visual Studio para lenguaje C sin el ++
el C asecas.
El proyecto es el siguiente, la primera entrega del tetris solo tenemos que hacer:
1.El tablero o sea |_| vale? las barras esas.
2.Solo hay 4 piezas y de dimension horizontal 1 punto, 2 puntos, 3 puntos, 4 puntos o, oo, ooo, oooo estas <--
3.Se tiene que generar una pieza aleatoria e ir caiendo mientras espera una orden de las fletxas si no hay orden va caiendo.
4.Pulsando <-- va a la <-- y va caiendo si no se pulsa nada mas, igual con la -->, pulsando la tecla p o P se pausa hasta que no
tocas otra vez la p o P; con ESC se acava el programa.
5.La pieza tiene un limite, al tocar la pared no tiene que sobrepasarla entienden? la toca y baja rascando la pared, lo normal.
6.Una vez la pieza llega abajo, DESAPAREZE y una vez desaparece, aparece otra aleatoria arriva y el marcador (que tambien tiene que aparecer) suma una puntuacion.

Nada mas, ni se quedan las lineas, ni se giran las piezas ni nada mas.


Entorno grafico, ..... habeis dicho muchas cosas que no se yo aún.


Usamos la libreria conio.h y otra que la llamamos rutines.h que nos la dan en la uni y la ponemos en el programa (esta libreria de la uni ya entra la libreria stdio.h, la del tiempo, y otras funciones)


El programa que tengo hecho

Simulo como si tubiera las barras horizontales pero con numeros, he puesto un numero del 0 al 28 por ejemplo y hago
que pulsando las fletxas <-- y --> disminuya el numero o augmente respectivamente.
Tambien cuando pulso p y P se pausa hasta no volver a pulsar otro boton, y pulsando ESC el programa se para.

Hemos hecho esto para simular el movimiento lateral y familiarizarnos con las flexas y eso pero como no nos lo explican y los foros
van pobres de programacion almenos todos los que he buscado menos este pues lo voy a exponer donde pueda para que me ayuden.


Aqui les dejare el programa, he puesto un doble getch() porque las teclas no se como las llaman que son 2 numeros o algo para que aparezcan o no se muy bien como va pero en clase solo nos dijeron que usaramos 2 getch() para las flexas. El problema es que luego cuando pulso p o P o ESC tengo que pulsarlo 2 veces para que haga su funcion.


programa:

#include "rutines.h"
#include <conio.h>

#define N 28

int main()
{
char tecla;
int pesa; // Como esta en catalan alguna variable le pongo pesa= pieza

srand(time(NULL));
pesa=(rand() % N+1);

do
{
printf("%d\n",pesa);

tecla=getch();
tecla=getch();

switch (tecla)
{
case 75:
if (pesa!=0)
pesa--;
break;
case 77:
if (pesa!=N)
pesa++;
break;
case 'p':
system("pause");
break;
case 'P':
system("pause");
break;
case 27:
pesa=-1;
break;

}
}

while ((pesa>=0) && (pesa<=N));

return 0;

}



Tambien les cuelgo la libreria rutines que nos facilita la universidad.

rutines.h

//===================================================================================
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdio.h>

#include <windows.h>
// Declaracio de tipus
typedef struct pantalla_s {
HANDLE screen;
int Tauler[NFil][NCol];
} pantalla_t;


//===================================================================================
// Definicio de colors
#define BLACK 0
#define BLUE 1
#define GREEN 2
#define CYAN 3
#define RED 4
#define MAGENTA 5
#define BROWN 6
#define LIGHTGREY 7
#define DARKGREY 8
#define LIGHTBLUE 9
#define LIGHTGREEN 10
#define LIGHTCYAN 11
#define LIGHTRED 12
#define LIGHTMAGENTA 13
#define YELLOW 14
#define WHITE 15
#define BLINK 128




//===================================================================================
// Desplaçament del taulell respecte la cantonada superior esquerre
#define DespF 5
#define DespC 27




//===================================================================================
// Dimensions del taulell de joc
#define NFil 28
#define NCol 18

//===================================================================================
// Peces
#define NUM_PECES 3

// Point --------------------
const int P[3]={0,1,0};

// Guio -------------------
const int S[3]={0,2,2};

// linea ------------------------
const int L[3]={3,3,3};

//===================================================================================
// Declaració de funcions
void gotoxy(int,int,HANDLE);
void TextColor(int,int,HANDLE);


void InitPantalla( pantalla_t *tauler );
void ClosePantalla( );


void MostraTauler( pantalla_t *tauler );
void MostraMSG(pantalla_t *tauler, char* );
void MostraPesa( pantalla_ *tauler, int Peca, int F, int C);



Hay cosas en catalan.




Weno, espero que me puedan ayudar y como veo que estais interesados en ayudarme o eso espero ire exponiendo mis problemas, dudas, etc.


Tengo un pdf que explica muy bien la utilización de C pero también necesito que me enseñen las bases porque si no cuesta pillarle el truco en cosas.




Gracias, espero respuesta. :)
conio.h sólo está en windows en ciertos compiladores, es una de las librerías externas que te decía, así que no te voy a poder ayudar mucho más, pero te explico lo de los getch() que tienes que poner 2 veces.

Un teclado tiene 2 tipos de teclas, las normales (letras, signos, etc) y las de función (escape, control, F1..F12, etc). Las normales se corresponden con un entero, mientras que las de función son 2, el primero indica que es una tecla de función y el segundo la tecla en sí.

Por ejemplo (y me invento los códigos que devuelve):
- A devuelve 65
- B devuelve 66
- Escape devuelve 10 y 17
- Control devuelve 10 y 23
- Flecha izda devuelve 10 y 35

El 10 indicaría que es una tecla de función y el 17 sería el código de la tecla.

Lo que tendrías que hacer es un getch(), comprobar si es el código que indica que es una tecla de función (10 en el ejemplo que he puesto), y actuar en consecuencia, leyendo otra vez mediante getch() si es el código de tecla de función.

Por cierto, para el código en el foro uso la etiqueta code, mantiene la identación.
ok entiendo pues lo de las teclas de función pero como deberia ponerlo que si
lee que es una tecla de funcion vuelva a hacer un getch()?
que lo hago con un if la comprovación o como?

estoy muy pez por el momento no se mucho, lo voy entendiendo todo porque me gusta mucho
pero se me tiene que explicar, luego ya es cosa fina jaja


en este codigo que he colgado el segundo getch() donde lo tendria que poner o como lo tendria que poner,
he de crear otra variable y darle nombre al getch() o que hago?


Gracias por el interes
Tendrías que mezclar los getch con un par de switch.

No me gusta poner código a la gente que está aprendiendo...

código <- LeerCaracter
seleccionar código
   caso <tecla normal X>
   ...
   caso <código de tecla de función>
      código2 <- LeerCaracter
      seleccionar código2
         caso <tecla función Y>
         ...
      fin seleccionar
fin seleccionar


Por supuesto, hay más formas, esto ya es echarle imaginación.
Ami tampoco me gusta mucho que me enseñen el codigo como hacerlo porque luego no lo entiendo
y lo veo todo echo y ya no me esfuerzo en entender como hacerlo, con lo que me
habías dicho de poner dos switch ya me abría bastado para estarme un buen rato o poco rato
provando encontrar la solución.

Lo que pasa es que aún no me funciona, lo debo hacer mal porque he ido provando haber si me salia sin mirar el codigo que me
has puesto tu y cuando lo e provado usando el codigo que me has puesto tu tampoco me funciona, debo hacer algo mal.

Si el numero aleatorio es 6 y pulso <-- para que baje a 5, pulso y se imprime 6 6 uno bajo el otro.. no me lee la fletxa.

      tecla=getch();
                  
      switch (tecla)
      {
         case 'p':
            system("pause");
            break;
         case 'P':
            system("pause");
            break;
         case ESC:
            pesa=-1;
            break;
         case 224:
            teclavar=getch();

            switch(teclavar)
            {
               case 77:
                  if (pesa!=0)
                     pesa--;
                  break;
               case 77:
                  if (pesa!=N)
                     pesa++;
                  break;
            break;
            }
                           
      }
      }
      
      while ((pesa>=0) && (pesa<=N));

}



De momento esto es todo lo que hemos de hacer del tetris, ahora tendremos que poner otra variable, Y
que haga que aparezca un numero y vaya disminuyendo como si fuera una pieza del tetris y cuando pulsas
una tecla se mueve la x a la izq. o derecha, pause o ESC.

Aver si lo consigo y si no sé que aqui me podeis ayudar.


Aqui voy a publicar mis problemas o las dudas que tenga a partir de ahora por si otra
gente lo lee que vaya mirando por si acaso también.


Las instrucciones del programa que tengo que hacer, todos los puntos son los de arriba nada mas para
la version 1 del tetris.


Enga gracias, cuidate
en monoproceso haz un bucle que haga:

repetir{
pintar()
leer_tecla()
procesar_posicion()
}

pintar es cosa tuya, depende de la estetica que quieras.
leer_tecla es un getch, como ya te han dicho. si queires saber el valor de una tecla, haz un miniprograma con getch+printf y que te lo ponga en pantalla.
procesar_posicion() tiene que jugar con el movimiento marcado y con la posibilidad de una linea. ademas, yo haria que fuera el que detectara si se ha acabado el juego.

con multiproceso tienes que asegurar la sincronizacion, pero yo lo veo mas sencillo. Seria:
-gestor movimiento ficha+dibujado de pantalla (analogo al monoproceso, pero no es necesario pulsar)
-cola de teclado (el otro hilo/proceso deberia ser capaz de vaciar la cola por cada ficha colocada)

el tema del multiproceso es que permite jugar a un tetris "de verdad", en el que las fichas se muevan independientemente de que pulses o no.
Vaya locura dar programación en primero con C... con lo obediente que es la vais a liar parda veinte millones de veces comprado con pascal o ADA.
juas escribió:Vaya locura dar programación en primero con C... con lo obediente que es la vais a liar parda veinte millones de veces comprado con pascal o ADA.

en salamanca se da primero C (de hecho, en la publica no se da ni pascal ni ada) y tampoco es ningun trauma. quizas no sea tan mala idea empezar en un lenguaje permisivo, ya que el temario no deja de ser un "entorno acotado y controlado" de lo que es la totalidad y en un futuro tendran una base de dicho lenguaje.
ademas, pasar de c a pascal es un cambio de chip sencillo y cuando den POO pueden dar C++ sin que les suene absolutamente todo a chino (aunque me parece una estupidez enseñar C++, con todas las guarrerias que permite, que java)
Vaya otro que está = que yo [+risas]

Incluso creo que vas a mi universidad, vas a la UAB no?xD

Bueno yo también iré dejando mis dudas [sonrisa]
Yo creo que lo suyo es empezar con Java, es sencillo de entender, y se puede pasar después a C con extrema facilidad.

Además, creo que es más fácil aprender primero con orientación a objetos, después pasar a uno sin objetos no cuesta nada. Pero quien empieza con C, pasar a Java es más complicado (según mi experiencia).
C es un excelente lenguaje para comprender las bases de programación. Ayuda a tener claros todos los conceptos generales y cómo emplearlos a posteriori en cualquier otro lenguaje.

Esto a modo consejo: como escribas con esa ortografía te van a suspender y no por el buen código que generes xD
rintin escribió:Esto a modo consejo: como escribas con esa ortografía te van a suspender y no por el buen código que generes xD

es un festival-copia-pega, dale cancha al pobre
(mensaje borrado)
15 respuestas