⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maze.c

📁 Many C samples. It is a good sample for students to learn C language.
💻 C
📖 第 1 页 / 共 3 页
字号:
  int *wall;
  int *x_max;
  int *y_max;
  int *fatal_error;
    {
      int             finished;
      int             delta_index_1;
      int             delta_index_2;
      int             digit;
      int             digit_num;
      int             recurse;
      int             r_n_index_1;
      int             r_n_index_2;
      stack_2_rec_ptr stack_head;
      stack_2_rec_ptr stack_ptr;
      int             sum;
      int             tem_int;
      int             x;
      int             x_next;
      int             x_out;
      int             y;
      int             y_next;
      int             y_out;

      setcolor(*path);
      setfillstyle((unsigned int) SOLID_FILL,(unsigned int) *path);
      bar(0,0,*x_max,*y_max);
      if (*path != *wall)
        {
          setcolor((unsigned int) *wall);
          x_out=0;
          while (x_out <= *x_max)
            {
              line(x_out,0,x_out,*y_max);
              x_out+=(*twice_magnitude_delta_x);
            }
          y_out=0;
          while (y_out <= *y_max)
            {
              line(0,y_out,*x_max,y_out);
              y_out+=(*twice_magnitude_delta_y);
            }
        }
      sum=0;
      for (digit_num=1; digit_num <= 3; digit_num++)
        {
          digit=*r_n;
          r_n_index_1=0;
          for (r_n_index_2=1; r_n_index_2 < 8; r_n_index_2++)
            {
              tem_int=*(r_n+r_n_index_2);
              *(r_n+r_n_index_1)=tem_int;
              r_n_index_1++;
              digit+=tem_int;
              if (digit >= 29)
                digit-=29;
            }
          *(r_n+7)=digit;
          sum=29*sum+digit;
        }
      x=(2*(sum%(*num_columns))+1)*(*magnitude_delta_x);
      sum=0;
      for (digit_num=1; digit_num <= 3; digit_num++)
        {
          digit=*r_n;
          r_n_index_1=0;
          for (r_n_index_2=1; r_n_index_2 < 8; r_n_index_2++)
            {
              tem_int=*(r_n+r_n_index_2);
              *(r_n+r_n_index_1)=tem_int;
              r_n_index_1++;
              digit+=tem_int;
              if (digit >= 29)
                digit-=29;
            }
          *(r_n+7)=digit;
          sum=29*sum+digit;
        }
      y=(2*(sum%(*num_rows))+1)*(*magnitude_delta_y);
      setcolor((unsigned int) *passage);
      setfillstyle((unsigned int) SOLID_FILL,(unsigned int) *passage);
      finished=FALSE;
      recurse=TRUE;
      stack_head=NULL;
      while ((! finished) && (! *fatal_error))
        {
          if (recurse)
            {
              bar(x-(*magnitude_delta_x)+1,y-(*magnitude_delta_y)+1,
               x+(*magnitude_delta_x)-1,y+(*magnitude_delta_y)-1);
              delta_index_1=0;
              do
                {
                  delta_index_2=*r_n;
                  r_n_index_1=0;
                  for (r_n_index_2=1; r_n_index_2 < 8; r_n_index_2++)
                    {
                      tem_int=*(r_n+r_n_index_2);
                      *(r_n+r_n_index_1)=tem_int;
                      r_n_index_1++;
                      delta_index_2+=tem_int;
                      if (delta_index_2 >= 29)
                        delta_index_2-=29;
                    }
                  *(r_n+7)=delta_index_2;
                }
              while (delta_index_2 >= 24);
              recurse=FALSE;
            }
            while ((delta_index_1 < 4)
            &&     (! recurse)
            &&     (! *fatal_error))
              {
                x_next=x+2*(*(delta_x+(24*delta_index_1+delta_index_2)));
                if ((x_next <= 0) || (x_next >= *x_max))
                  delta_index_1++;
                else
                  {
                    y_next
                     =y+2*(*(delta_y+(24*delta_index_1+delta_index_2)));
                    if ((y_next <= 0) || (y_next >= *y_max))
                      delta_index_1++;
                    else
                      if (getpixel(x_next,y_next)
                       == (unsigned int)*path)
                        {
                          if (x == x_next)
                            {
                              y_out=(y+y_next)/2;
                              line(x-(*magnitude_delta_x)+1,y_out,
                               x+(*magnitude_delta_x)-1,y_out);
                            }
                          else
                            {
                              x_out=(x+x_next)/2;
                              line(x_out,y-(*magnitude_delta_y)+1,
                               x_out,y+(*magnitude_delta_y)-1);
                            }
                          x=x_next;
                          y=y_next;
                          if ((stack_ptr=(struct stack_2_rec *) malloc(
                           (unsigned) sizeof(struct stack_2_rec)))
                           == NULL)
                            {
                              *fatal_error=TRUE;
                              closegraph();
                              printf("? out of memory\n");
                            }
                          else
                            {
                              stack_ptr->next_ptr=stack_head;
                              stack_head=stack_ptr;
                              stack_head->index_1
                               =(unsigned char) delta_index_1;
                              stack_head->index_2
                               =(unsigned char) delta_index_2;
                              recurse=TRUE;
                            }
                        }
                      else
                        delta_index_1++;
                  }
              }
            if ((! recurse) && (! *fatal_error))
              {
                delta_index_1=(int) stack_head->index_1;
                delta_index_2=(int) stack_head->index_2;
                stack_ptr=stack_head;
                stack_head=stack_head->next_ptr;
                free((char *) stack_ptr);
                if (stack_head == NULL)
                  finished=TRUE;
                else
                  {
                    x-=
                     (2*(*(delta_x+(24*delta_index_1+delta_index_2))));
                    y-=
                     (2*(*(delta_y+(24*delta_index_1+delta_index_2))));
                  }
              }
        }
      if (! *fatal_error)
        {
          line(1,0,(*twice_magnitude_delta_x)-1,0);
          line(*x_max-(*twice_magnitude_delta_x)+1,*y_max,
           *x_max,*y_max);
          sound(1000);
          delay(333);
          nosound();
        }
      return;
    }

static void remove_rejected_attempts(delta_x,delta_y,erase,passage,
 stack_head,stack_ptr,x,x_next,y,y_next,fatal_error)
  int             *delta_x;
  int             *delta_y;
  int             *erase;
  int             *passage;
  stack_1_rec_ptr *stack_head;
  stack_1_rec_ptr *stack_ptr;
  int             *x;
  int             *x_next;
  int             *y;
  int             *y_next;
  int             *fatal_error;
    {
      int             delta_index_1;
      int             finished;
      int             recurse;
      stack_1_rec_ptr stack_start;

      stack_start=*stack_head;
      if (*erase != *passage)
        {
          recurse=TRUE;
          finished=FALSE;
          while ((! finished) && (! *fatal_error))
            {
              if (recurse)
                {
                  delta_index_1=0;
                  recurse=FALSE;
                }
              while ((delta_index_1 <= 3)
              &&     (! recurse))
                if (*stack_head == NULL)
                  {
                    *x_next=(*x)+(*(delta_x+(24*delta_index_1)));
                    *y_next=(*y)+(*(delta_y+(24*delta_index_1)));
                    if (getpixel(*x_next,*y_next)
                     == (unsigned int) *erase)
                      {
                        *x_next+=(*(delta_x+(24*delta_index_1)));
                        *y_next+=(*(delta_y+(24*delta_index_1)));
                        *x=(*x_next);
                        *y=(*y_next);
                        if ((*stack_ptr=(struct stack_1_rec *) malloc(
                         (unsigned) sizeof(struct stack_1_rec)))
                         == NULL)
                          {
                            *fatal_error=TRUE;
                            closegraph();
                            printf("? out of memory\n");
                          }
                        else
                          {
                            (*stack_ptr)->next_ptr=*stack_head;
                            *stack_head=(*stack_ptr);
                            (*stack_head)->index_1
                             =(unsigned char) delta_index_1;
                            recurse=TRUE;
                          }
                      }
                    else
                      delta_index_1++;
                  }
                else
                  if ((delta_index_1 + 2) % 4
                   == (int) (*stack_head)->index_1)
                    delta_index_1++;
                  else
                    {
                      *x_next=(*x)+(*(delta_x+(24*delta_index_1)));
                      *y_next=(*y)+(*(delta_y+(24*delta_index_1)));
                      if (getpixel(*x_next,*y_next)
                       == (unsigned int) *erase)
                        {
                          *x_next+=(*(delta_x+(24*delta_index_1)));
                          *y_next+=(*(delta_y+(24*delta_index_1)));
                          *x=(*x_next);
                          *y=(*y_next);
                          if ((*stack_ptr=(struct stack_1_rec *) malloc(
                           (unsigned) sizeof(struct stack_1_rec)))
                           == NULL)
                            {
                              *fatal_error=TRUE;
                              closegraph();
                              printf("? out of memory\n");
                            }
                          else
                            {
                              (*stack_ptr)->next_ptr=(*stack_head);
                              *stack_head=(*stack_ptr);
                              (*stack_head)->index_1
                               =(unsigned char) delta_index_1;
                              recurse=TRUE;
                            }
                        }
                      else
                        delta_index_1++;
                    }
              if ((delta_index_1 > 3) && (! *fatal_error))
                {
                  if (stack_start == *stack_head)
                    finished=TRUE;
                  else
                    {
                      setcolor((unsigned int) *passage);
                      *x_next=(*x);
                      *y_next=(*y);
                      delta_index_1=(int) ((*stack_head)->index_1);
                      *stack_ptr=(*stack_head);
                      (*stack_head)=(*stack_head)->next_ptr;
                      free((char *) *stack_ptr);
                      *x-=(2*(*(delta_x+(24*delta_index_1))));
                      *y-=(2*(*(delta_y+(24*delta_index_1))));
                      line(*x,*y,*x_next,*y_next);
                      delta_index_1++;
                    }
                }
            }
        }
      return;
    }

static void let_user_try_to_solve(delta_x,delta_y,erase,key_pressed,
 magnitude_delta_x,magnitude_delta_y,passage,path,wall,y_max,
 fatal_error)
  int *delta_x;
  int *delta_y;
  int *erase;
  int *key_pressed;
  int *magnitude_delta_x;
  int *magnitude_delta_y;
  int *passage;
  int *path;
  int *wall;
  int *y_max;
  int *fatal_error;
    {
      int             color;
      int             delta_index_1;
      int             frequency;
      int             passage_found;
      stack_1_rec_ptr stack_head;
      stack_1_rec_ptr stack_ptr;
      int             x;
      int             x_next;
      int             y;
      int             y_next;

      stack_head=NULL;
      x=*magnitude_delta_x;
      y=*magnitude_delta_y;
      y_next=0;
      setcolor((unsigned int) *path);
      line(x,0,x,y);
      do
        {
          do
            {
              passage_found=TRUE;
              *key_pressed=getch();
              if ((*key_pressed != (int) 'Q')
              &&  (*key_pressed != (int) 'q')
              &&  (*key_pressed != (int) 'S')
              &&  (*key_pressed != (int) 's'))
                {
                  if (*key_pressed == 0)
                    {
                      *key_pressed=getch();
                      switch (*key_pressed)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -