2016-01-12 2 views
0

Программа должна печатать две птицы, летящие по два надписей. Когда птицы находятся в одном месте, программа должна менять цвет. Функция koloruj должна это сделать, но она не работает. Печатается только последний цвет от переключателя.c часть печати не работает на linux

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#define M_PI 3.14159265358979323846 
char tab[30][80]; 
void czysc() 
{ 
    int i, j; 
    for (i = 0; i < 30; i++) 
    { 
     for (j = 0; j < 80; j++) 
     { 
      tab[i][j] = ' '; 
     } 
    } 
} 
typedef struct 
{ 
    char nazwa[10]; 
    int wspolrzedna_x; 
    int wspolrzedna_y; 
} obiekt; 

void koloruj (int c) 
{ 
    int i,j; 
    switch(c) 
    { 
    case 0: 
     for (i = 0; i < 30; i++) 
     { 
      for (j = 0; j < 80; j++) 
      { 
       printf("\x1b[31m %c \n", tab[i][j]); 
      } 
      printf("\n"); 
     } 
     break; 
    case 1: 
     for (i = 0; i < 30; i++) 
     { 
      for (j = 0; j < 80; j++) 
      { 
       printf("\x1b[32m %c \n", tab[i][j]); 
      } 
      printf("\n"); 
     } 
     break; 
    case 2: 
     for (i = 0; i < 30; i++) 
     { 
      for (j = 0; j < 80; j++) 
      { 
       printf("\x1b[33m %c \n", tab[i][j]); 
      } 
      printf("\n"); 
     } 
     break; 
    case 3: 
     for (i = 0; i < 30; i++) 
     { 
      for (j = 0; j < 80; j++) 
      { 
       printf("\x1b[34m %c \n", tab[i][j]); 
      } 
      printf("\n"); 
     } 
     break; 
    case 4: 
     for (i = 0; i < 30; i++) 
     { 
      for (j = 0; j < 80; j++) 
      { 
       printf("\x1b[35m %c \n", tab[i][j]); 
      } 
      printf("\n"); 
     } 
     break; 
    case 5: 
     for (i = 0; i < 30; i++) 
     { 
      for (j = 0; j < 80; j++) 
      { 
       printf("\x1b[36m %c \n", tab[i][j]); 
      } 
      printf("\n"); 
     } 
     break; 
    } 
} 
void conv1(int mod,int x1 ,int y1) 
{ 
    char znak [3][3] = {"-.-", "/*\\", "\\./"}; 
    int n = mod%4; 
    switch(n) 
    { 
    case 0: 
     tab[y1][x1] = znak[0][0]; 
     tab[y1][x1+1] = znak[0][1]; 
     tab[y1][x1+2] = znak[0][2]; 
     break; 
    case 1: 
     tab[y1][x1] = znak[2][0]; 
     tab[y1][x1+1] = znak[2][1]; 
     tab[y1][x1+2] = znak[2][2]; 
     break; 
    case 2: 
     tab[y1][x1] = znak[0][0]; 
     tab[y1][x1+1] = znak[0][1]; 
     tab[y1][x1+2] = znak[0][2]; 
     break; 
    case 3: 
     tab[y1][x1] = znak[1][0]; 
     tab[y1][x1+1] = znak[1][1]; 
     tab[y1][x1+2] = znak[1][2]; 
     break; 
    } 
} 
int main() 
{ 
    int x1, x2, y1, y2, a, b, i, j, rx = 18, ry = 8, z = 0, g = 0, c = 0; 
    float t1; 
    obiekt obiekt_1 = {"ptaszek", x1, y1}; 
    obiekt obiekt_2 = {"samolot", x2, y2}; 
    for (a = 0; a<5; a++) 
    { 
     t1 = 0; 
     for (b = 0; b<64; b++) 
     { 
      x1 = 106/2 + rx*cos(t1); 
      y1 = 24/2 + ry*sin(t1); 
      conv1(z, x1, y1); 
      x2 = 36/2 + rx*cos(t1+2.6); 
      y2 = 24/2 + ry*sin(t1+2.6); 
      conv1(g, x2, y2); 
      if (x1 = x2) 
      { 
       if (y1 = y2) 
        c++; 
      } 
      for (i = 0; i < 24; i++) 
      { 
       for (j = 0; j < 80; j++) 
       { 
        printf ("%c", tab[i][j]); 
       } 
       printf("\n"); 
      } 
      koloruj(c); 
      czysc(); 

      z++; 
      g++; 
      t1+ = 0.1; 

      usleep (100000); 
      system ("clear"); 
     } 
    } 
    return 0; 
} 
+1

Какой терминал вы используете с Linux? Для какого терминала была запрограммирована программа? –

+0

'math.h' определяет M_PI –

+0

@richard Спецификация C не указывает' M_PI' в 'math.h'. Какова ваша ссылка, указывающая на то, что она делает? Возможно, один Linux? – chux

ответ

4

Проблема в том, ваше сравнение:

if(x1=x2) 
    if(y1=y2) 

В C вы используете == в качестве оператора сравнения, вы делаете задания здесь которые оценивают по значению задания.

Кроме того, ваша функция печати может быть сокращено severly:

void koloruj (int c) 
{ 
    int i,j; 
    for(i=0; i<30; i++) 
     { 
      for(j=0; j<80; j++) 
      { 
       printf("\x1b[3%dm %c \n", c+1, tab[i][j]); 
      } 
      printf("\n"); 
     } 
} 
+0

. Кроме того, намерение этой функции печати состоит в том, чтобы заполнить терминал 80x30 данными из таблицы, но для каждого пикселя он записывает пробел-пиксель-пространство-линию, поэтому он не будет формироваться правильное изображение. –

+0

Ну, да, возможно, если его терминал - это то, что мы ожидаем от него;) Я просто попытался решить исходную проблему и показать способ, как сократить короткую сторону, не изменяя при этом поведения. Вероятно, еще многое предстоит исправить;) – Ctx

+0

Теперь программа ничего не печатает. –

Смежные вопросы