井字棋游戏C语言简单思路人人对战版(无图形化界面))

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#defineROW 3

#defineLINE 3

intsymbol1, symbol2, step;

char a[10];

voidinitialize()     //将棋盘元素初始化为空格

{

    step= 0;

    int i;

    for (i = 1; i <= 9;i++)

    {

         a[i]= ' ';

    }

 

}

voidstart_game()     //打印开始界面并让P1,P2选择所持棋子

{

    printf("                             ||************************************************************||\n");

    printf("                             ||************************************************************||\n");

    printf("                             ||***********       欢迎来到大型博弈游戏          ***********||\n");

    printf("                             ||***********                                     ***********||\n");

    printf("                             ||************         传统井字棋PVP版            ************||\n");

    printf("                             ||************                                   ************||\n");

    printf("                             ||**************       按任意键开始游戏        **************||\n");

    printf("                             ||************************************************************||\n");

    printf("                             ||************************************************************||\n");

    system("PAUSE");

    printf("                                    请选择P1要使用的符号(输入X或O)(大写)\n\n");

    while (1)

    {

         symbol1=getch();

         if (symbol1 == 'X' || symbol1 == 'O')                         //P1,P2选择棋子

         {

             if (symbol1 == 'X')

                  symbol2= 'O';

             else symbol2 = 'X';

             printf("                                       P1使用%c,P2使用%c\n\n", symbol1, symbol2);

             break;

         }       

         printf("输入错误,请重新输入:\n");

    }

}

void print()      //打印棋盘

{

    printf("                                              |       |         \n");

    printf("                                           %c  |   %c   |   %c   \n", a[1], a[2], a[3]);

    printf("                                       -------| ------| ------- \n");

    printf("                                              |       |         \n");

    printf("                                           %c  |   %c   |  %c    \n", a[4], a[5], a[6]);

    printf("                                              |       |         \n");

    printf("                                       -------|-------| ------- \n");

    printf("                                           %c   |  %c   |   %c   \n", a[7], a[8], a[9]);

    printf("                                              |       |         \n");

}

 

voidplayer1_step()       //P1的回合

 
 

{

    int location;

    printf("请P1输入要放的位置:\n");

    while (1)

    {

         scanf("%d", &location);

         if ((char)(location + 48)<'1' || (char)(location + 48)>'9')                                 //防止输入1~9以外的数字

         {

             printf("输入错误,请重新输入:\n");

             continue;

         }

         if (a[location] !=symbol1&&a[location] != symbol2)           //若此位置为空则可以放置棋子

         {

             a[location]= symbol1;

             print();                                                 //打印放置后的棋盘

             break;

         }

         else printf("该位置被占了,请重新输入:\n");

    }

}

voidplayer2_step()       //P2的回合

{

    int location;

    printf("请P2输入要放的位置:\n");

    while (1)

    {

         scanf("%d", &location);

         if ((char)(location + 48)<'1' || (char)(location + 48)>'9')                                 //防止输入1~9以外的数字

         {

             printf("输入错误,请重新输入:\n");

             continue;

         }

         if (a[location] !=symbol1&&a[location] != symbol2)           //若此位置为空则可以放置棋子

         {

             a[location]= symbol2;

             print();                                                 //打印放置后的棋盘

             break;

         }

         else printf("该位置被占了,请重新输入:\n");

    }

}

int row(intn, charsymbol)                     //通过判断每一行三个元素是否都是symbol来决定是否是winner

{

    int i, flag = 0;

    for (i = (1 + ROW*(n - 1)); i <= ROW*n; i++)

    {

         if (a[i] == symbol)

             flag++;                            //累计循环次数用于下面判断

 

    }

    if (flag == ROW)

         return 1;

    else

         return 0;

}

int line(intn, charsymbol)                    //通过判断每一列三个元素是否都是symbol来决定是否是winner

{

    int i, flag = 0;

    for (i = n; i <= (n + LINE*(ROW - 1)); i = i + ROW)

    {

         if (a[i] == symbol)

             flag++;                        //累计循环次数用于下面判断

    }

    if (flag == LINE)

         return 1;

    else

         return 0;

}

intdigonal(charsymbol)

{

    int i, flag = 0;

    for (i = 1; i <= ROW*LINE; i = i + ROW + 1)

    {

         if (a[i] == symbol)

             flag++;                        //累计循环次数用于下面判断

    }

 

    if (flag == LINE)

         return 1;

    flag= 0;

    for (i = ROW; i <= 1+ ROW*(LINE - 1); i = i + ROW - 1)

    {

         if (a[i] == symbol)

             flag++;                        //累计循环次数用于下面判断

    }

    if (flag == LINE)

         return 1;

    return 0;

}

int judge(charsymbol)                               //判断游戏是否出现胜利者

{

    int i;

    if (digonal(symbol) == 1)

         return 1;

    for (i = 1; i <= ROW; i++)

    {

         if (row(i, symbol) == 1)

             return 1;

    }

    for (i = 1; i <= LINE; i++)

    {

         if (line(i, symbol) == 1)

             return 1;

    }

    return 0;

 

}

intchoose_continue()                  //选择是否继续,返回一则表示继续

{

    printf("是否要继续玩?(输入1:继续玩,2:退出)\n");

    int choice;

    while (1)

    {

         scanf("%d", &choice);

         if (choice == 1)                   //继续

         {

             initialize();

             start_game();

             return 1;

         }

         elseif (choice == 2)

         {

             printf("                                               游戏结束\n");

             exit(0);

         }                         //退出游戏

         else

             printf("                                           没有该指令,重新输入:\n");

    }

    return 0;

}

voidchoose()                                   //选择要下棋的玩家并打印判断信息

{

    int t;

    while (1)

    {

         player1_step();                            //从P1开始走

         step++;                                    //累计步数判断是否达到平局,下同

         if (t = judge(symbol1)> 0)                 //判断P1是否赢了

         {

             printf("\n\n                                          恭喜P1获得胜利\n");

             if (choose_continue()== 1)

                  choose;                            //调用choose继续下一局,因不能调用自身后面的函数所以不能放此语句在choose中

         }

         if (step >= 9)                             //平局条件,因最后一步一定由P1走出,所以放在p1_step之后

         {

             printf("\n\n                                         两人打平,没有winner\n");

             if (choose_continue()== 1)

                  choose;

         }

         player2_step();

         step++;

         if (judge(symbol2)> 0)

         {

             printf("\n\n                                           恭喜P2获得胜利\n");

             if (choose_continue()== 1)

                  choose;

         }

 

    }

 

}

 

int main()                         //主函数

{

    initialize();             //初始化数组为空

    start_game();             //开始游戏

    choose();

}

猜你喜欢

转载自blog.csdn.net/qq1084235321/article/details/79905719