我目前正在编写一个简单的井字游戏,事实证明并非如此简单(至少对我而言,我是初学者)。我在编写display_board函数时遇到问题,应该打印出类似这样的内容:
_|_|_
_|_|_
| |
当玩家将棋盘标记到特定位置时,添加X或O.我打算做的就是把这一切都放到一个字符串中,但它特别容易让我想要添加的新行混淆,所以电路板正常出来。新行操作符是否计为字符串中的一个或两个字符? 如果你想查看我的游戏代码,请点击这里:
#include <stdio.h>
#include <stdbool.h>
int board[3][3] = {
{0, 0, 0},
{0, 0, 0},
{0, 0, 0}
};
int main (void)
{
int const user1 = 1;
int const user2 = 2;
char move[];
while (! all_locations_filled()) {
printf("User-1, please enter your move:");
scanf("%s", &move);
if(valid_location(move)) {
mark_location(user1, move);
display_board();
else if(won_the_game(user1) {
printf("Congratulations User-1, You Won the Game!");
break;
}
else {
printf("Invalid Move");
}
}
printf("User-2, please enter your move:");
scanf("%s", &move);
if(valid_location(move)) {
mark_location(user2, move);
display_board();
else if(won_the_game(user2) {
printf("Congratulations User-2, You Won the Game!");
break;
}
else {
printf("Invalid Move");
}
}
}
bool valid_location(char str[]) {
if (str[] == "upperLeft" || str[] == "up" || str[] == "upperRight" || str[] == "left" || str[] == "center" || str[] == "right" || str[] == "lowerLeft" || str[] == "down" || str[] == "lowerRight") {
return true;
}
}
void mark_location(int userU, char str[]) {
if (str[] == "upperLeft") {
board[0][0] = userU;
else if (str[] == "up") {
board[0][1] = userU;
else if (str[] == "upperRight") {
board[0][2] = userU;
else if (str[] == "left") {
board[1][0] = userU;
else if (str[] == "center") {
board[1][1] = userU;
else if (str[] == "right") {
board[1][2] = userU;
else if (str[] == "lowerLeft") {
board[2][0] = userU;
else if (str[] == "down") {
board[2][1] = userU;
else if (str[] == "lowerRight") {
board [2][2] = userU;
}
}
它有点混乱,正如我所说的那样,我也是新的。如果您有任何建议要清理,请随时帮我。
答案 0 :(得分:2)
您的代码中存在很多错误。以下是一些:
使用strcmp
函数比较C
str[] == "upperLeft"
不是有效的C表达式。
此定义:
char move[];
不是有效的数组定义,它错过了[]
。
此外
scanf("%s", &move);
%s
转换规范将指向char的指针作为参数。 &move
的值是指向数组的指针,而不是指向char的指针。以这种方式调用函数:
scanf("%s", move);
答案 1 :(得分:2)
使用RedirectMatch ^/((?!shop/?).*)$ /shop/$1
函数比较C
strcmp
不是有效的C表达式。
此定义:
str[] == "upperLeft"
不是有效的数组定义,它错过了char move[];
。
此外,
[]
scanf("%s", &move);
转换规范将指向char的指针作为参数。 %s
的值是指向数组的指针,而不是指向char的指针。以这种方式调用函数:
&move
答案 2 :(得分:1)
尝试循环遍历行和列。 我不想为你写答案,但有点像......
function print_board()
iterate over rows
iterate over columns
print board location
if this is not the third spot, print a vertical bar character
print a newline followed be a line of dashes followed by a newline
答案 3 :(得分:0)
新行'\n'
或"\n"
计为单个字符,即使大多数终端需要输出两个字符。 (在DOS / Windows中,这是通过CRT将\n
转换为CRLF来实现的,而在Unix中则是由TTY驱动程序完成的。)
答案 4 :(得分:0)
这是tic tac toe的printf函数 无效板() {
printf("\n\n\tTic Tac Toe\n\n");
printf("Player 1 (X) - Player 2 (O)\n\n\n");
printf(" | | \n");
printf(" %c | %c | %c \n", square[1], square[2], square[3]);
printf("_____|_____|_____\n");
printf(" | | \n");
printf(" %c | %c | %c \n", square[4], square[5], square[6]);
printf("_____|_____|_____\n");
printf(" | | \n");
printf(" %c | %c | %c \n", square[7], square[8], square[9]);
printf(" | | \n\n");
}