qpwoeiruyt 发表于 2018-10-9 16:27:17

矩阵游戏循环的条件该怎样改?

在二微矩阵中   从0开始每次循环数字都+1遇到x不能进入循环
如图.......                                  .......                           .......                              .......
      ...xxx.                              ...xxx.                            ...xxx.                           ...xxx.
      .xx...x                              .xx...x                            .xx2..x                        .xx234x
      x....x.         第一次循环:x..1.x.      第二次循环: x.212x.      最终循环: x3212x6
       ..x0.x.                              ..x01x.                            ..x01x.                        54x01x5
       .......                                  ....1..                              ..212..                        4321234
       xx.xxxx                              xx.xxxx                           xx.xxxx                         xx3xxxx
      







#include <stdio.h>
#include<string.h>
#define M 7

char map;

void inicarte(char arr[])
{
   int i,j;
   for(i=0;i<M;i++)
    for(j=0;j<M;j++)
   arr='.';
}

int shitou(int x, int y)
{
    if(x < M || y < M)
      map='x';
      return 1;
    if(x>M||y>M)
      return 0;
}

int lig(int x)
{

    return x;
}
int col(int x)
{
   
    return x;
   
}
int duqu(int x,int y)
{
    if((x>M || y>M)||map=='.'||map=='x')
   return -1;
    else
      return 0;
}
int xieru(int x,int y,char date)
{
    if(x>M || y>M )
      return -1;
    if(x < M && y < M && map!='x')
      map=date;
   
      return 0;
}
void print(char arr[])
{
    int i,j;
    for(i = 0; i < M; i++){
      for(j = 0; j < M; j++){
            printf("%c", arr);}
      printf("\n");}
    printf("\n");
}


int main()
{
   
    inicarte(map);
    shitou(1,3);
    shitou(1,4);
    shitou(1,5);
    shitou(2,1);
    shitou(2,2);
    shitou(2,6);
    shitou(3,0);
    shitou(3,5);
    shitou(4,2);
    shitou(4,5);
    shitou(6,0);
    shitou(6,1);
    shitou(6,3);
    shitou(6,4);
    shitou(6,5);
   shitou(6,6);
    int x=lig(4);
    int y=col(3);
    xieru(x,y,48);
    int xunhuan =4;
    int i;
    for (i=0;i<xuhuan;i++){      
      if (duqu(x,y) !=-1)
            xieru(x-i,y,48+i);
            xieru(x+i,y,48+i);
            xieru(x,y-i,48+i);
         xieru(x,y+i,48+i);

      print(map);}
       return 0;
}

claws0n 发表于 2018-10-9 23:47:08

………………你这样写代码,会让人不想看
应该是你要的东西,用递归去实现比较适合,目前来说先打好基础~#include <stdio.h>

#define M 7

int map;

void initMap(int arr[],int x, int y)
{
        for(int i = 0; i < M; i++)
                for(int j = 0; j < M; j++)
                        arr = '.';
        arr = 0;
}

void placeRock(int x, int y)
{
    if(x < M && y < M)
      map = 'x';
}

void fillingMap(int arr[],int x, int y)
{
        int move_x = {-1, 0, 1, 0};
        int move_y = {0, -1, 0, 1};
        int x1,y1;
       
        for(int i = 0; i < 4; i++)
        {
                x1 = x + move_x;
                y1 = y + move_y;
       
                if(x1 >= 0 && x1 < M && y1 >= 0 && y1 < M)
                {
                        if(arr == 'x')
                                continue;
                        if(arr < arr)
                                continue;
                        arr = arr + 1;
                        fillingMap(arr,x1,y1);
                }
       
        }
}


void fillMap(int arr[])
{
        int x, y, flag = 0;
        for(y = 0; y < M; y++)
        {
                for(x = 0; x < M; x++)
                {
                        if(arr == 0)
                        {
                                flag = 1;
                                break;
                        }
                }
                if(flag) break;
        }
       
        fillingMap(map,x,y);
}

void print(int arr[])
{
        for(int i = 0; i < M; i++)
        {
                for(int j = 0; j < M; j++)
                {
                        if(arr == 'x' || arr == '.')
                                printf("%3c ", arr);
                        else
                                printf("%3d ", arr);
                }
                printf("\n");
        }
        printf("\n");
}

int main()
{
   
        initMap(map,3,4);
        placeRock(0,3); placeRock(0,6);        placeRock(1,6);       
        placeRock(2,1);        placeRock(2,2);        placeRock(2,4);       
        placeRock(3,1);        placeRock(3,6);        placeRock(4,1);
        placeRock(4,6);        placeRock(5,1);        placeRock(5,3);
        placeRock(5,4);        placeRock(5,6);        placeRock(6,2);
        placeRock(6,6);
        print(map);
        fillMap(map);
        print(map);
       
        return 0;
}

qpwoeiruyt 发表于 2018-10-10 23:18:15

claws0n 发表于 2018-10-9 16:47
………………你这样写代码,会让人不想看
应该是你要的东西,用递归去实现比较适合,目前来说先打好基础~

感谢大佬 那我如果想要每次递归的时候都显示map那要怎么改? 像我提问那样子的图例 是把print(map)放到fillingmap函数里面吗?

claws0n 发表于 2018-10-11 00:23:07

qpwoeiruyt 发表于 2018-10-10 23:18
感谢大佬 那我如果想要每次递归的时候都显示map那要怎么改? 像我提问那样子的图例 是把print(map)放到 ...

嗯,放到里面去。上面的代码有稍微修改以下,因为是混合型的地图,不然会打印太多次。#include <stdio.h>

#define M 7

int map;
void print(int arr[]);

void initMap(int arr[],int x, int y)
{
    for(int i = 0; i < M; i++)
      for(int j = 0; j < M; j++)
            arr = '.';
    arr = 0;
}

void placeRock(int x, int y)
{
    if(x < M && y < M)
      map = 'x';
}

void fillingMap(int arr[],int x, int y)
{
    int move_x = {-1, 0, 1, 0};
    int move_y = {0, -1, 0, 1};
    int x1,y1;
   
    for(int i = 0; i < 4; i++)
    {
      x1 = x + move_x;
      y1 = y + move_y;

      if(x1 >= 0 && x1 < M && y1 >= 0 && y1 < M)
      {
            if(arr == '.')
            {
                    arr = arr + 1;
                    print(map);
            }
            else
                continue;
            fillingMap(arr,x1,y1);
      }
    }
}


void fillMap(int arr[])
{
    int x, y, flag = 0;
    for(y = 0; y < M; y++)
    {
      for(x = 0; x < M; x++)
      {
            if(arr == 0)
            {
                flag = 1;
                break;
            }
      }
      if(flag) break;
    }
   
    fillingMap(map,x,y);
}

void print(int arr[])
{
    for(int i = 0; i < M; i++)
    {
      for(int j = 0; j < M; j++)
      {
            if(arr == 'x' || arr == '.')
                printf("%3c ", arr);
            else
                printf("%3d ", arr);
      }
      printf("\n");
    }
    printf("\n");
}

int main()
{
    initMap(map,3,4);
    placeRock(0,3); placeRock(0,6); placeRock(1,6);      
    placeRock(2,1); placeRock(2,2); placeRock(2,4);      
    placeRock(3,1); placeRock(3,6); placeRock(4,1);
    placeRock(4,6); placeRock(5,1); placeRock(5,3);
    placeRock(5,4); placeRock(5,6); placeRock(6,2);
    placeRock(6,6);
    print(map);
    fillMap(map);

    return 0;
}

qpwoeiruyt 发表于 2018-10-11 02:04:51

claws0n 发表于 2018-10-10 17:23
嗯,放到里面去。上面的代码有稍微修改以下,因为是混合型的地图,不然会打印太多次。

等等 大佬你这个代码有点问题第一次循环的时候 零的附近应该同时出现四个一 当左边那个因为被石头挡住了所以没有了然后再从这三个一的上下左右出现二

qpwoeiruyt 发表于 2018-10-11 13:28:24

claws0n 发表于 2018-10-10 17:23
嗯,放到里面去。上面的代码有稍微修改以下,因为是混合型的地图,不然会打印太多次。

等等 大佬你这个代码有点问题第一次循环的时候 零的附近应该同时出现四个一 当左边那个因为被石头挡住了所以没有了然后再从这三个一的上下左右出现二

claws0n 发表于 2018-10-11 13:31:12

qpwoeiruyt 发表于 2018-10-11 13:28
等等 大佬你这个代码有点问题第一次循环的时候 零的附近应该同时出现四个一 当左边那个因为被石头挡住 ...

正在看,好像有些东西不能少,但是打印的次数多了,重复打印一样的东西

claws0n 发表于 2018-10-11 13:51:10

qpwoeiruyt 发表于 2018-10-11 13:28
等等 大佬你这个代码有点问题第一次循环的时候 零的附近应该同时出现四个一 当左边那个因为被石头挡住 ...

输出无法看完全部,能够显示的行数有限#include <stdio.h>

#define M 7

int map;
void print(int arr[]);

void initMap(int arr[],int x, int y)
{
    for(int i = 0; i < M; i++)
      for(int j = 0; j < M; j++)
            arr = '.';
    arr = 0;
}

void placeRock(int x, int y)
{
    if(x < M && y < M)
      map = 'x';
}

void fillingMap(int arr[],int x, int y)
{
    int move_x = {-1, 0, 1, 0};
    int move_y = {0, -1, 0, 1};
    int x1,y1;
   
    for(int i = 0; i < 4; i++)
    {
      x1 = x + move_x;
      y1 = y + move_y;

      if(x1 >= 0 && x1 < M && y1 >= 0 && y1 < M)
      {
            if(arr == 'x')
                continue;
            if(arr < arr)
                continue;
            if(arr == arr + 1)
                continue;

            arr = arr + 1;
            print(arr);         
            fillingMap(arr,x1,y1);
      }
    }
}


void fillMap(int arr[])
{
    int x, y, flag = 0;
    for(y = 0; y < M; y++)
    {
      for(x = 0; x < M; x++)
      {
            if(arr == 0)
            {
                flag = 1;
                break;
            }
      }
      if(flag) break;
    }
   
    fillingMap(map,x,y);
}

void print(int arr[])
{
    for(int i = 0; i < M; i++)
    {
      for(int j = 0; j < M; j++)
      {
            if(arr == 'x' || arr == '.')
                printf("%3c ", arr);
            else
                printf("%3d ", arr);
      }
      printf("\n");
    }
    printf("\n");
}

int main()
{
    initMap(map,3,4);
    placeRock(0,3); placeRock(0,6); placeRock(1,6);      
    placeRock(2,1); placeRock(2,2); placeRock(2,4);      
    placeRock(3,1); placeRock(3,6); placeRock(4,1);
    placeRock(4,6); placeRock(5,1); placeRock(5,3);
    placeRock(5,4); placeRock(5,6); placeRock(6,2);
    placeRock(6,6);
    print(map);
    fillMap(map);

    return 0;
}

qpwoeiruyt 发表于 2018-10-11 17:41:30

claws0n 发表于 2018-10-11 06:51
输出无法看完全部,能够显示的行数有限

大佬 你现在的代码是 0出现一个1然后后23456这样子进行的但是你第一次的递归代码是0然后同时出现三个1 然后三个一的附近又同时出现2....如此类推。 我想要的是你第一次的那种

claws0n 发表于 2018-10-11 17:54:54

qpwoeiruyt 发表于 2018-10-11 17:41
大佬 你现在的代码是 0出现一个1然后后23456这样子进行的但是你第一次的递归代码是0然后同时出现三个1...

递归不是那样实现的,所以无法实现你要的东西。你现在看到的是电脑真正执行递归的步骤。你那种是要迭代,比较麻烦一点吧?没写过

qpwoeiruyt 发表于 2018-10-11 17:56:42

claws0n 发表于 2018-10-11 10:54
递归不是那样实现的,所以无法实现你要的东西。你现在看到的是电脑真正执行递归的步骤。你那种是要迭代, ...

原来如此还是感谢大佬
页: [1]
查看完整版本: 矩阵游戏循环的条件该怎样改?