Well aside from the poor indentation, it seems fine.
Code:
#include <stdio.h>
#include <string.h>
void gameboard(char board[16][8])
{
int x, y;
for (x = 0; x < 16; x++) {
printf("%02d=",x); //!! added for debug
for (y = 0; y < 8; y++) {
if (x % 2 == 0) {
//!! it's not helpful when different rows have different
//!! numbers of chars printed
printf(" %c ", board[x][y]);
} else {
printf("| %c |", board[x][y]);
}
}
printf("\n");
}
}
void character(char board[16][8])
{
int x, y;
for (x = 0; x < 16; x++) {
for (y = 0; y < 8; y++) {
if (x < 6) {
if (x % 2 == 0) {
if (x % 2 == 0) {
board[x][y] = ' ';
}
}
if (x % 2 == 1) {
if (y % 2 == 0) {
board[x][y] = 'O';
}
if (y % 2 == 1) {
board[x][y] = ' ';
}
}
if (x == 3) {
if (y % 2 == 1) {
board[x][y] = 'O';
}
if (y % 2 == 0) {
board[x][y] = ' ';
}
}
}
if ((x == 6) || (x == 7) || (x == 8) || (x == 9)) {
board[x][y] = ' ';
}
if (x > 9) {
if (x % 2 == 0) {
if (x % 2 == 0) {
board[x][y] = 'X';
}
if (y % 2 == 0) {
board[x][y] = ' ';
}
}
if (x % 2 == 1) {
if (y % 2 == 1) {
board[x][y] = ' ';
}
}
if (x == 12) {
if (y % 2 == 0) {
board[x][y] = 'X';
}
if (y % 2 == 1) {
board[x][y] = ' ';
}
}
}
}
}
}
int main()
{
char board[16][8] = { { 0 } };
// any dots printed later mean character() didn't do it's job properly
memset(board,'.',sizeof(board));
character(board);
gameboard(board);
return 0;
}
My output
$ ./a.out
00=
01=| O || || O || || O || || O || |
02=
03=| || O || || O || || O || || O |
04=
05=| O || || O || || O || || O || |
06=
07=| || || || || || || || |
08=
09=| || || || || || || || |
10= X X X X
11=| . || || . || || . || || . || |
12= X X X X
13=| . || || . || || . || || . || |
14= X X X X
15=| . || || . || || . || || . || |
But then again, it's not clear what you would call success.
Why do you need a 16x8 board for checkers?
You're just polluting a lot of code with a lot of x%2 nonsense, where the extra spacing only really matters in the display routine.