首页 > 解决方案 > 如何使用变量参数同时打印两个变量?有没有更好的方法来做到这一点?

问题描述

我正在学习和练习 c 编程,我有一个想法,可以在使用“x”和“0”制作的战场上打印一个玩家,“0”是可以放置玩家“x”的地方,我想能够使用 c 中的可变参数将多个“x”玩家放置在一个战场上。我想创建它来练习如何在需要时简化我的代码。当我只插入一个'x'时它很好但是当我插入多个'x'时这个代码不起作用。(我的意思是我可以创建结构并传递它并放置尽可能多的'x'但是这种方式是漫长的方式)所以我使用了可变参数。关于如何修改此代码以最简单的方式将两个或多个“x”放在同一个战场上的任何想法。我也在考虑使用文件处理,

这可以使用可变参数工作吗?如果是怎么办?如果没有,那么我应该如何以非常有效和快速的方式做到这一点?我的代码是(我的代码看起来可以正常工作,但 'man2' 的位置不正确:

#include <stdio.h>
#include <stdarg.h>

struct player{     
    int positionx;
    int positiony;
};

void placePlayer(int num,...);

int main(){
    printf("Battle Feild : \n");

    struct player man1;
    man1.positionx=1;
    man1.positiony=5;

    struct player man2;
    man2.positionx=4;
    man2.positiony=3;

    /* struct player man3;
    man3.positionx=2;//I want to insert as many x as I want
    man3.positiony=1; */
    placePlayer(2,man1,man2);

}

void placePlayer(int num,...){
    va_list valist;
    va_start(valist,num);
        struct player posi=va_arg(valist,struct player);
        printf("-----------\n");
    for(int j=0; j<=6; j++){
        for(int i=0; i<=10; i++){
            if( (i==posi.positionx && j==posi.positiony) ||
                (i==posi.positionx && j==posi.positiony) || 
                (i==va_arg(valist,struct player).positionx 
                && j==va_arg(valist,struct player).positiony) || 
                (i==va_arg(valist,struct player).positionx &&
                 j==va_arg(valist,struct player).positiony)){
                printf("X");
            }
            else{
                printf("0");
            }
        }
        putchar('\n');
    }
    printf("-----------\n");
    va_end(valist);
}

输出:

Battle Feild : 
-----------
0000X000000
00000000000
00000000000
00000000000
00000000000
0X000000000
00000000000
-----------

标签: cmultidimensional-array

解决方案


为玩家使用数组,而不是多个变量和变量参数列表。

placeplayer()中,使用二维数组来保存网格,并从玩家位置填充它。

#include <stdio.h>

#define PLAYER_COUNT 2
#define GRID_WIDTH 10
#define GRID_HEIGHT 7

typedef struct player{
    int positionx;
    int positiony;
} player;

void placePlayer(int num, player players[]);

int main(){
    printf("Battle Feild : \n");

    player man[PLAYER_COUNT] = {{1, 5}, {4, 3}};
    placePlayer(PLAYER_COUNT, man);

}

void placePlayer(int num, player players[]){
    char grid[GRID_HEIGHT][GRID_WIDTH];
    // Initialize array to all 0
    for(int j=0; j < GRID_HEIGHT; j++){
        for(int i=0; i < GRID_WIDTH; i++){
            grid[j][i] = '0';
        }
    }
    // Place X for the players
    for (int i = 0; i < num; i++) {
        grid[players[i].positionx][players[i].positiony] = 'X';
    }
    printf("-----------\n");
    for (int i = 0; i < GRID_HEIGHT; i++) {
        for (int j = 0; j < GRID_WIDTH; j++) {
            putchar(grid[i][j]);
        }
        putchar('\n');
    }
    printf("-----------\n");
}

推荐阅读