前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >c语言三字棋的详细流程步骤,共五步实行运行

c语言三字棋的详细流程步骤,共五步实行运行

作者头像
如烟花般绚烂却又稍纵即逝
发布2024-11-26 08:30:42
发布2024-11-26 08:30:42
8300
代码可运行
举报
文章被收录于专栏:javajava
运行总次数:0
代码可运行

首先我们先来了解三字棋是什么,三字棋俗称井字棋,三颗棋子为一条线连起来即可胜利。而井字棋的格子为3X3的棋盘,如果棋盘中棋子满了即为平局。

需要创建三个文件,我创建的是Game.h Game.c main.c 三个文件,方便我们查看代码,使整个代码的观赏性会好很多。 然后我们需要思考整个游戏的代码思维,先把步骤想好然后去实施

1.创建游戏菜单

首先我们需要先制定一个游戏的菜单页面进行选择开始游戏,或者是退出游戏,我们需要两个选择一个是进入,一个是退出 当我们游戏菜单写好之后我们需要选择菜单中的选项,选择是否游戏,所以我们需要定义一个数来选择游戏菜单栏中的选项 这里我们使用一个dowhile循环来包含这个switch语句,如果0为假即可退出循环,如果为真,循环将继续

代码语言:javascript
代码运行次数:0
复制
void menu()
{
    printf("**************************************\n");
    printf("*********     0.exit           *******\n");
    printf("*********     1.enter          *******\n");
    printf("**************************************\n");
    
}
int main()
{
    int import = 0;
    do
    {
        menu();
        printf("Please  Choose:>>>>>>>>>>>>>>");//这里我们可以提示一下输入你想要输入的内容
        scanf("%d", &import);
        switch(import)//使用switch语句
        {
        case 0:
            printf("program is quiting\n");//为退出该循环
            break;
        case 1:
            // printf("start the Game\n");//开始游戏选项,为我们后续制定调用游戏的函数做铺垫
            break;
        default:
            printf("Please Choose all over again\n");//输入错误,重新输入
            break;
        }
    } while (import);
    return 0;
}

这个步骤做完之后我们需要运行一下看一下代码是否可以运行成功

2.创建棋盘

将case 1中的printf替换掉换为Game函数,Game函数为游戏的入口进行调用 main.c文件

代码语言:javascript
代码运行次数:0
复制
    // 2.1 当我们的菜单栏已经设置成功之后我们就可以写进入游戏后的棋盘初始化和生成棋盘的代码了。
    char board[ROW][COL] = {0};//2.2首先我们可以先创建一个二维数组,这个数组中的数我们可以在Game.h 中定义define
    //define定义之后的数可以进行少量操作就可以修改棋盘本身的大小
    Init_board(board, ROW, COL);//2.3初始化棋盘
    Display_board(board, ROW, COL); // 2.4打印初始化的棋盘让其显示在棋盘中

Game.h文件

代码语言:javascript
代码运行次数:0
复制
void Init_board(char board[ROW][COL],int row,int col);
void Display_board(char board[ROW][COL],int row,int col);

Game.c文件

代码语言:javascript
代码运行次数:0
复制
#include"Game.h"
void Init_board(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row;++i)
    {
        for (j = 0; j < col;j++)
        {
            board[i][j] = ' ';//将二维数组中的3x3初始化为空格;
        }
    }
}
void Display_board(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row;i++)
    {
        for (j = 0; j < col;j++)
        {
            printf(" %c ", board[i][j]);
            if(j<col-1)//这里我们的|只需要打印两列,因为井字棋只需要两列即可3x3
            printf("|");//这个为每个坐标隔开 | 打印三次,
        }
        printf("\n");//记得换一下行,打印下一行
        if(i<row-1)//我们的行也只需要两行
        {
            for (j = 0; j < col;j++)
            {
                printf("---");//打印行
                if(j<col-1)
                {
                    printf("|");//打印列 打印两次
                }
            }
            printf("\n");//换行
        }
        }
        //第二步骤完成,运行代码看是否可以运行
}

3.玩家下棋

接下来玩家下棋,我们需要给玩家设置坐标,坐标的范围,如果超出坐标会怎么样,在坐标范围内被占用坐标怎么办,都需要想明白,下棋需要进行一个循环 main.c文件

代码语言:javascript
代码运行次数:0
复制
 while(1)
{
	Player_Move(board, ROW, COL);//3.1 这里我们写一个玩家下棋的代码
	Display_board(board, ROW, COL); // 玩家下完棋需要打印,且打印是一个循环,所以我们需要将其置入循环中,while
}

Game.h文件

代码语言:javascript
代码运行次数:0
复制
void Player_Move(char board[ROW][COL],int row,int col);

Game.c文件

代码语言:javascript
代码运行次数:0
复制
void Player_Move(char board[ROW][COL],int row,int col)
{
    int x = 0;
    int y = 0;//设置两个变量,为我们的x轴和y轴
    while(1)
    {
        printf("Please enter coordinates:>>>>>>>>>>");
        scanf("%d %d", &x, &y);//输入坐标
        if (x >= 1 && x <= row && y >= 1 && y <= col) // 为条件,如果条件满足,进入语句中
        {
            if (board[x - 1][y - 1] == ' ') // 为坐标的位置
            {
                board[x - 1][y - 1] = '*'; // 将这个坐标改为*棋子,并且跳出循环
                break;
            }
            else
            {
                printf("The coordinate was used\n");//不为空格,即被占用
            }
    }
    else
    {
        printf("Out of range, re-select");//不满足,超出范围,重新选择
    }
    }
    //第三步骤完成,打印查看效果

4.电脑随机下棋

电脑下棋相对来说简单一些,我们只需要调用一个库函数让其产生随机值,随机值%坐标来随机下棋 main.c文件

代码语言:javascript
代码运行次数:0
复制
  srand((unsigned)time(NULL));//在main主函数中
代码语言:javascript
代码运行次数:0
复制
Computer_board(board, ROW, COL);//4.1写电脑玩家随机下棋,并打印到棋盘中,我们需要调用库函数time和stdlib
    Display_board(board, ROW, COL);   

Game.h文件

代码语言:javascript
代码运行次数:0
复制
void Computer_board(char board[ROW][COL],int row,int col);

Game.c文件

代码语言:javascript
代码运行次数:0
复制
void Computer_board(char board[ROW][COL],int row,int col)
{
    int x, y;
   
    while(1)//记得循环
   {
        x = rand() % row;//rand为随机数,取模%row/col中的数不能超过他的本身为0~2
        y = rand() % col;
     if(board[x][y]==' ')
    {
        board[x][y] = '#';
        break;//跳出
    }
   }
    //第四步完成,运行查看
}

5.判断输赢

游戏玩家下棋和电脑下棋我们都已经布置好,这里我们就需要判断输赢以及平局 当然我们需要判断几种条件,在当前条件下,井字棋的游戏条件只有三中,1.玩家赢/2.电脑赢/3.平局 main.c文件

代码语言:javascript
代码运行次数:0
复制
void Game()
{
    char rec = 0;
    char board[ROW][COL] = {0};
    Init_board(board, ROW, COL);
    Display_board(board, ROW, COL);
    while(1)
    {
    Player_Move(board, ROW, COL);
    rec = Is_win(board, ROW, COL);//这里我们需要定义一个函数并用rec来接收这个返回的结果。
    if(rec!='c')
    {
        break;//如果返回的结果不为‘c'则跳出循环
    }
    Display_board(board, ROW, COL); // 玩家下完棋需要打印,且打印是一个循环,所以我们需要将其置入循环中,while

    Computer_board(board, ROW, COL);//4.1写电脑玩家随机下棋,并打印到棋盘中,我们需要调用库函数time和stdlib
    rec = Is_win(board, ROW, COL);
    if(rec!='c')
    {
        break;
    }
    Display_board(board, ROW, COL);   
}

Game.h

代码语言:javascript
代码运行次数:0
复制
char Is_win(char board[ROW][COL],int row,int col);

Game.c

代码语言:javascript
代码运行次数:0
复制
char Is_win(char board[ROW][COL],int row,int col)//判断
{
    int x = 0;
    int y = 0;
    //这里我们需要判断赢棋的几种方式,首先是横竖三列赢棋,其次的两个斜边赢棋
    for (x = 0; x < row;++x)//横坐标赢棋
    {
         if (board[x][0] == board[x][1] && board[x][1] == board[x][2] && board[x][2] != ' ')//下标-1
    {
        return board[x][1];
    }
    }
     for (y = 0; y < row;++y)//纵坐标赢棋
    {
         if (board[0][y] == board[1][y] && board[1][y] == board[2][y] && board[2][y] != ' ')
    {
        return board[1][y];
    }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
    {
        return board[1][1];
    }
    这里我们已经完成了赢棋的返回结果
代码语言:javascript
代码运行次数:0
复制
如果棋盘满了的话我们可以调用函数Is_FULL
  if(Is_FULL(board,x,y))
    {
        return 'y';//如果满了返回y值,即为平局
    }
    else
    {
        return 'c';
    }
    
}
代码语言:javascript
代码运行次数:0
复制
char Is_FULL(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row;++i)
    {
        for (j = 0; j < col;++j)
        {
            if(board[i][j]==' ')
            {
                return 0;
            }
        }
    }
    return 1;
}

这样我们的第五步骤就完成了,然后我们可以运行游戏。

代码运行

main.c

代码语言:javascript
代码运行次数:0
复制
#include"Game.c"
void Game()
{
    char rec = 0;
    // 2.2 当我们的菜单栏已经设置成功之后我们就可以写进入游戏后的棋盘初始化和生成棋盘的代码了。
    char board[ROW][COL] = {0};//2.3首先我们可以先创建一个二维数组,这个数组中的数我们可以在Game.h 中定义define
    //define定义之后的数可以进行少量操作就可以修改棋盘本身的大小
    Init_board(board, ROW, COL);//2.4初始化棋盘
    Display_board(board, ROW, COL); // 2.5打印初始化的棋盘让其显示在棋盘中
    while(1)
    {
    Player_Move(board, ROW, COL);//3.1 这里我们写一个玩家下棋的代码
    //5.1 游戏玩家下棋和电脑下棋我们都已经布置好,这里我们就需要判断输赢以及平局
    //当然我们需要判断几种条件,在当前条件下,井字棋的游戏条件只有三中,1.玩家赢/2.电脑赢/3.平局
    rec = Is_win(board, ROW, COL);//这里我们需要定义一个函数并用rec来接收这个返回的结果。
    if(rec!='c')
    {
        break;//如果返回的结果不为‘c'则跳出循环
    }
    Display_board(board, ROW, COL); // 玩家下完棋需要打印,且打印是一个循环,所以我们需要将其置入循环中,while

    Computer_board(board, ROW, COL);//4.1写电脑玩家随机下棋,并打印到棋盘中,我们需要调用库函数time和stdlib
    rec = Is_win(board, ROW, COL);
    if(rec!='c')
    {
        break;
    }
    Display_board(board, ROW, COL);   
}
//跳出循环直接进行判断
    if(rec=='*')
    {
        printf("Player is win\n");
    }
    else if (rec=='#')
    {
        printf("Computer is win\n");
    }
    else
    {
        printf("Dead heat\n");
    }
}
void menu()
{
    printf("**************************************\n");
    printf("*********     0.exit           *******\n");
    printf("*********     1.enter          *******\n");
    printf("**************************************\n");
    
}
int main()
{
    srand((unsigned)time(NULL));//为4.1电脑随机下棋步骤
    int import = 0;
    do
    {
        menu();
        printf("Please  Choose:>>>>>>>>>>>>>>");//这里我们可以提示一下输入你想要输入的内容
        scanf("%d", &import);
        switch(import)//使用switch语句
        {
        case 0:
            printf("program is quiting\n");//为退出该循环
            break;
        case 1:
            // printf("start the Game\n");//开始游戏选项,为我们后续制定调用游戏的函数做铺垫
            Game();//2.1 将printf替换掉,调用Game函数,这是游戏的入口
            break;
        default:
            printf("Please Choose all over again\n");//输入错误,重新输入
            break;
        }
    } while (import);
    return 0;
}

Game.h

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void Init_board(char board[ROW][COL],int row,int col);
void Display_board(char board[ROW][COL],int row,int col);
void Player_Move(char board[ROW][COL],int row,int col);
void Computer_board(char board[ROW][COL],int row,int col);
char Is_win(char board[ROW][COL],int row,int col);

Game.c

代码语言:javascript
代码运行次数:0
复制
#include"Game.h"
void Init_board(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row;++i)
    {
        for (j = 0; j < col;j++)
        {
            board[i][j] = ' ';//将二维数组中的3x3初始化为空格;
        }
    }
}
void Display_board(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row;i++)
    {
        for (j = 0; j < col;j++)
        {
            printf(" %c ", board[i][j]);
            if(j<col-1)//这里我们的|只需要打印两列,因为井字棋只需要两列即可3x3
            printf("|");//这个为每个坐标隔开 | 打印三次,
        }
        printf("\n");//记得换一下行,打印下一行
        if(i<row-1)//我们的行也只需要两行
        {
            for (j = 0; j < col;j++)
            {
                printf("---");//打印行
                if(j<col-1)
                {
                    printf("|");//打印列 打印两次
                }
            }
            printf("\n");//换行
        }
        }
        //第二步骤完成,运行代码看是否可以运行
}
void Player_Move(char board[ROW][COL],int row,int col)
{
    int x = 0;
    int y = 0;//设置两个变量,为我们的x轴和y轴
    while(1)
    {
        printf("Please enter coordinates:>>>>>>>>>>");
        scanf("%d %d", &x, &y);//输入坐标
        if (x >= 1 && x <= row && y >= 1 && y <= col) // 为条件,如果条件满足,进入语句中
        {
            if (board[x - 1][y - 1] == ' ') // 为坐标的位置
            {
                board[x - 1][y - 1] = '*'; // 将这个坐标改为*棋子,并且跳出循环
                break;
            }
            else
            {
                printf("The coordinate was used\n");//不为空格,即被占用
            }
    }
    else
    {
        printf("Out of range, re-select");//不满足,超出范围,重新选择
    }
    }
    //第三步骤完成,打印查看效果
}
void Computer_board(char board[ROW][COL],int row,int col)
{
    int x, y;
   
    while(1)//记得循环
   {
        x = rand() % row;//rand为随机数,取模%row/col中的数不能超过他的本身为0~2
        y = rand() % col;
     if(board[x][y]==' ')
    {
        board[x][y] = '#';
        break;//跳出
    }
   }
    //第四步完成,运行查看
}
char Is_FULL(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row;++i)
    {
        for (j = 0; j < col;++j)
        {
            if(board[i][j]==' ')
            {
                return 0;
            }
        }
    }
    return 1;
}
char Is_win(char board[ROW][COL],int row,int col)//判断
{
    int x = 0;
    int y = 0;
    //5.2这里我们需要判断赢棋的几种方式,首先是横竖三列赢棋,其次的两个斜边赢棋
    for (x = 0; x < row;++x)//横坐标赢棋
    {
         if (board[x][0] == board[x][1] && board[x][1] == board[x][2] && board[x][2] != ' ')//下标-1
    {
        return board[x][1];
    }
    }
     for (y = 0; y < row;++y)//纵坐标赢棋
    {
         if (board[0][y] == board[1][y] && board[1][y] == board[2][y] && board[2][y] != ' ')
    {
        return board[1][y];
    }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
    {
        return board[1][1];
    }
    if(Is_FULL(board,x,y))
    {
        return 'y';//如果满了返回y值,即为平局
    }
    else
    {
        return 'c';
    }
    //第五步骤完成,运行程序看是否可以运行
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.创建游戏菜单
  • 2.创建棋盘
  • 3.玩家下棋
  • 4.电脑随机下棋
  • 5.判断输赢
  • 代码运行
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档