Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2009, 18:03   #1
profan_Artem
Новичок
Джуниор
 
Регистрация: 14.03.2009
Сообщений: 1
По умолчанию траэктория движения

Всем доброго дня, учу самостоятельно С++(новичек) натолкнулся в книге Дейтла на задачу может встечал кто:
построениие траектории черепахи .
Нужно что бы она реагировала на команды следующим образом:
1 - перо вниз, т.е пишем
2 - перо вверх
3 - поворот направо
4 - поворот налево
5. х - перейти на х шагов
Input 6 - печать
Input 9 - выход,

к примеру команды 1, 5.12, 3, 5.12, 3 , 5.12, 3, 5.12, 2, 6, 9 - напечатает квадрат,
задача не дает покоя второй день( я профан ), вот мои последние мысл по этому поводу, программа еще не работает но для меня важно знать что я двигаюсь в нужном направлении


Код:
#include <iostream.h>
int movePosition(int[][20], int[][20], int, int);
void printArr( int [][20]);



int main()
{   
	const int n =20, m =20; 
	int  turnRight = 0;  
	char comand;
	int floor[n][m] = { 0 };
    int	pen = 0, countLeft = 0 countRight = 0;
    
	
	cout<< "innput comand to turtle : ";
		
	while ((comand = cin.get()) != '9' ){	
		
       switch (comand){

	   case '1':        // перо вниз
			pen = 1;
	        break;
        
		case '2':       // перо вверх
			pen = 0;
			break;
          
        case '3':        // поворот вправо
		               //1
			if ( countRigh == 0){// для движения  слева-направо
				 turnRight = 1;
			     countRight++;
			}
            else 
				if ( countRigh == 1){ // первый поворот направо - движение вниз
					 turnRight = 2;
			         countRight++;
				}
				else 
				    if ( countRigh == 2){ // второй поворот направо - движение справа-налево
 					   	turnRight = 3;
			            countRight++;
				   	}
					else 
						if ( countRight == 3){ // третий  поворот направо - движение вверх
 					     	turnRight = 4;
			                countRight = 0;
						}
			break;
        
		case '4':          // поворот влево
			 countLeft++;
			if ( countLeft == 1  && turnRigh == 0 ){// движение вниз
				 turnRight = 3 ;
			     
	/*		}
            else 
				if ( countLeft  ==2 ){ // 
					 turnRight = 1;
			         countRight++;
				}
				else 
				    if ( turnLeft = 0 && countRigh = 2){ // второй поворот направо
						                                 // движение справа-налево
 					   	turnRight = 3;
			            countRight++;
				   	}
					else 
						if ( turnLeft = 0 && countRight = 3){ // третий  поворот направо
						                                    // движение вверх
 					     	turnRight = 4;
			                countRight = 0;
						}
			break;*/
           
		case '5':
			movePosition (floor, turnRight, pen);
			break;
        
		case '6':       // печать массива
			
			printArr(floor);
			break;
                 
		case '\n': // метки для cin.get - читает по одному символу,ввод тоже символ!!!
		case ' ':
		case '\t':
			break;
			
		default:
			cout<< "you wrong, input correct data "<<endl;
			break;
	   
	   }
	}

		cout<< "innput comand to turtle : ";

return 0;

}

void movePosition( int a[][20], int turnR, int wr)
{   
;   int i = 0, j = 0; 
	int shift = 0; // смещение
    static int store_i = 0, store_j = 0; 

	cout<< "input shift : ";
	cin>> shift;

	if ( wr == 1 ){     // пишем
		if( turnR == 1)   //  движение слева на право   
			for( j = store_j;  j < ( store_j + shift );  j++)
				if ( store_j + shift > 20){
					cout<< " you get out for array limits";
					break;}
				else{
				a[ sotre_i ][ j ] = 9;
			    store_i = i;
			    store_j = j;
			}
			
		else 
			if( turnR == 2)   //  поворот направо - движение вниз    
				for( i = store_i;  i < ( store_i + shift );  j++)
			 	   if ( store_i + shift > 20)
				 	   cout<< " you get out for array limits";
                       break;
				   else {
				   a[ i ][ store_j ] = 9;
			       store_i = i;
			       store_j = j;
				}
			else 
			    if( turnR == 3)   //  поворот направо - движение справа-налево    
					for( j = store_j;  j > ( store_j - shift );  j--)
						if ( store_j - shift < 0){
					        cout<< " you get out for array limits";
							break;}
				        else {
			 	        a[ i ][ store_j ] = 9;
			            store_i = i;
			            store_j = j;
					}
		    	else 
					if( turnR == 4){   //  поворот направо - движение справа-налево    
				     	for( i = store_i;  i > ( store_i - shift );  i--)
							if ( store_i - shift < 0){
								cout<< " you get out for array limits";
								break;}
							else{
			 	            a[ i ][ sotre_j ] = 9;
			                store_i = i;
			                store_j = j;
						}
					}

	}			 
   
void printArr(int a[][20])
{
	for ( int i = 0; i < 20; i++){
		for ( int k = 0; k < 20; k++)
			if( a[i][k] > 0)
			cout<< a[i][k];
		
			cout<< endl;}
люди добрые, помогите кто чем может
Даже тогда, когда ты выражаешь свои мысли предельно ясно, найдутся люди которые тебя не понимают
profan_Artem вне форума Ответить с цитированием
Старый 02.07.2011, 15:18   #2
developerplus
Новичок
Джуниор
 
Регистрация: 31.05.2010
Сообщений: 2
Сообщение Part 1

Задача была сведена к тому что есть 4 направления (вверх, вниз, влево, вправо) и с каждого направления, при нажатии влево/вправо, выбиралось следующее направление и в зависимости от положения пера объект перемещался оставляя за собой следы или не оставляя. Пользуйтесь кодом

Код:
#include <iostream>
using namespace std;
 
void menu(void);
void turnRight(const int x, const int y, int &side);
void turnLeft(const int x, const int y, int &side);
void moveWdraw(int &x,int &y, const int side, int a[][20]);
void moveWOdraw(int &x,int &y, const int side);
 
 
int main()
{
        int a[20][20] = {0};
        int x = 0, y = 0;
        char n;
        bool path = false;
        int side = 2;
 
        cout << "Current direction: " << (unsigned char) 25 << endl;
 
        menu();
 
        while((n = cin.get()) != '9')
        {
                switch(n)
                {
                        case '1':
                                path = false;
                                cout << "draw off" << endl;
                                break;
                        case '2':
                                path = true;
                                cout << "draw on" << endl;
                                break;
                        case '3':               
                                turnRight(x, y, side);
                                break;
                        case '4':
                                turnLeft(x, y, side);
                                break;
                        case '5':
                                if(path == false)
                                {
                                        moveWOdraw(x, y, side);
                                        cout << "move" << endl;
                                }
                                else if(path == true)
                                {
                                        moveWdraw(x, y, side, a);
                                        cout << "draw" << endl;
                                }
                                break;
                        case '6':
                                cout << endl << "Traced array" << endl;
                                for(int i = 0; i < 20; i++)
                                {
                                        for(int j = 0; j< 20; j++)
                                                if (a[i][j] == 1)
                                                        cout << '*';
                                                else
                                                        cout << ' ';
                                        cout << endl;
                                }
                                break;
                        case '\n':
                                break;
                        default:
                                cout <<  "Incorrect entry!" << endl;
                }
        }       
 
        fflush(stdin);
        getchar();
        return 0;
}
developerplus вне форума Ответить с цитированием
Старый 02.07.2011, 15:19   #3
developerplus
Новичок
Джуниор
 
Регистрация: 31.05.2010
Сообщений: 2
Сообщение Part 2

Код:
void menu(void)
{
        cout << endl;
        cout << "1 - draw off" << endl;
        cout << "2 - draw on" << endl;
        cout << "3 - turn " << (unsigned char) 26 << endl;
        cout << "4 - turn " << (unsigned char) 27 << endl;
        cout << "5 - draw/move" << endl;
        cout << "6 - print path" << endl;
        cout << "9 - exit" << endl;
        cout << endl;
}
 
void turnRight(const int x, const int y, int &side)
{
        if(side == 2)
        {
                if(y == 20)
                        cout << "Can not be turned: " << (unsigned char) 26 << endl;
                else
                {
                        side = 4;
                        cout << "Current direction: " << (unsigned char) 26 << endl;
                }
        }
        else if(side == 4)
        {
                if(x == 0)
                        cout << "Can not be turned: " << (unsigned char) 24 << endl;
                else
                {
                        side = 1;
                        cout << "Current direction: " << (unsigned char) 24 << endl;
                }
        }
        else if(side == 1)
        {
                if(y == 0)
                        cout << "Can not be turned: " << (unsigned char) 27 << endl;
                else
                {
                        side = 3;
                        cout << "Current direction: " << (unsigned char) 27 << endl;
                }
        }
        else if(side == 3)
        {
                if(x == 20)
                        cout << "Can not be turned: " << (unsigned char) 25 << endl;
                else
                {
                        side = 2;                               
                        cout << "Current direction: " << (unsigned char) 25 << endl;
                }
        }
}
 
void turnLeft(const int x, const int y, int &side)
{
        if(side == 2)
        {
                if(y == 0)
                        cout << "Can not be turned: " << (unsigned char) 27 << endl;
                else
                {
                        side = 3;
                        cout << "Current direction: " << (unsigned char) 27 << endl;
                }
        }
        else if(side == 3)
        {
                if(x == 0)
                        cout << "Can not be turned: " << (unsigned char) 24 << endl;
                else
                {
                        side = 1;
                        cout << "Current direction: " << (unsigned char) 24 << endl;
                }
        }
        else if(side == 1)
        {
                if(y == 20)
                        cout << "Can not be turned: " << (unsigned char) 26 << endl;
                else
                {
                        side = 4;
                        cout << "Current direction: " << (unsigned char) 26 << endl;
                }
        }
        else if(side == 4)
        {
                if(x == 20)
                        cout << "Can not be turned: " << (unsigned char) 25 << endl;
                else
                {
                        side = 2;
                        cout << "Current direction: " << (unsigned char) 25 << endl;
                }
        }
}
 
void moveWdraw(int &x,int &y, const int side, int a[][20])
{
        if(side == 1)
        {
                for(int i = x; i > x - 5; i--)
                        a[i][y] = 1;
                x -= 5;
        }
        else if(side == 2)
        {
                for(int i = x; i < x + 5; i++)
                        a[i][y] = 1;
                x += 5;
        }
        else if(side == 3)
        {
                for(int i = y; i > y - 5; i--)
                        a[x][i] = 1;
                y -= 5;
        }
        else if(side == 4)
        {
                for(int i = y; i < y + 5; i++)
                        a[x][i] = 1;
                y += 5;         
        }
}
 
void moveWOdraw(int &x,int &y, const int side)
{
        if(side == 1)
                x -= 5;
        else if(side == 2)
                x += 5;
        else if(side == 3)
                y -= 5;
        else if(side == 4)
                y += 5; 
}
developerplus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчет движения voodoomedved Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 25.02.2009 23:07
Детектор движения LARSn Помощь студентам 4 30.01.2009 14:04
Детектор движения LARSn Помощь студентам 3 30.01.2009 08:02
Имитация движения Napster Паскаль, Turbo Pascal, PascalABC.NET 0 20.01.2009 19:19
Движения кнопки xTANATOSx Общие вопросы Delphi 1 06.11.2007 09:19