Как я могу построить массив досок Othello, который я пытаюсь построить на C?
Я пытаюсь написать текстовый движок Othello на C, чтобы начать изучать C. У меня уже есть это, работающее на языках более высокого уровня, поэтому я решил попробовать его на C, поскольку основная логика верна и работает.
Я пытаюсь представить плату как массив 8x8, который можно динамически сбрасывать с помощью функции.
Доска должна выглядеть так:
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * w b * * *
* * * b w * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
Я пытаюсь передать указатель на массив, хранящий плату, в функцию resetBoard, чтобы я мог сбросить плату в любое время. Как я могу заставить плату обновлять массив соответствующими символами?
Вот что я пытаюсь:
int resetBoard(char *board) {
int i;
int j;
for (i = 0; i<8; i++) {
for (j = 0; j<8; j++) {
if ((i == 4 && j == 4) | (i == 5 && j == 5)) {
board[i][j] = "w";
} else if ((i == 5 && j == 4) | (i == 4 && j == 5)) {
board[i][j] = "b";
} else {
board[i][j] = "*";
}
}
}
return 0;
}
void main() {
char board[8][8];
resetBoard(*board);
for (int i = 0; i<8; i++) {
for (int j = 0; j<8; j++) {
char x = board[i][j];
printf(" %c ", x);
}
printf("\n");
}
}
И когда я пытаюсь скомпилировать, я получаю следующее сообщение об ошибке:
.\Othello.c: In function 'resetBoard':
.\Othello.c:10:25: error: subscripted value is neither array nor pointer nor vector
board[i][j] = "w";
^
.\Othello.c:12:25: error: subscripted value is neither array nor pointer nor vector
board[i][j] = "b";
^
.\Othello.c:14:25: error: subscripted value is neither array nor pointer nor vector
board[i][j] = "*";
Я попытался просто назначить персонажа на board [i] вместо board [i][j], однако это дает следующую ошибку:
.\Othello.c: In function 'resetBoard':
.\Othello.c:10:26: warning: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
board[i] = "w";
^
.\Othello.c:12:26: warning: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
board[i] = "b";
^
.\Othello.c:14:26: warning: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
board[i] = "*";
Итак, я знаю, что у меня несколько проблем. Я совершенно новичок в программировании на C или любом низкоуровневом программировании в этом отношении, поэтому любая помощь будет приветствоваться!
Большое спасибо!
2 ответа
- Передайте (указатель на первый элемент) весь массив, а не первую строку.
- Элементы каждого элемента
board
находятсяchar
, поэтому символьные константы вроде'w'
следует использовать вместо строковых литералов"w"
.
int resetBoard(char board[][8]) { /* change argument type to accept the whole array */
int i;
int j;
for (i = 0; i<8; i++) {
for (j = 0; j<8; j++) {
if ((i == 4 && j == 4) | (i == 5 && j == 5)) {
board[i][j] = 'w'; /* use character constant */
} else if ((i == 5 && j == 4) | (i == 4 && j == 5)) {
board[i][j] = 'b'; /* use character constant */
} else {
board[i][j] = '*'; /* use character constant */
}
}
}
return 0;
}
void main() {
char board[8][8];
resetBoard(board); /* pass the whole array */
for (int i = 0; i<8; i++) {
for (int j = 0; j<8; j++) {
char x = board[i][j];
printf(" %c ", x);
}
printf("\n");
}
}
следующий предлагаемый код:
- чисто компилируется
- выполняет желаемый функционал
- устраняет "волшебные" числа
- правильно разнесены по вертикали для удобства чтения
- прокомментировал каждую измененную строку относительно причины изменения.
- использует логическое ИЛИ, а не побитовое ИЛИ
- использует одну из двух действительных подписей для main ()
- включает (отсутствует)
#include
для файла заголовка, который содержит прототип дляprintf()
А теперь предлагаемый код:
// note vertical spacing for readability
#include <stdio.h> // added for 'printf()'
// to give 'magic' numbers meaningful names
#define ROWS 8
#define COLS 8
// return type modified as nothing uses the returned value
void resetBoard(char board[ROWS][COLS]) // valid parameter, which compiler needs
{
int i;
int j;
for (i = 0; i< ROWS; i++) // ROWS rather than 'magic' number
{
for (j = 0; j< COLS; j++) // COLS rather than 'magic' number
{
if ((i == 4 && j == 4) || (i == 5 && j == 5)) // || for logical OR
{
board[i][j] = 'w'; // 'w' for a single char rather than array
}
else if ((i == 5 && j == 4) || (i == 4 && j == 5)) // || for logical OR
{
board[i][j] = 'b'; // 'b' for a single char rather than an array
}
else // these lines modified to follow axiom:
// only one statement per line and (at most) one variable declaration per statement
{
board[i][j] = '*'; // '*' for a single char rather than an array
}
}
}
}
int main( void ) // valid C signature for 'main()'
{
char board[ROWS][COLS]; // rather than 'magic' numbers
resetBoard(board); // since 'board[][]' is array, bare reference degrades to address of first byte of array
for (int i = 0; i<ROWS; i++) // use meaningful name rather than 'magic' number
{
for (int j = 0; j<COLS; j++) // use meaningful name rather than 'magic' number
{
char x = board[i][j];
printf(" %c ", x);
}
printf("\n");
}
}
запуск предложенного кода приводит к:
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * w b * *
* * * * b w * *
* * * * * * * *
* * * * * * * *
Примечание: начальная позиция смещена на 1 слишком далеко вниз и на 1 слишком далеко вправо. Это потому, что в C массивы начинаются с 0, а не с 1