在C中与Tictatcoe抗争

在C中与Tictatcoe抗争,c,arrays,while-loop,console,tic-tac-toe,C,Arrays,While Loop,Console,Tic Tac Toe,我试着用C语言编写一个简单的TicTacToe程序。程序本身可以编译并且没有显示错误。 因此,程序绘制字段,读取名称,并让玩家将其符号放置在特定字段中。所有这些都发生在一个while循环中,应该一直运行到平局或有人获胜。 但是程序只运行一次循环,所以只有一次循环,然后程序停止 这是我的代码: 主要条款c: #include <stdio.h> #include <stdlib.h> #include <string.h> #include "game.h"

我试着用C语言编写一个简单的TicTacToe程序。程序本身可以编译并且没有显示错误。 因此,程序绘制字段,读取名称,并让玩家将其符号放置在特定字段中。所有这些都发生在一个while循环中,应该一直运行到平局或有人获胜。 但是程序只运行一次循环,所以只有一次循环,然后程序停止

这是我的代码:

主要条款c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "game.h"


#define NAMELENGTH 20

 int main(void) {
char names[2][NAMELENGTH];
// field positions
char field[9];
int winner = -1;
getnames(names);
printf("\n\n");
initField(field);
// set field positions to 'empty'
char actualPlayer = (char)(get_random_number()*10.0) % 2;

while (1) {
    drawField(field);
    turn(actualPlayer, names, field);
    winner = isWinner(actualPlayer, field);
    drawField(field);
    if (winner >= 1) {
        printwinner(winner, names);
        return 0;
    }
    else if (winner == 0) {
        printDrawGame(names);
        return 0;
    }
    actualPlayer = (actualPlayer + 1) % 2;

}

return 0;

}
#包括
#包括
#包括
#包括“game.h”
#定义名称长度20
内部主(空){
字符名[2][NAMELENGTH];
//阵地
字符字段[9];
int-winner=-1;
获取名称(名称);
printf(“\n\n”);
initField(field);
//将字段位置设置为“空”
字符实际层=(字符)(获取随机数()*10.0)%2;
而(1){
抽油场(场);
转弯(实际图层、名称、字段);
winner=isWinner(实际层,字段);
抽油场(场);
如果(获胜者>=1){
printwinner(获胜者,姓名);
返回0;
}
否则如果(获胜者==0){
版画游戏(名称);
返回0;
}
实际层=(实际层+1)%2;
}
返回0;
}
game.h Headerfile:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NAMELENGTH 20
#pragma warning(disable:4996)

extern void drawField(char *field);
extern void getnames(char nameField[][NAMELENGTH]);
extern void initField(char *field);
extern void turn(char actualPlayer, char names[][NAMELENGTH], char *field);
extern char isWinner(char actualPlayer, char *field);
extern void printwinner(char winnerNumber, char names[][NAMELENGTH]);
extern void printDrawGame(char names[][NAMELENGTH]);
extern double get_random_number();
#包括
#包括
#包括
#包括
#定义名称长度20
#杂注警告(禁用:4996)
外部无效绘图字段(字符*字段);
extern void getnames(char nameField[][NAMELENGTH]);
外部无效初始字段(字符*字段);
外部无效转换(字符实际层,字符名称[][NAMELENGTH],字符*字段);
extern char isWinner(char actualPlayer,char*字段);
extern void printwinner(字符winnerNumber,字符名称[][NAMELENGTH]);
extern void printDrawGame(字符名称[][NAMELENGTH]);
外部双随机数();
然后是我的game.c,在这里我定义了我的函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "game.h"
#define NAMELENGTH 20
#pragma warning(disable:4996)

void drawField(char *field) {

printf("________________________\n");
printf("|       |       |      |\n");
printf("|   %c   |   %c   |   %c  |\n", field[0], field[1], field[2]);
printf("|_______|_______|______|\n");
printf("|       |       |      |\n");
printf("|   %c   |   %c   |   %c  |\n", field[3], field[4], field[5]);
printf("|_______|_______|______|\n");
printf("|       |       |      |\n");
printf("|   %c   |   %c   |   %c  |\n", field[6], field[7], field[8]);
printf("|_______|_______|______|\n");

}

void getnames(char nameField[][NAMELENGTH]) {

printf("Name of the first player: ");
scanf("%s", nameField[0]);
printf("Name of the second player: ");
scanf("%s", nameField[1]);

}

void initField(char *field) {

for (int i = 0; i <= 8; i++)
{
    field[i] = i + '1';
}

}

void turn(char actualPlayer, char names[][NAMELENGTH], char *field) {

char symbol = ' ';
int p1fieldnumber;
int p2fieldnumber;


if (actualPlayer == 0)
{
    do {

        printf("\nIts Player %s's turn.", names[0]);
        char symbol = 'X';
        printf("\nNumber of the field which you want to put your symbol in: ");
        scanf("%d", &p1fieldnumber);
        if (field[p1fieldnumber] == 'X' || field[p1fieldnumber] == 'O')
        {
            printf("\nField is already occupied!");
            p1fieldnumber = 10;
        }
    } while (p1fieldnumber < 1 || p1fieldnumber > 9);

    field[p1fieldnumber-1] = 'X';

}
else {

    do {
        printf("\nIts Player %s's turn.", names[1]);
        char symbol = 'O';
        printf("\nNumber of the field which you want to put your symbol in: ");
        scanf("%d", &p2fieldnumber);
        if (field[p2fieldnumber] == 'X' || field[p2fieldnumber] == 'O')
        {
            printf("\nField is already occupied!");
            p2fieldnumber = 10;
        }
    } while (p2fieldnumber < 1 || p2fieldnumber > 9);

    field[p2fieldnumber-1] = 'O';

}

}

char isWinner(char actualPlayer, char *field) {

char pwinner = '3';

if (((field[0] == 'O') && (field[1] == 'O') && (field[2] == 'O')) || 
    (field[3] == 'O') && (field[4] == 'O') && (field[5] == 'O') || 
    (field[6] == 'O') && (field[7] == 'O') && (field[8] == 'O') || 
    (field[0] == 'O') && (field[4] == 'O') && (field[8] == 'O') || 
    (field[2] == 'O') && (field[4] == 'O') && (field[6] == 'O') || 
    (field[0] == 'O') && (field[3] == 'O') && (field[6] == 'O') ||
    (field[1] == 'O') && (field[4] == 'O') && (field[7] == 'O') || 
    (field[2] == 'O') && (field[5] == 'O') && (field[8] == 'O'))

{
    pwinner = '2';
}

else if (((field[0] == 'X') && (field[1] == 'X') && (field[2] == 'X')) || 
    (field[3] == 'X') && (field[4] == 'X') && (field[5] == 'X') || 
    (field[6] == 'X') && (field[7] == 'X') && (field[8] == 'X') || 
    (field[0] == 'X') && (field[4] == 'X') && (field[8] == 'X') || 
    (field[2] == 'X') && (field[4] == 'X') && (field[6] == 'X') || 
    (field[0] == 'X') && (field[3] == 'X') && (field[6] == 'X') || 
    (field[1] == 'X') && (field[4] == 'X') && (field[7] == 'X') || 
    (field[2] == 'X') && (field[5] == 'X') && (field[8] == 'X'))

{
    pwinner = '1';
}

else if (((field[0] == 'X') || (field[0] == 'O')) && ((field[1] == 'X') || (field[1] == 'O')) && ((field[2] == 'X') || (field[2] == 'O')) ||
    ((field[3] == 'X') || (field[3] == 'O')) && ((field[4] == 'X') || (field[4] == 'O')) && ((field[5] == 'X') || (field[5] == 'O')) ||
    ((field[6] == 'X') || (field[6] == 'O')) && ((field[7] == 'X') || (field[7] == 'O')) && ((field[8] == 'X') || (field[8] == 'O')) ||
    ((field[0] == 'X') || (field[0] == 'O')) && ((field[4] == 'X') || (field[4] == 'O')) && ((field[8] == 'X') || (field[8] == 'O')) ||
    ((field[2] == 'X') || (field[2] == 'O')) && ((field[4] == 'X') || (field[4] == 'O')) && ((field[6] == 'X') || (field[6] == 'O')) ||
    ((field[0] == 'X') || (field[0] == 'O')) && ((field[3] == 'X') || (field[3] == 'O')) && ((field[6] == 'X') || (field[6] == 'O')) ||
    ((field[1] == 'X') || (field[1] == 'O')) && ((field[4] == 'X') || (field[4] == 'O')) && ((field[7] == 'X') || (field[7] == 'O')) ||
    ((field[2] == 'X') || (field[2] == 'O')) && ((field[5] == 'X') || (field[5] == 'O')) && ((field[8] == 'X') || (field[8] == 'O')))
{
    pwinner = '0';
}

return pwinner;
}

void printwinner(char winnerNumber, char names[][NAMELENGTH]) {

if (winnerNumber == '1') {
    printf("Player %s won!", names[0]);
}
else if (winnerNumber == '2') {
    printf("Player %s won!", names[1]);
}

}

void printDrawGame(char names[][NAMELENGTH]) {
printf("Draw!");
}

static int _initialized;

double get_random_number() {
if (!_initialized) {
    srand(time(NULL));
    _initialized = 1;
}
return (double)rand() / ((double)(RAND_MAX)+1);
}
#包括
#包括
#包括
#包括
#包括“game.h”
#定义名称长度20
#杂注警告(禁用:4996)
无效绘图字段(字符*字段){
printf(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuun”);
printf(“| | | | \n”);
printf(“|%c |%c |%c |\n”,字段[0],字段[1],字段[2]);
printf(“| | | | | | | | | | | | | | | | | n”);
printf(“| | | | \n”);
printf(“|%c |%c |%c |\n”,字段[3],字段[4],字段[5]);
printf(“| | | | | | | | | | | | | | | | | n”);
printf(“| | | | \n”);
printf(“|%c |%c |%c |\n”,字段[6],字段[7],字段[8]);
printf(“| | | | | | | | | | | | | | | | | n”);
}
void getnames(char nameField[][NAMELENGTH]){
printf(“第一个玩家的名字:”);
scanf(“%s”,名称字段[0]);
printf(“第二个玩家的名字:”);
scanf(“%s”,名称字段[1]);
}
void initField(字符*字段){
对于(int i=0;i 9);
字段[p1fieldnumber-1]=“X”;
}
否则{
做{
printf(“\n轮到玩家%s。”,名称[1]);
字符符号='O';
printf(“\n要将符号放入的字段编号:”;
scanf(“%d”、&p2fieldnumber);
如果(字段[p2fieldnumber]=“X”|字段[p2fieldnumber]=“O”)
{
printf(“\n字段已被占用!”);
p2fieldnumber=10;
}
}而(p2fieldnumber<1 | | p2fieldnumber>9);
字段[p2fieldnumber-1]=“O”;
}
}
char isWinner(char actualPlayer,char*字段){
char pwinner='3';
如果((字段[0]='O')&&(字段[1]='O')&&(字段[2]='O'))|
(字段[3]=='O')&&(字段[4]=='O')&&&(字段[5]=='O')||
(字段[6]=“O”)和&(字段[7]=“O”)和&(字段[8]=“O”)||
(字段[0]=='O')&&(字段[4]=='O')&&&(字段[8]=='O')||
(字段[2]=='O')&&(字段[4]=='O')&&&(字段[6]=='O')||
(字段[0]=“O”)&&(字段[3]=“O”)&&(字段[6]=“O”)||
(字段[1]=='O')&&(字段[4]=='O')&&&(字段[7]=='O')||
(字段[2]=“O”)&&(字段[5]=“O”)&&(字段[8]=“O”))
{
pwinner='2';
}
如果((字段[0]='X')&&(字段[1]='X')&&(字段[2]='X'))|
(字段[3]='X')&&(字段[4]='X')&&(字段[5]='X')||)
(字段[6]=='X')&&(字段[7]=='X')&&(字段[8]=='X')||)
(字段[0]='X')&&(字段[4]='X')&&(字段[8]='X')||
(字段[2]=='X')&&(字段[4]=='X')&&(字段[6]=='X')||)
(字段[0]='X')&&(字段[3]='X')&&(字段[6]='X')||
(字段[1]='X')&&(字段[4]='X')&&(字段[7]='X')||)
(字段[2]='X')&&(字段[5]='X')&&(字段[8]='X'))
{
pwinner='1';
}
如果((字段[0]='X')| |(字段[0]='O'))&((字段[1]='X')| |(字段[1]='O'))&((字段[2]='X')|(字段[2]='O'))||
((字段[3]='X')| |(字段[3]='O'))&&((字段[4]='X')| |(字段[4]='O'))&&((字段[5]='X')|(字段[5]='O'))||
((字段[6]='X')| |(字段[6]='O'))&&((字段[7]='X')| |(字段[7]='O'))&&((字段[8]='X')| |(字段[8]='O'))||
((字段[0]='X')||(字段[0]='O'))&&((字段[4]='X')|(字段[4]='O'))&&((字段[8]='X')|(字段[8]='O'))||
((字段[2]='X')| |(字段[2]='O'))&&((字段[4]='X')| |(字段[4]='O'))&&((字段[6]='X')|(字段[6]='O'))||
((字段[0]='X')||(字段[0]='O'))&&((字段[3]='X')|(字段[3]='O'))&&((字段[6]='X')|(字段[6]='O'))||
((字段[1]='X')| |(字段[1]='O'))&&((字段[4]='X')| |(字段[4]='O'))&&((字段[7]='X')| |(字段[7]='O'))||
((字段[2]='X')| |(字段[2]='O'))&&((字段[5]='X')| |(字段[5]='O'))&&((字段[8]='X')|(字段[8]='O'))
{
pwinner='0';
}
返回内部;
}
void printwinner(字符winnerNumber,字符名称[][NAMELENGTH]){
如果(winnerNumber==“1”){
printf(“玩家%s赢了!”,名字[0]);
}
else if(winnerNumber=='2'){
printf(“玩家%s赢了!”,名字[1]);
}
}
void printDrawGame(字符名称[][NAMELENGTH]){
printf(“Draw!”);
}
静态int_初始化;
双随机数(){
如果(!\u已初始化){
srand(时间(空));
_初始化=1;
}
返回值(双)rand()/(双)(rand_MAX)+1;
}

存在多个问题

  • isWinner
    返回字符“0”、“1”、“2”和
    if (((field[0] == 'O') && (field[1] == 'O') && (field[2] == 'O')) ||
        ((field[3] == 'O') && (field[4] == 'O') && (field[5] == 'O')) ||
        ((field[6] == 'O') && (field[7] == 'O') && (field[8] == 'O')) ||
        ((field[0] == 'O') && (field[4] == 'O') && (field[8] == 'O')) ||
        ((field[2] == 'O') && (field[4] == 'O') && (field[6] == 'O')) ||
        ((field[0] == 'O') && (field[3] == 'O') && (field[6] == 'O')) ||
        ((field[1] == 'O') && (field[4] == 'O') && (field[7] == 'O')) ||
        ((field[2] == 'O') && (field[5] == 'O') && (field[8] == 'O')))