C语言实现三子棋小游戏

思路:

三子棋游戏是玩家和电脑对战的小游戏,最先练成一条线的一方获胜。
1.在一个游戏打开的时候,都会有一个选择界面:开始游戏、退出游戏等;所以第一步是打印菜单。
2.开始游戏后,需要提供一个棋盘给玩家;所以第二步是打印棋盘(二维数组)。
3.棋盘打印完成之后,该玩家下棋了。玩家输入对应坐标来下棋,下棋时需要考虑输入坐标合法性,输入坐标是否已经被占用;之后要再次打印棋盘并判断输赢。
4.电脑下棋(随机产生),需要考虑随机产生的坐标是否已经被占用;之后要再次打印棋盘并判断输赢。
5.判断输赢,有四种情况,玩家赢、电脑赢、平局、继续游戏;

1.打印菜单

void menu()
{
    printf("**********************\n");
    printf("******  1.play  ******\n");
    printf("******  0.exit  ******\n");
    printf("**********************\n");
}

2.打印棋盘

void InitBoard(char board[ROW][COL], int row, int col)
{
    memset(board, ' ', row*col*sizeof(board[0][0]));//初始化为全空格
}

//打印棋盘
//┏ ┛┓┗ ━┃┫┣ ┳ ┻ ╋
void PrintfBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;//行
    int j = 0;//列
    //1.打印┏━┳━┳━┓
    printf("┏");
    for (j = 0; j < col - 1; j++)
    {
        printf("━┳");
    }
    printf("━┓\n");
    //2.
    for (i = 0; i < row; i++)
    {
   //(1)打印┃  ┃  ┃  ┃
        printf("┃");
        for (j = 0; j < col; j++)
        {
            printf("%c", board[i][j]);
            printf("┃");
        }
        printf("\n");
   //(2)打印┣━╋━╋━┫
        if (i < col - 1)
        {
            printf("┣");
            for (j = 0; j < col - 1; j++)
            {
                printf("━╋");
            }
            printf("━┫\n");
        }
  //(3)打印┗━┻━┻━┛
        else
        {
            printf("┗");
            for (j = 0; j<col - 1; j++)
            {
                printf("━┻");
            }
            printf("━┛\n");
        }
    }
}

3.玩家下棋

void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家走~\n");
    while (1)
    {
        printf("请输入坐标:");
        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] = 'X';
                break;
            }
            else
            {
                printf("该坐标已被占用\n");
            }
        }
        else
        {
            //坐标非法
            printf("该坐标不在范围之内\n");
        }
    }
}

4.电脑下棋

void ComputerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("电脑走~\n");
    while (1)
    {
        x = rand() % row;//rand0~32767; rand()%row表示小于row的数
        y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = 'O';//大写字母O
            break;
        }
    }
}

5.判断输赢

//当函数被static修饰时:
//1.只能在当前源文件中看到
//2.减少命名冲突  (别人也可以定义一个函数名为IsFull)
static int IsFull(char board[ROW][COL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;
            }
        }
    }
    return 1;
}

//1.电脑赢 返回字母O 2.玩家赢  返回字母X 3.平局 返回P 4.游戏继续 返回' '
char IsWin(char board[ROW][COL], int row, int col)
{
    //1.2.判断电脑或者玩家赢
    for (int 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 (int 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[1][1] != ' ')
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    {
        return board[1][1];
    }
    //3判断平局->棋盘满了->IsFull函数返回1
    if (IsFull(board,row,col)==1)
    {
        return 'P';
    }
    //4.游戏继续
    return  ' ';
}

整体代码

  • test.c → 测试源文件
#include "game.h"

void game()
{
    char board[ROW][COL] = { 0 };//不能直接全部初始化为空格
    char ret = 0;
    InitBoard(board,ROW,COL);
    PrintfBoard(board, ROW, COL);
    while (1)
    {
        PlayerMove(board, ROW, COL);//玩家走用 X 表示
        //判断输赢
        ret = IsWin(board, ROW, COL);
        if (ret != ' ')
        {
            break;
        }
        PrintfBoard(board, ROW, COL);
        ComputerMove(board, ROW, COL);//电脑走用O表示
        //判断输赢
        ret = IsWin(board, ROW, COL);
        if (ret != ' ')
        {
            break;
        }
        PrintfBoard(board, ROW, COL);
    }
    if (ret == 'X')
    {
        printf("玩家赢!\n");
    }
    else if (ret == 'O')
    {
        printf("电脑赢!\n");
    }
    else if (ret == 'P')
    {
        printf("平局。\n");
    }
    PrintfBoard(board, ROW, COL);
}
void menu()
{
    printf("**********************\n");
    printf("******  1.play  ******\n");
    printf("******  0.exit  ******\n");
    printf("**********************\n");
}
void test()
{
    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);
}
int main()
{
    test();
    return 0;
}
  • game.c → 游戏源文件
#include "game.h"

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
    memset(board, ' ', row*col*sizeof(board[0][0]));//初始化为全空格
}

//打印棋盘
//┏ ┛┓┗ ━┃┫┣ ┳ ┻ ╋
void PrintfBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;//行
    int j = 0;//列
    //1.打印┏━┳━┳━┓
    printf("┏");
    for (j = 0; j < col - 1; j++)
    {
        printf("━┳");
    }
    printf("━┓\n");
    //2.
    for (i = 0; i < row; i++)
    {
   //(1)打印┃  ┃  ┃  ┃
        printf("┃");
        for (j = 0; j < col; j++)
        {
            printf("%c", board[i][j]);
            printf("┃");
        }
        printf("\n");
   //(2)打印┣━╋━╋━┫
        if (i < col - 1)
        {
            printf("┣");
            for (j = 0; j < col - 1; j++)
            {
                printf("━╋");
            }
            printf("━┫\n");
        }
  //(3)打印┗━┻━┻━┛
        else
        {
            printf("┗");
            for (j = 0; j<col - 1; j++)
            {
                printf("━┻");
            }
            printf("━┛\n");
        }
    }
}
//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家走~\n");
    while (1)
    {
        printf("请输入坐标:");
        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] = 'X';
                break;
            }
            else
            {
                printf("该坐标已被占用\n");
            }
        }
        else
        {
            //坐标非法
            printf("该坐标不在范围之内\n");
        }
    }
}


//当函数被static修饰时:
//1.只能在当前源文件中看到
//2.减少命名冲突  (别人也可以定义一个函数名为IsFull)
static int IsFull(char board[ROW][COL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;
            }
        }
    }
    return 1;
}

//1.电脑赢 返回字母O 2.玩家赢  返回字母X 3.平局 返回P 4.游戏继续 返回' '
char IsWin(char board[ROW][COL], int row, int col)
{
    //1.2.判断电脑或者玩家赢
    for (int 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 (int 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[1][1] != ' ')
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    {
        return board[1][1];
    }
    //3判断平局->棋盘满了->IsFull函数返回1
    if (IsFull(board,row,col)==1)
    {
        return 'P';
    }
    //4.游戏继续
    return  ' ';
}



//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("电脑走~\n");
    while (1)
    {
        x = rand() % row;//rand0~32767; rand()%row表示小于row的数
        y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = 'O';//大写字母O
            break;
        }
    }
}
  • game.h → 头文件
#ifndef __GAME_H__
#define __GAME_H__

#define ROW 3
#define COL 3

#include <string.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InitBoard(char board[ROW][COL], int row, int col);
void PrintfBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);


#endif//__GAME_H__

运行结果

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值