Advertisement
AntonioVillanueva

SNAKE "La serpiente" con ncurses y c++

Aug 26th, 2019
437
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.89 KB | None | 0 0
  1.  
  2. /*
  3.  * Antonio Villanueva Segura
  4.  * JUEGO DE LA SERPIENTE ,SNAKE empleando ncurses y linux version compilada en UBUNTU 16.04 64BITS
  5.  * https://www.youtube.com/watch?v=oCS1-wZ2vYM&feature=youtu.be
  6.  * instalar ncurses  sudo apt-get install libncurses5-dev libncursesw5-dev
  7.  * g++ -std=c++11 -o serpiente serpiente.cpp -lncurses
  8.  */
  9. #include <iostream>
  10. #include <string>
  11. #include <cstring> //c_str() conversion a una cadena de texto a lo C
  12. #include <ncurses.h> //Libreria grafica basica
  13. #include <random> //numeros aleatorios
  14. #include <ctime> //hora para generar numeros aleatorios
  15. #include <unistd.h> //usleep retardos
  16. #include <vector>//Creamos el cuerpo de la serpiente con un vector de ptos.
  17.  
  18. #define RETARDO 200000
  19. #define CUERPO "O"
  20. #define COMIDA "+"
  21. using namespace std;
  22. //-------------------------------------------------------------------------------------
  23. struct punto {int y;int x;}; //Estructura Definiendo un punto una coordenada y,x
  24. //-------------------------------------------------------------------------------------
  25. void pantalla(){
  26.     //Crea los bordes del juego
  27.     clear();
  28.     //box(stdscr,'*','*');//Crea borde         
  29.     box(stdscr, ACS_VLINE, ACS_HLINE);//Crea borde con lineas
  30. }
  31. //-------------------------------------------------------------------------------------
  32. punto creaComida(vector <punto> &serpiente){
  33.     //Crea comida , evitando limites o el cuerpo de la serpiente
  34.     punto pto;
  35.     do {
  36.         pto={2+ rand() % (LINES-3),2+ rand() % (COLS-3) };//Crea una comida aleatoria
  37.     }
  38.         while (mvinch(pto.y, pto.x)& A_CHARTEXT!=32);
  39.     return pto;
  40. }
  41. //-------------------------------------------------------------------------------------
  42. bool serpienteCome(punto &cabeza,punto &comida){
  43.     //La serpiente ha encontrado comida ? verdadero o falso
  44.     if (cabeza.y==comida.y && cabeza.x==comida.x ){
  45.         return true;
  46.     }
  47.     return false;
  48. }
  49. //-------------------------------------------------------------------------------------
  50. bool estaMuerta(punto &cabeza){
  51.     //Choca con ella misma o  con los limites del juego y no es comida 
  52.     char objeto=mvinch(cabeza.y, cabeza.x)& A_CHARTEXT;//Cabeza
  53.     if ( objeto!=' ' && objeto !=(const char) COMIDA[0]){
  54.         return true;
  55.     }  
  56.     return false;
  57. }
  58. //-------------------------------------------------------------------------------------
  59. void imprimeSerpiente(vector <punto> serpiente){
  60.     //Imprime el vector serpiente exceptO la cola que es vacio     
  61.     while (!serpiente.empty()){
  62.         mvwprintw (stdscr,serpiente.back().y,serpiente.back().x, serpiente.size()>1 ? CUERPO:" ");
  63.         serpiente.pop_back();
  64.     }
  65. }
  66. //-------------------------------------------------------------------------------------
  67. void inicializaSerpiente(vector  <punto> *serpiente){
  68.     //Inicializa el cuerpo de la serpiente inicial , 3 segmentos
  69.     serpiente->clear();
  70.     for (int elemento=1;elemento>=-1;elemento--){
  71.         serpiente->push_back({LINES/2,COLS/2+elemento});//Elementos 1 0 -1
  72.     }
  73. }
  74. //-------------------------------------------------------------------------------------
  75. //-------------------------------------------------------------------------------------
  76. //-------------------------------------------------------------------------------------
  77. int main(){
  78.     srand (time(NULL));//Inicializa numeros aleatorios para crear comida
  79.     vector  <punto> serpiente;//Cuerpo de la serpiente ,compuesto de puntos y,x
  80.     int direccion(KEY_RIGHT);//Direccion serpiente  inicialmente derecha
  81.     int key(KEY_RIGHT) ;//Lectura de teclas
  82.     int puntos(0);//Puntos del jugador , cada comida incrementa los puntos
  83.     punto cabeza;//Cabeza de la serpiente punto y,x con la posicion actual
  84.     punto comida;//Comida coordenada y,x actual
  85.    
  86.     initscr();//Inicio de ncurses , el entorno grafico
  87.     //configuraciones varias de ncurses
  88.     nodelay(stdscr,true);//Evita bloquear en wgetch ,lectura de una tecla
  89.     noecho();//No aparaece tecla pulsada
  90.     keypad(stdscr,true);//Activa teclas especiales ,flechas F1..F2
  91.     curs_set(0);//Elimina cursor ncurses en la pantalla
  92.  
  93.     //Crea la serpiente con 3 elementos y le da una direccion
  94.     inicializaSerpiente(&serpiente);
  95.    
  96.     pantalla();//Imprime los bordes de la pantalla
  97.     comida=creaComida (serpiente);
  98.  
  99.     while (true){//Bucle principal del juego
  100.        
  101.         usleep(RETARDO);//Retardo del movimiento de la serpiente
  102.         key = wgetch(stdscr);//Lectura de teclas
  103.  
  104.         //Solo acepta teclas flechas en el cambio de direccion de la serpiente
  105.         if (key ==KEY_RIGHT || key ==KEY_LEFT || key ==KEY_DOWN || key ==KEY_UP){
  106.             direccion = key;}
  107.            
  108.         mvwprintw( stdscr , 0, 2 , ( ( "SCORE : " + to_string (puntos) ).c_str() ));//MUESTRA PUNTOS CONSEGUIDOS comidas    
  109.         cabeza=serpiente.back();//Recupera la cabeza de la serpiente
  110.        
  111.         switch (direccion){ //Direccion y manipulacion de la cabeza por las FLECHAS    
  112.             case KEY_RIGHT:cabeza={cabeza.y,cabeza.x+1}; break;//valor direccion 261
  113.             case KEY_LEFT:cabeza={cabeza.y,cabeza.x-1}; break;//valor direccion 260
  114.             case KEY_DOWN:cabeza={cabeza.y+1,cabeza.x}; break;//valor direccion 258
  115.             case KEY_UP:cabeza={cabeza.y-1,cabeza.x}; break;//valor direccion 259                                  
  116.         }
  117.                
  118.         mvwprintw (stdscr,comida.y,comida.x,COMIDA);//Visualiza comida 
  119.        
  120.         if (estaMuerta(cabeza)){
  121.             pantalla();
  122.             inicializaSerpiente(&serpiente);
  123.             direccion=KEY_RIGHT;
  124.             comida=creaComida(serpiente);//Crea una nueva comida
  125.             puntos=0;}//Antes de pegar la cabeza miramos si va estar en un mal sitio
  126.         else{              
  127.            
  128.             serpiente.push_back(cabeza);//Pegamos la nueva cabeza de la serpiente, un nuevo elemento
  129.             imprimeSerpiente(serpiente);//Imprime el cuerpo de la serpiente        
  130.             serpiente.erase(serpiente.begin());//Borra primer elemento del vector, la cola
  131.         }
  132.        
  133.         /*La serpiente ha encontrado comida */
  134.         if (serpienteCome(cabeza,comida)){//La cabeza ha encontrado comida
  135.             puntos++;//Incrementa puntos
  136.             comida=creaComida(serpiente);//Crea una nueva comida
  137.             serpiente.push_back(cabeza);//La serpiente crece un elemento mas
  138.         }
  139.     }
  140.    
  141.     endwin();
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement