code for printing board and placing pieces, simple test in main()

This commit is contained in:
Øystein Ingmar Skartsæterhagen 2008-10-08 21:02:52 +00:00
parent f4fa43c695
commit 4e1e418117

View File

@ -1,5 +1,8 @@
/* -*- c-basic-offset: 4 -*- */
#include <stdio.h>
#include <stdlib.h>
#define NONE 0
#define PHARAO 1
#define DJHED 2
@ -7,44 +10,92 @@
#define OBELISK 4
#define OBELISK2 5
#define N_PIECE_TYPES 6
#define F_ROTATE 1
#define F_SPLIT 2
#define BOARD_WIDTH 10
#define BOARD_HEIGHT 8
struct pieceinfo {
int num;
} pieceinfo[] = {
{ // NONE
.num = 0 },
{ // PHARAO
.num = 1 },
{ // DJHED
.num = 2 },
{ // PYRAMID
.num = 7 },
{ // OBELISK
.num = 4 },
{ // OBELISK2
.num = 0 },
};
struct square {
int piece : 4;
int side : 1;
int dir : 2;
} board[10][8];
unsigned int piece : 4;
unsigned int side : 1;
unsigned int dir : 2;
} board[BOARD_WIDTH][BOARD_HEIGHT];
/*
struct pieceinfo {
char ascii[];
} pieceinfo[] = {
{ //NONE
.ascii = { ' ' } }
{ //PHARAO
.ascii = { '=' } }
{ //DJHED
.ascii = { '/', '\\' } }
{ //PYRAMID
.ascii = { 'd', 'b', 'p', 'q' } }
{ //OBELISK
.ascii = { 'o' } }
{ //OBELISK2
.ascii = { '@' } }
};
*/
char classic_setup[] =
"H40" // PHARAO
"E40E51" // DJHED
"H20G71E20D23E93D90C30" // PYRAMID
"H30H30H50H50" // OBELISK
;
/*
void
print_board() {
for (int y=0; y<8; y++)
for (int x=0; x<10; x++)
;
}
*/
char asciiart_small_pieces[] =
" " // NONE
"OOOOOOOOXXXXXXXX" // PHARAO
".''..''..**..**." // DJHED
"/oo\\o/\\o/xx\\x/\\x" // PYRAMID
"o o o o x x x x " // OBELISK
"ooooooooxxxxxxxx" // OBELISK2
;
void print_piece_small(int piece, int side, int dir)
{
int index = (piece*4*2 + side*4 + dir) * 2;
printf("%c%c",
asciiart_small_pieces[index],
asciiart_small_pieces[index+1]);
}
void print_board_small()
{
int i, j;
char vline, hline, xline;
vline = '|', hline = '-', xline = '+';
printf(" %c", vline);
for (j = 0; j < BOARD_WIDTH; j++)
printf(" %d%c", j, vline);
printf("\n");
for (j = 0; j < BOARD_WIDTH+1; j++)
printf("%c%c%c", hline, hline, xline);
printf("\n");
for (i = 0; i < BOARD_HEIGHT; i++) {
printf(" %c%c", 'A'+i, vline);
for (j = 0; j < BOARD_WIDTH; j++) {
print_piece_small(board[j][i].piece,
board[j][i].side,
board[j][i].dir);
printf("%c", vline);
}
printf("\n");
for (j = 0; j < BOARD_WIDTH+1; j++)
printf("%c%c%c", hline, hline, xline);
printf("\n");
}
}
int
laser(int side) {
@ -148,8 +199,73 @@ move(int side, int x, int y, int dir, int flags) {
return 1;
}
void
place(int row, int col, int piece, int side, int dir)
{
if (board[col][row].piece == OBELISK &&
board[col][row].side == side &&
piece == OBELISK) {
piece = OBELISK2;
} else if (board[col][row].piece != NONE &&
piece != NONE) {
fprintf(stderr, "error: trying to place a piece on a non-empty square\n");
exit(EXIT_FAILURE);
}
board[col][row].piece = piece;
board[col][row].side = side;
board[col][row].dir = dir;
}
void
clear_board()
{
int i, j;
for (i = 0; i < BOARD_HEIGHT; i++)
for (j = 0; j < BOARD_WIDTH; j++)
place(i, j, 0, 0, 0);
}
void
setup_board_place_piece(int piece, int side, char *place_desc)
{
int row, col, dir;
row = place_desc[0]-'A';
col = place_desc[1]-'0';
dir = place_desc[2]-'0';
if (side == 1) {
row = BOARD_HEIGHT-row-1;
col = BOARD_WIDTH-col-1;
dir = (dir+2)&3;
}
place(row, col, piece, side, dir);
}
void
setup_board(char *desc)
{
int side, piece, num, i;
clear_board();
for (side = 0; side < 2; side++) {
i = 0;
for (piece = 0; piece < N_PIECE_TYPES; piece++) {
for (num = 0; num < pieceinfo[piece].num; num++) {
setup_board_place_piece(piece, side,
&desc[i*3]);
i++;
}
}
}
}
int
main() {
setup_board(classic_setup);
print_board_small();
}