三子棋

三子棋游戏
一、分析

1.创建一个进入游戏让玩家选择的框架
2.创建一个三子棋的棋盘,棋盘内部存放玩家和电脑下的棋子,所以总的来说棋盘是由一个二维数组和棋盘框架构成的
3.对棋盘进行操作
4.判断棋局并做出调整

二、代码

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 3

//初始化数组
void Init(char board[ROW][COL], int row, int col);
//打印棋盘
void Display(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 Is_Win(char board[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void Init(char board[ROW][COL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}
//期待打印的棋盘
//   |   |   
//---|---|---
//   |   |   
//---|---|---
//   |   |   

void Display(char board[ROW][COL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        //打印i行
        for (int j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);
            if (j < col - 1)
                printf("|");
        }
        printf("\n");
        if (i < row - 1)
        {
            for (int j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                    printf("|");
            }
            printf("\n");
        }
    }
}
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x, y;
    while (1)
    {
        printf("Player Move:>");
        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("Location Error\n");
            }
        }
        else
        {
            printf("Location Error\n");
        }
    }
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    int x, y;
    //随机生成一个x,y的位置
    printf("Computer Move\n");
    while (1)
    {
        x = rand() % row;
        y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
int Is_Full(char board[ROW][COL], int row, int col)
{
    int flag = 1;
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                flag = 0;
                return flag;
            }
        }
    }
    return flag;
}
//判断输赢
//如果返回‘*’代表玩家赢
//‘#’代表电脑赢
//‘D’代表平局
//‘C’代表可以继续
char Is_Win(char board[ROW][COL], int row, int col)
{
    //玩家赢,电脑赢
    //行三个子,列三个子,斜三个子
    //
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j <= col - 3; j++)
        {
            if ((board[i][j] == board[i][j + 1] )&&( board[i][j + 1] == board[i][j + 2]) &&( board[i][j] != ' '))
            {
                return board[i][j];
            }
        }
    }
    //
    for (int j = 0; j < col; j++)
    {
        for (int i = 0; i <= row - 3; i++)
        {
            if ((board[i][j] == board[i + 1][j] )&&( board[i+1][j] == board[i + 2][j]) &&( board[i][j] != ' '))
            {
                return board[i][j];
            }
        }
    }
    //正斜
    for (int i = 0; i <= row - 3; i++)
    {
        for (int j = 0; j <= col - 3; j++)
        {
            if ((board[i][j] == board[i + 1][j+1]) && (board[i + 1][j+1] == board[i + 2][j+2]) && (board[i][j] != ' '))
            {
                return board[i][j];
            }
        }
    }
    //反斜
    for (int i = row - 1; i >= 2; i--)
    {
        for (int j = col - 1; j >= 2; j--)
        {
            if ((board[i][j-2] == board[i - 1][j - 1]) && (board[i - 1][j - 1] == board[i - 2][j ]) && (board[i-1][j-1] != ' '))
            {
                return board[i-1][j-1];
            }
        }
    }

    //平局
    if (Is_Full(board,row,col) == 1)
    {
        return 'D';
    }
    else
    {
        return 'C';
    }
    //继续
}

test.c

#include "game.h"
void menu()
{
    printf("                       \n");
    printf("   1.Play     0.Exit   \n");
    printf("                       \n");
}
void game()
{
    char board[ROW][COL];
    //初始化数组
    Init(board, ROW, COL);
    //打印棋盘
    Display(board, ROW, COL);
    //开始下棋,是一个循环事件
    char ret;
    while (1)
    {
        //玩家下棋
        PlayerMove(board,ROW,COL);
        Display(board, ROW, COL);
        //判断棋局形势
        ret=Is_Win(board, ROW, COL);
        //printf("%c\n", ret);//用于测试
        if (ret != 'C')
        {
            break;
        }
        //电脑下子
        ComputerMove(board, ROW, COL);
        Display(board, ROW, COL);
        ret=Is_Win(board, ROW, COL);
        //printf("%c\n", ret);//用于测试
        if (ret != 'C')
        {
            break;
        }
    }
    if (ret == '*')
        printf("Player Win\n");
    else if (ret == '#')
        printf("Computer Win\n");
    else if (ret == 'D')
        printf("Draw\n");
}
int main()
{
    //初始化随机数
    srand((unsigned int)time(NULL));
    //创建一个初始界面
    int input;
    do
    {
        menu();
        printf("Input Num:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            //进入游戏
            game();
            break;
        case 0:
            printf("Exit\n");
            break;
        default:
            printf("Error Input\n");
            break;
        }
    } while (input);
    return 0;
}

三、运行结果

 

热门相关:宠物小精灵之庭树   一等狂妃:邪王,请接招!   慕少,你老婆又重生了   宠物小精灵之庭树   嫡嫁千金