Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++] Input da tastiera...

    Salve ragazzi,

    allora con questo pragrammino faccio muovere un carattere casualmente per lo schermo. Quello che vorrei fare ora e far si che sia l'utente a poter dirigere il char a suo piacimento usando le frecette direzionali della tastiera (o qualunque altro tasto), vi chiedo dunque qual è la funzione che permette di fare ciò.

    Codice PHP:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <conio.c>
    using namespace std;

    int direzione(int &xint &y);

    void main(){
         
    int asse_x 80;
         
    int asse_y 25;
         
    int x;
         
    int y;
         
    int old_x;
         
    int old_y;
         
    unsigned char blocco 219;

         
    asse_x 2;
         
    asse_y 2;

         do {
            
    Sleep(100);
            
    gotoxy(x,y); cout << blocco;
            
    gotoxy(old_x,old_y); cout << " ";
            
    old_x x;
            
    old_y y;
            do {
               
    direzione(x,y);
            } while( !(
    0) && !(0) && !(80) && !(25) );
         } while(
    1);
    }

    int direzione(int &xint &y) {
        
    int random;

        
    random = (rand() % 1000) % 4;
        switch(
    random) {
           case 
    0:
                
    y--;
                break;
           case 
    1:
                
    y++;
                break;
           case 
    2:
                
    x--;
                break;
           case 
    3:
                
    x++;
                break;
        }

    Inoltre volevo sapere se esiste una funzione che emuli la gotoxy() della Borland, da poter usare anche in ambiente Microsoft Visual C++...

  2. #2
    Ciao Skywalker87.
    Se usi un compilatore Borland per creare eseguibili per sistemi a 32 bit, tutte le funzioni
    contenute nella conio.h sono in realtà dei wrapper di api di Windows.
    E probabilmemte la gotoxy() Borland conterrà qualcosa di questo tipo.
    codice:
    #include <windows.h>
    #include <iostream>
    
    // Alcuni links a MSDN :
    // Character-Mode Applications http://msdn2.microsoft.com/en-us/library/ms682010.aspx
    // Console Functions           http://msdn2.microsoft.com/en-us/library/ms682073.aspx
    
    using namespace std;
    
    int gotoxy(short x, short y)
    {
    	COORD dwCursorPosition = {x, y};
    	return SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), dwCursorPosition);
    }
    
    void direzione(int &x, int &y);
    
    int main()
    {
    	int x=79, y=12;
    	int old_x=x, old_y=y;
    	char blocco = 219;
    
    	do
    	{
    		if(x!=old_x || y!=old_y)
    		{
    			gotoxy(old_x,old_y);
    			cout<<" ";
    			old_x = x;
    			old_y = y;
       	}
    		gotoxy(x, y);
    		cout<<blocco;
    		Sleep(100);
       	direzione(x, y);
    	}
    	while(1);
    	return 0;
    }
    
    void direzione(int &x, int &y)
    {
    	switch(rand()%4)
    	{
    
    		case 0:
    			if(y>0)
    				y--;
    		break;
    		case 1:
    			if(y<24)
    				y++;
    		break;
    		case 2:
    			if(x>0)
    				x--;
    		break;
    		case 3:
    			if(x<79)
    				x++;
    		break;
    	}
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Ehila Samuele ci si ritrova...
    Ho dato un occhiata a i link che mi hai passato e ho capito che cos'è un adapter e come lavora la gotoxy()... Non so se nei tuoi link c'è già la soluzione, comunque ciò che mi premeva di più era sapere come "muovere" il char da tastiera?!

    Intanto grazie per il tuo aiuto...

  4. #4
    In questo caso devi ricorrere ad altre due funzioni della conio : La kbhit() e la getch() che,
    a differenza della gotoxy(), sono disponibili anche con il Dev-Cpp ed anche il MS Visual C++.

    codice:
    #include <windows.h>
    #include <iostream>
    #include <conio.h>
    
    // Alcuni links :
    // Character-Mode Applications http://msdn2.microsoft.com/en-us/library/ms682010.aspx
    // Console Functions           http://msdn2.microsoft.com/en-us/library/ms682073.aspx
    
    using namespace std;
    
    int gotoXY(short x, short y)
    {
    	COORD dwCursorPosition = {x, y};
    	return SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), dwCursorPosition);
    }
    
    void direzione(int &x, int &y);
    
    int main()
    {
    	int x=39, y=12, old_x=x, old_y=y;
    	int xp=30, yp=12, old_xp=xp, old_yp=yp;
    	int cicli;
    	char blocco=219, ch;
    
    	do
    	{
    		if(x!=old_x || y!=old_y)
    		{
    			gotoXY(old_x,old_y);
    			cout<<" ";
    			old_x = x;
    			old_y = y;
       		}
    		gotoXY(x, y);
    		cout<<blocco;
      		direzione(x, y);
    		for(cicli=0; cicli<10; cicli++)
    		{
    			Sleep(10);
       			if(kbhit()) // Se un tasto è premuto
       			{
    				ch=getch(); // Legge il suo valore
    				if(ch<=0)    // Se è <=0 allora è un 'tasto di controllo'
    				{
    					ch=getch(); // Leggo il codice del tasto di controllo
    					gotoXY(0,0);
    					printf("Codice tasto :   0, %3d", ch);
    					switch(ch)
    					{
    						case 75: // Sinistra
    							if(xp>0)
    								xp--;
    						break;
    						case 77: // Destra
    							if(xp<79)
    								xp++;
    						break;
    						case 72: // Alto
    							if(yp>0)
    								yp--;
    						break;
    						case 80: // Basso
    							if(yp<24)
    								yp++;
    						break;
    					}
    				}
    				else
    				{
    					gotoXY(0,0);
    					printf("Codice tasto : %3d,    ", ch);
    					switch( ch )
    					{
    						// Tasti 'normali'
    					}
    				}
    				gotoXY( old_xp, old_yp);
    				cout<<" ";
    				gotoXY( xp, yp);
    				cout<<"X";
    				old_xp=xp;
    				old_yp=yp;
    			}
    		}
    	}
    	while(ch!=27); // Premi ESC per uscire
    	return 0;
    }
    
    
    void direzione(int &x, int &y)
    {
    	switch(rand()%4)
    	{
    
    		case 0:
    			if(y>0)
    				y--;
    		break;
    		case 1:
    			if(y<24)
    				y++;
    		break;
    		case 2:
    			if(x>0)
    				x--;
    		break;
    		case 3:
    			if(x<79)
    				x++;
    		break;
    	}
    }
    Non si può dire che le 'prestazioni' siano esaltanti
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.