c - 如何使用变量参数同时打印两个变量?有没有更好的方法来做到这一点?
问题描述
我正在学习和练习 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
-----------
解决方案
为玩家使用数组,而不是多个变量和变量参数列表。
在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");
}
推荐阅读
- wordpress - 当用户来自 URL 时如何隐藏元素
- javascript - 如何从javascript中的函数更改另一个变量字符串中的变量字符串
- java - Maven 资源插件忽略排除列表
- excel - 我们无法更新您工作簿中的某些链接
- python - OWSLib wms在python中获取多层
- sql - 第二个查询仅在 CTE 结束后执行
- laravel - 以多对多关系存储相关项目 Laravel
- c# - C# - 展平嵌套的 Json
- terraform - 刷新状态时出错:状态快照由 Terraform v0.15.0 创建,比当前 v0.12.18 更新
- sql - 从 GDELT 查询中提取主题或文本的 URL