Advertisement
Guest User

Untitled

a guest
May 27th, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <time.h>
  5.  
  6. #define MAX_WIDTH 80
  7. #define MAX_HEIGHT 25
  8. #define MAX_STRING 12   // worst case: 2*12 char vertical
  9.  
  10. #define MIN(x,y) y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // min(x, y)
  11. #define MAX(x,y) x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // max(x, y)
  12.  
  13.  
  14. void buildModel(char* occupiedMatrix, char inString[], char* outString, int* minmax);
  15. void buildMatrix(char* displayMatrix, char outString[], int* minmax);
  16. void paintMatrix(char* displayMatrix, int* minmax);
  17.  
  18. int main(int argc, char** argv) {
  19.     srand(time(NULL));
  20.     char inString[MAX_STRING];
  21.     int i, inString_len;
  22.     int minmax[4]={0};
  23.  
  24.     printf("String please [01] (max length = %i): ",MAX_STRING);
  25.     fgets(inString,MAX_STRING,stdin);
  26.     i = 0;
  27.     while(inString[i] != '\0') {
  28.         if (inString[i] == '\n' || inString[i] == '\r') {
  29.             inString[i] = '\0';
  30.             break;
  31.         }
  32.         i++;
  33.     }
  34.     inString_len = i;
  35.     printf("String: >%s< (%i)\n",inString,inString_len);
  36.  
  37.     // init stuff
  38.     /* do that with malloc later
  39.     char modelMatrix[(inString_len*2+1)*(inString_len*2+1)];
  40.     char occupiedMatrx[(inString_len+1)*(inString_len+1)];
  41.     */
  42.     //char modelMatrix[(MAX_STRING*2+1)*(MAX_STRING*2+1)] = {0};    // FIXME
  43.     // ^ needed?
  44.     char occupiedMatrix[(MAX_STRING*2+1)*(MAX_STRING*2+1)] = {0};   // FIXME
  45.     char displayMatrix[MAX_WIDTH*MAX_HEIGHT] = {0};
  46.     char outString[MAX_STRING] = {0};   // needs to get own data type later
  47.  
  48.     buildModel(occupiedMatrix, inString, outString, minmax);
  49.  
  50.     printf("outString: >%s<\n",outString);
  51.     printf("Enjoy your matrix!\n-------------------\n");
  52.     i=1;
  53.     while(i < (MAX_STRING*2+1)*(MAX_STRING*2+1)) {
  54.         //if (occupiedMatrix[i-1]!='x') { _putch('.'); } else { _putch('x'); }
  55.         _putch(occupiedMatrix[i-1]);
  56.         if (i%(MAX_STRING*2+1)==0) _putch('\n');
  57.         i++;
  58.     }
  59.     printf("-------------------------\nDim: x: %i, y: %i\n",minmax[1]-minmax[0]+1,minmax[3]-minmax[2]+1);
  60.  
  61.     buildMatrix(displayMatrix,outString,minmax);
  62.     printf("\nPrepare for displayMatrix\n");
  63.     //while(!_kbhit());
  64.     //_getch();
  65.     /* seperate now
  66.     i=0;
  67.     while (i<MAX_WIDTH*MAX_HEIGHT) {
  68.         _putch(displayMatrix[i]);
  69.         i++;
  70.         if ((minmax[3]-minmax[2]+1)*MAX_WIDTH*2<i) break;
  71.     }
  72.     */
  73.     paintMatrix(displayMatrix, minmax);
  74.  
  75.     printf("\ndone.\n");
  76.     while(!_kbhit());
  77.     return 0;
  78. }
  79.  
  80. void buildModel(char* occupiedMatrix, char inString[], char* outString, int* minmax) {
  81.     int xOffset = MAX_STRING, yOffset = MAX_STRING;
  82.     int x=0,y=0;
  83.     int lineSize = MAX_STRING*2+1;
  84.     int i=0;
  85.     bool foundFree=false;
  86.     int dir, xyDir;
  87.     int axyDir[8]={0,-1 , -1,0 , 0,1 , 1,0 };
  88.     int maxX=0, maxY=0, minX=0, minY=0;
  89. /* OUTSTRING FORMAT:
  90.     .... .tdd
  91.     t:  type
  92.     dd: direction
  93.         00: left
  94.         01: straight
  95.         10: right
  96.         11: end
  97. */
  98.     xyDir=/* rand()%5; /* let's start to the right */ 3;
  99.     while (true) {
  100.         if (inString[i] == '1') {
  101.             outString[i] = 0x04;    // 0000 0100
  102.         } else {
  103.             outString[i] = 0x00;    // 0000 0000
  104.         }
  105.         occupiedMatrix[(x+xOffset)+(y+yOffset)*lineSize]='x';
  106.         maxX=MAX(x,maxX); maxY=MAX(y,maxY);
  107.         minX=MIN(x,minX); minY=MIN(y,minY);
  108.  
  109.         if (inString[i+1]=='\0') {
  110.             outString[i] |= 0x03;   // .... ..11
  111.             break;
  112.         }
  113.         // check for free space
  114.         foundFree=false;
  115.         while(!foundFree) {
  116.             dir = rand()%3;
  117.             if (occupiedMatrix[ (x+xOffset+ axyDir[((xyDir+dir-1+4)%4)*2]) +
  118.                                 (y+yOffset+ axyDir[((xyDir+dir-1+4)%4)*2+1])*lineSize ]
  119.             != 'x' ) {
  120.                 xyDir=(xyDir+dir-1+4)%4;
  121.                 x+=axyDir[xyDir*2]; y+=axyDir[xyDir*2+1];
  122.                 foundFree=true;
  123.             }
  124.  
  125.         }
  126.         outString[i] |= dir;
  127.         printf("step %i - x: %i, y: %i, xyDir: %i, xDir: %i. yDir: %i | val: %i\n",
  128.                i, x,y,xyDir, axyDir[xyDir*2], axyDir[xyDir*2+1],outString[i]);
  129.  
  130.         i++;
  131.     }
  132.  
  133.     minmax[0]=minX;minmax[1]=maxX;
  134.     minmax[2]=minY;minmax[3]=maxY;
  135.     return;
  136. }
  137.  
  138. void buildMatrix(char* displayMatrix, char outString[], int* minmax) {
  139.     int axyDir[8]={0,-1 , -1,0 , 0,1 , 1,0 };
  140.     int x=-minmax[0]*2, y=-minmax[2]*2;
  141.     //int x=40, y=12;
  142.     int i=0, dir, xyDir=3;
  143.     while (true) {
  144.         displayMatrix[x+y*MAX_WIDTH]=((outString[i]>>2) & 1)+1;
  145.         dir = outString[i] & 3;
  146.         if (dir==0x03) break;
  147.         xyDir=(xyDir+dir-1+4)%4;
  148.         x+=axyDir[xyDir*2]; y+=axyDir[xyDir*2+1];
  149.         displayMatrix[x+y*MAX_WIDTH]=0x7c+(xyDir%2)*-79; // '.' for now
  150.         x+=axyDir[xyDir*2]; y+=axyDir[xyDir*2+1];
  151.         i++;
  152.     }
  153. }
  154.  
  155. void paintMatrix(char* displayMatrix, int* minmax) {
  156.     int i=0;
  157.     while (i<MAX_WIDTH*MAX_HEIGHT) {
  158.         _putch(displayMatrix[i]);
  159.         i++;
  160.         if ((minmax[3]-minmax[2]+1)*MAX_WIDTH*2<i) break;
  161.     }
  162.     return;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement