三字棋(C语言实现)

文章目录

 

  • 游戏说明
  • 游戏效果展示​​​​​​​
  • 游戏代码
  • 游戏代码解析
    • 游戏框架解析
    • 棋盘绘制
    • 棋盘初始化
    • 玩家落子
    • 电脑落子
    • 输赢判断
    • 主函数

游戏说明

游戏界面:可以选择开始游戏 或者退出

游戏操作:通过命令行输入坐标即可

游戏效果展示


游戏代码

博友们可以将以下代码复制到自己的编译器当中运行:

#ifndef game_h
#define game_h

#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 display_board(char board[ROW][COL],int row,int col);
void init_board(char board[ROW][COL],int row,int col);
//玩家下棋
void player(char board[ROW][COL],int row,int col);
//电脑下棋
void computer(char board[ROW][COL],int row,int col);
//判断输赢
int is_win(char board[ROW][COL],int row,int col);
#endif /* game_h */
#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] = ' ';
        }
    }
}
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)
            {
                printf("|");
            }
        }
        printf("\n");
        if (i < row -1)
        {
            for (j = 0 ; j <col; j++)
            {
                printf("---");
                if (j<col-1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    }
}
void player(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    while (1)
    {
    printf("请玩家落子\n");
    scanf("%d %d",&i,&j);
    if (i>=0 && i<=row && j>=0 && j<=col)
    {
        if (board[i-1][j-1] !=' ')
        {
            printf("目标已占用 请换一个\n");
        }
        else
        {
            board[i-1][j-1] = '*';
            break;
        }
    }
    else
    {
        printf("输入错误,重新输入\n");
    }
    }
}
void computer(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    printf("电脑下棋\n");
    while(1)
    {
   // printf("电脑下棋\n");
    i = rand()%row;
    j = rand()%col;
        if (board[i-1][j-1] ==' ')
            {
                board[i-1][j-1] = '#';
                break;
            }
    }
    
}
/*
   |   |
---|---|---
   |   |
---|---|---
   |   |
 */
int  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] == ' ')
            {
               // printf("还有空 游戏继续\n");
                return 0;
            }
            
        }
    }
        printf("棋盘已满\n");
        return 1;
}
int is_win(char board[ROW][COL],int row,int col)
{
    int i = 0;
   // char j = 0;
    for (i = 0; i <row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
        {
            return board[i][1];//行
        }
    }
    for (i = 0; i <col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[1][i];//列
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
    {
        return board[0][0];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
    {
        return board[2][0];
    }
    if (is_full(board,row,col) == 1)
    {
        return 'Q';
    }
    /*
       |   |
    ---|---|---
       |   |
    ---|---|---
       |   |
     */
    return 'C';
}
#include <stdio.h>
#include "game.h"
void game(void)
{
    /*
    char board[ROW][COL] = {0};
    init_board(board, ROW, COL);
    display_board(board, ROW, COL);
     */
    int ret = 0;
    char board[ROW][COL] = {0};
    init_board(board,ROW,COL);
    display_board(board,ROW,COL);
    while (1)
    {
    player(board,ROW,COL);
        //判断输赢 玩家赢'*' 电脑赢'#' 平局'Q' 继续'C'
     ret = is_win(board,ROW,COL);
        if (ret != 'C')
        {
            break;
        }
    display_board(board,ROW,COL);
    computer(board,ROW,COL);
        ret = is_win(board,ROW,COL);
           if (ret != 'C')
           {
               break;
           }
    display_board(board,ROW,COL);
    }
   
    if (ret == '*')
    {
        printf("玩家赢啦\n");
        display_board(board,ROW,COL);
    }
    if (ret == '#')
    {
        printf("电脑赢啦\n");
        display_board(board,ROW,COL);
    }
    if (ret == 'Q')
    {
        printf("平局咯!!!\n");
        display_board(board,ROW,COL);
    }
}
void menu(void)
{
    printf("*************************\n");
    printf("*********1.play**********\n");
    printf("*********0.exit**********\n");
    printf("********三字棋游戏*********\n");
    printf("*************************\n");
}
int main(int argc, const char * argv[])
{
    int input = 0;
    srand((unsigned int )time(NULL));
    do
    {
        menu();
        printf("请输入你的选择\n");
        scanf("%d",&input);
        switch (input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("推出成功\n");
                break;
            default:
                printf("请重新输入\n");
                break;
        }
    } while (input);
    return 0;
}

游戏代码详解

游戏框架构建

棋盘绘制

首先定义棋盘的大小,定义棋盘行数和列数。

#define ROW 3

#define COL 3

这是我们想要打印出的棋盘样子 

/*
   |   |
---|---|---
   |   |
---|---|---
   |   |
 */

 通过循环语句打印出棋盘的样子

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)
            {
                printf("|");
            }
        }
        printf("\n");
        if (i < row -1)
        {
            for (j = 0 ; j <col; j++)
            {
                printf("---");
                if (j<col-1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    }
}

 打印出来后发现是这种怪东西,别慌不是错了 而是我们没有初始化 将棋盘上放满‘  ’空格;

/*

   |   |

---|---|---

   |   |

---|---|---

   |   |

*/

棋盘的初始化 

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] = ' ';
        }
    }
}

 现在我们已经有了棋盘 下一步就是将棋子放在棋盘里 游戏中有玩家和电脑分别放入,而玩家我们用的是 ‘ * ’来表示 当然你也可以用别的 而电脑我们用的是 ‘ #’;

如何实现玩家落子

void player(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    while (1)
    {
    printf("请玩家落子\n");
    scanf("%d %d",&i,&j);
    if (i>=0 && i<=row && j>=0 && j<=col)
    {
        if (board[i-1][j-1] !=' ')
        {
            printf("目标已占用 请换一个\n");
        }
        else
        {
            board[i-1][j-1] = '*';
            break;
        }
    }
    else
    {
        printf("输入错误,重新输入\n");
    }
    }
}

其实实现很简单 就是将原本初始化中的‘  ’空格 改变为我们的棋子‘*’

值得注意的是 在落子之前得判断合法性 想要落子的地方是否已经有了棋子 

如何实现电脑随机落子

void computer(char board[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    printf("电脑下棋\n");
    while(1)
    {
   // printf("电脑下棋\n");
    i = rand()%row;
    j = rand()%col;
        if (board[i-1][j-1] ==' ')
            {
                board[i-1][j-1] = '#';
                break;
            }
    }
    
}

电脑随机落子 我们使用的是rand函数 记得判断合法性哦 

判断输赢机制

int  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] == ' ')
            {
               // printf("还有空 游戏继续\n");
                return 0;
            }
            
        }
    }
        printf("棋盘已满\n");
        return 1;
}
int is_win(char board[ROW][COL],int row,int col)
{
    int i = 0;
   // char j = 0;
    for (i = 0; i <row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
        {
            return board[i][1];//行
        }
    }
    for (i = 0; i <col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[1][i];//列
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
    {
        return board[0][0];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
    {
        return board[2][0];
    }
    if (is_full(board,row,col) == 1)
    {
        return 'Q';
    }
    /*
       |   |
    ---|---|---
       |   |
    ---|---|---
       |   |
     */
    return 'C';
}

输赢的判断机制我们是有三个部分

1.玩家赢

2.电脑赢

3.平局 棋盘满了  

主函数 

有了以上函数的支持 我们的主函数可以简单写出 

#include <stdio.h>
#include "game.h"
void game(void)
{
    /*
    char board[ROW][COL] = {0};
    init_board(board, ROW, COL);
    display_board(board, ROW, COL);
     */
    int ret = 0;
    char board[ROW][COL] = {0};
    init_board(board,ROW,COL);
    display_board(board,ROW,COL);
    while (1)
    {
    player(board,ROW,COL);
        //判断输赢 玩家赢'*' 电脑赢'#' 平局'Q' 继续'C'
     ret = is_win(board,ROW,COL);
        if (ret != 'C')
        {
            break;
        }
    display_board(board,ROW,COL);
    computer(board,ROW,COL);
        ret = is_win(board,ROW,COL);
           if (ret != 'C')
           {
               break;
           }
    display_board(board,ROW,COL);
    }
   
    if (ret == '*')
    {
        printf("玩家赢啦\n");
        display_board(board,ROW,COL);
    }
    if (ret == '#')
    {
        printf("电脑赢啦\n");
        display_board(board,ROW,COL);
    }
    if (ret == 'Q')
    {
        printf("平局咯!!!\n");
        display_board(board,ROW,COL);
    }
}
void menu(void)
{
    printf("*************************\n");
    printf("*********1.play**********\n");
    printf("*********0.exit**********\n");
    printf("********三字棋游戏*********\n");
    printf("*************************\n");
}
int main(int argc, const char * argv[])
{
    int input = 0;
    srand((unsigned int )time(NULL));
    do
    {
        menu();
        printf("请输入你的选择\n");
        scanf("%d",&input);
        switch (input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("推出成功\n");
                break;
            default:
                printf("请重新输入\n");
                break;
        }
    } while (input);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值