用C画一个游戏板
Drawing a game board in C
好吧,正如标题所说,我正在尝试画一个游戏板。好吧,我自己做的板子看起来像他的:
4 |
3 |
2 |
1 |
0 |
- - - - -
0 1 2 3 4
但这不是问题所在。我觉得很难的是我想在板上画星形 (*) 的图标,坐标在这样的数组中给出
posX {2,4,2,1}
posY {2,3,4,4}
所以在这种情况下,我应该在坐标 (2,2) 、 (4,3) 、 (2,4) 、 (1,4) 等处绘制 *。有什么想法吗?
如果你在终端(控制台)上打印这些,你不能简单地打印坐标轴然后返回并放置坐标,但是如果你的坐标系足够小,重绘应该没有问题每次添加新点时整个板。
一种简单的方法是保留一个二维字符数组,并根据坐标放置“”或“*”。这样,每次将新点添加到坐标时,您都可以简单地逐行打印二维数组。
当然,您还负责打印坐标轴,但这部分应该是直截了当的。
char points [4][4] ={
{' ',' ',' ',' '},
{' ',' ',' ',' '},
{' ',' ',' ',' '},
{' ',' ',' ',' '},
};
这就是你将拥有的空白板。现在如果你想在坐标 (1,2) 输入一些东西,你需要做的就是说 points[1][2]='*';
要打印整个数组,您需要一个嵌套循环,外部循环遍历行,内部循环遍历列。像这样:
int i,j;
for (i=0; i<4; ++i)
{
for (j=0; j<4; ++j) printf("%c ", points[i][j]);
printf("\n");
}
这样坐标值将从左到右,从上到下递增。如果你想要,你应该改变 for 循环边界。
刷新屏幕我建议您打印一大堆换行符以有效清除屏幕。还有其他方法可以做到这一点(比如系统("cls"),但不是那么无痛
这说明了我在评论中的意思,也许它有帮助。在打印之前,它会准备一个代表游戏板的字符串数组。
#include <stdio.h>
#include <stdlib.h>
#define BOARDX 5
#define BOARDY 5
#define BOARDW (BOARDX*2) // length of text line
char board [BOARDY][BOARDW+1]; // allow for string terminator
void print_board(void)
{
int y, x;
for(y=BOARDY-1; y>=0; y--) {
printf("%-2d|%s\n", y, board[y]);
}
printf(" ");
for(x=0; x<BOARDX; x++)
printf(" -");
printf("\n");
printf(" ");
for(x=0; x<BOARDX; x++)
printf("%2d", x);
printf("\n");
}
void empty_board(void)
{
int y, x;
for(y=0; y<BOARDY; y++) {
for(x=0; x<BOARDW; x++) {
board[y][x] = ' ';
}
board[y][x] = '[=10=]';
}
}
void poke_board(int x, int y, char c)
{
if (y >= 0 && y < BOARDY && x >= 0 && x < BOARDX)
board[y][x*2+1] = c; // correctly spaced
}
int main(void)
{
int posX[]= {2,4,2,1};
int posY[]= {2,3,4,4};
int len = sizeof(posX) / sizeof(posX[0]);
int n;
empty_board();
for(n=0; n<len; n++) {
poke_board(posX[n], posY[n], '*');
}
print_board();
return 0;
}
程序输出:
4 | * *
3 | *
2 | *
1 |
0 |
- - - - -
0 1 2 3 4
好吧,正如标题所说,我正在尝试画一个游戏板。好吧,我自己做的板子看起来像他的:
4 |
3 |
2 |
1 |
0 |
- - - - -
0 1 2 3 4
但这不是问题所在。我觉得很难的是我想在板上画星形 (*) 的图标,坐标在这样的数组中给出
posX {2,4,2,1}
posY {2,3,4,4}
所以在这种情况下,我应该在坐标 (2,2) 、 (4,3) 、 (2,4) 、 (1,4) 等处绘制 *。有什么想法吗?
如果你在终端(控制台)上打印这些,你不能简单地打印坐标轴然后返回并放置坐标,但是如果你的坐标系足够小,重绘应该没有问题每次添加新点时整个板。
一种简单的方法是保留一个二维字符数组,并根据坐标放置“”或“*”。这样,每次将新点添加到坐标时,您都可以简单地逐行打印二维数组。
当然,您还负责打印坐标轴,但这部分应该是直截了当的。
char points [4][4] ={
{' ',' ',' ',' '},
{' ',' ',' ',' '},
{' ',' ',' ',' '},
{' ',' ',' ',' '},
};
这就是你将拥有的空白板。现在如果你想在坐标 (1,2) 输入一些东西,你需要做的就是说 points[1][2]='*';
要打印整个数组,您需要一个嵌套循环,外部循环遍历行,内部循环遍历列。像这样:
int i,j;
for (i=0; i<4; ++i)
{
for (j=0; j<4; ++j) printf("%c ", points[i][j]);
printf("\n");
}
这样坐标值将从左到右,从上到下递增。如果你想要,你应该改变 for 循环边界。
刷新屏幕我建议您打印一大堆换行符以有效清除屏幕。还有其他方法可以做到这一点(比如系统("cls"),但不是那么无痛
这说明了我在评论中的意思,也许它有帮助。在打印之前,它会准备一个代表游戏板的字符串数组。
#include <stdio.h>
#include <stdlib.h>
#define BOARDX 5
#define BOARDY 5
#define BOARDW (BOARDX*2) // length of text line
char board [BOARDY][BOARDW+1]; // allow for string terminator
void print_board(void)
{
int y, x;
for(y=BOARDY-1; y>=0; y--) {
printf("%-2d|%s\n", y, board[y]);
}
printf(" ");
for(x=0; x<BOARDX; x++)
printf(" -");
printf("\n");
printf(" ");
for(x=0; x<BOARDX; x++)
printf("%2d", x);
printf("\n");
}
void empty_board(void)
{
int y, x;
for(y=0; y<BOARDY; y++) {
for(x=0; x<BOARDW; x++) {
board[y][x] = ' ';
}
board[y][x] = '[=10=]';
}
}
void poke_board(int x, int y, char c)
{
if (y >= 0 && y < BOARDY && x >= 0 && x < BOARDX)
board[y][x*2+1] = c; // correctly spaced
}
int main(void)
{
int posX[]= {2,4,2,1};
int posY[]= {2,3,4,4};
int len = sizeof(posX) / sizeof(posX[0]);
int n;
empty_board();
for(n=0; n<len; n++) {
poke_board(posX[n], posY[n], '*');
}
print_board();
return 0;
}
程序输出:
4 | * *
3 | *
2 | *
1 |
0 |
- - - - -
0 1 2 3 4