code for printing board and placing pieces, simple test in main()
This commit is contained in:
178
src/server.c
178
src/server.c
@@ -1,5 +1,8 @@
|
|||||||
/* -*- c-basic-offset: 4 -*- */
|
/* -*- c-basic-offset: 4 -*- */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define NONE 0
|
#define NONE 0
|
||||||
#define PHARAO 1
|
#define PHARAO 1
|
||||||
#define DJHED 2
|
#define DJHED 2
|
||||||
@@ -7,44 +10,92 @@
|
|||||||
#define OBELISK 4
|
#define OBELISK 4
|
||||||
#define OBELISK2 5
|
#define OBELISK2 5
|
||||||
|
|
||||||
|
#define N_PIECE_TYPES 6
|
||||||
|
|
||||||
#define F_ROTATE 1
|
#define F_ROTATE 1
|
||||||
#define F_SPLIT 2
|
#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 {
|
struct square {
|
||||||
int piece : 4;
|
unsigned int piece : 4;
|
||||||
int side : 1;
|
unsigned int side : 1;
|
||||||
int dir : 2;
|
unsigned int dir : 2;
|
||||||
} board[10][8];
|
} board[BOARD_WIDTH][BOARD_HEIGHT];
|
||||||
|
|
||||||
|
|
||||||
/*
|
char classic_setup[] =
|
||||||
struct pieceinfo {
|
"H40" // PHARAO
|
||||||
char ascii[];
|
"E40E51" // DJHED
|
||||||
} pieceinfo[] = {
|
"H20G71E20D23E93D90C30" // PYRAMID
|
||||||
{ //NONE
|
"H30H30H50H50" // OBELISK
|
||||||
.ascii = { ' ' } }
|
;
|
||||||
{ //PHARAO
|
|
||||||
.ascii = { '=' } }
|
|
||||||
{ //DJHED
|
|
||||||
.ascii = { '/', '\\' } }
|
|
||||||
{ //PYRAMID
|
|
||||||
.ascii = { 'd', 'b', 'p', 'q' } }
|
|
||||||
{ //OBELISK
|
|
||||||
.ascii = { 'o' } }
|
|
||||||
{ //OBELISK2
|
|
||||||
.ascii = { '@' } }
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
void
|
char asciiart_small_pieces[] =
|
||||||
print_board() {
|
" " // NONE
|
||||||
for (int y=0; y<8; y++)
|
"OOOOOOOOXXXXXXXX" // PHARAO
|
||||||
for (int x=0; x<10; x++)
|
".''..''..**..**." // 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
|
int
|
||||||
laser(int side) {
|
laser(int side) {
|
||||||
@@ -148,8 +199,73 @@ move(int side, int x, int y, int dir, int flags) {
|
|||||||
return 1;
|
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
|
int
|
||||||
main() {
|
main() {
|
||||||
|
setup_board(classic_setup);
|
||||||
|
print_board_small();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user