鱼C论坛

 找回密码
 立即注册
查看: 1268|回复: 10

[已解决]矩阵游戏循环的条件该怎样改?

[复制链接]
发表于 2018-10-9 16:27:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在二微矩阵中   从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[M][M];

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

int shitou(int x, int y)
{
    if(x < M || y < M)
        map[x][y]='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[x][y]=='.'||map[x][y]=='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][y]!='x')
        map[x][y]=date;
   
        return 0;
}
void print(char arr[][M])
{
    int i,j;
    for(i = 0; i < M; i++){
        for(j = 0; j < M; j++){
              printf("%c", arr[i][j]);}
        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;
}
最佳答案
2018-10-9 23:47:08
………………你这样写代码,会让人不想看
应该是你要的东西,用递归去实现比较适合,目前来说先打好基础~
#include <stdio.h>

#define M 7

int map[M][M];

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

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

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


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

void print(int arr[][M])
{
        for(int i = 0; i < M; i++)
        {
                for(int j = 0; j < M; j++)
                {
                        if(arr[i][j] == 'x' || arr[i][j] == '.')
                                printf("%3c ", arr[i][j]);
                        else
                                printf("%3d ", arr[i][j]);
                }
                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-9 23:47:08 | 显示全部楼层    本楼为最佳答案   
………………你这样写代码,会让人不想看
应该是你要的东西,用递归去实现比较适合,目前来说先打好基础~
#include <stdio.h>

#define M 7

int map[M][M];

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

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

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


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

void print(int arr[][M])
{
        for(int i = 0; i < M; i++)
        {
                for(int j = 0; j < M; j++)
                {
                        if(arr[i][j] == 'x' || arr[i][j] == '.')
                                printf("%3c ", arr[i][j]);
                        else
                                printf("%3d ", arr[i][j]);
                }
                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢大佬 那我如果想要每次递归的时候都显示map那要怎么改? 像我提问那样子的图例 是把print(map)放到fillingmap函数里面吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

#define M 7

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

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

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

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

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


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

void print(int arr[][M])
{
    for(int i = 0; i < M; i++)
    {
        for(int j = 0; j < M; j++)
        {
            if(arr[i][j] == 'x' || arr[i][j] == '.')
                printf("%3c ", arr[i][j]);
            else
                printf("%3d ", arr[i][j]);
        }
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 02:04:51 | 显示全部楼层
claws0n 发表于 2018-10-10 17:23
嗯,放到里面去。上面的代码有稍微修改以下,因为是混合型的地图,不然会打印太多次。

等等 大佬你这个代码有点问题  第一次循环的时候 零的附近应该同时出现四个一 当左边那个因为被石头挡住了所以没有了  然后再从这三个一的上下左右出现二
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 13:28:24 | 显示全部楼层
claws0n 发表于 2018-10-10 17:23
嗯,放到里面去。上面的代码有稍微修改以下,因为是混合型的地图,不然会打印太多次。

等等 大佬你这个代码有点问题  第一次循环的时候 零的附近应该同时出现四个一 当左边那个因为被石头挡住了所以没有了  然后再从这三个一的上下左右出现二
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

正在看,好像有些东西不能少,但是打印的次数多了,重复打印一样的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

#define M 7

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

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

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

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

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

            arr[y1][x1] = arr[y][x] + 1;
            print(arr);          
            fillingMap(arr,x1,y1);
        }
    }
}


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

void print(int arr[][M])
{
    for(int i = 0; i < M; i++)
    {
        for(int j = 0; j < M; j++)
        {
            if(arr[i][j] == 'x' || arr[i][j] == '.')
                printf("%3c ", arr[i][j]);
            else
                printf("%3d ", arr[i][j]);
        }
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬 你现在的代码是 0出现一个1然后后23456这样子进行的  但是你第一次的递归代码是0然后同时出现三个1 然后三个一的附近又同时出现2....如此类推。 我想要的是你第一次的那种
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

递归不是那样实现的,所以无法实现你要的东西。你现在看到的是电脑真正执行递归的步骤。你那种是要迭代,比较麻烦一点吧?没写过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

原来如此  还是感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 12:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表