小游戏--三子棋(任意几子棋)

程序思想
1. 多文件实现游戏功能
2. 改变宏定义即可改变棋盘大小以及棋子个数
3. test.c:功能的测试以及函数的调用
4. game.h : 包含头文件的引用,函数的声明
5. game.c : 各函数的功能的实现。
具体实现
1. 棋牌的设置以及棋盘的显示
2. 玩家和电脑各自落子的实现
3. 输赢的判定

代码:

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"

void game()
{
    char board[ROW][COL];
    init_board(board, ROW, COL);    //初始化棋盘
    display_board(board, ROW, COL);  // 显示棋盘
    srand((unsigned int)time(NULL));  //随机落子
    play_game(board,ROW,COL);         //游戏的主逻辑
}

void menu()
{
    printf("********************\n");
    printf("*******1.play*******\n");
    printf("*******0.exit*******\n");
    printf("********************\n");
}
int main()
{
    int input = 0;
    menu();
    do          
    {
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            break;
        default:
            printf("输入错误,重新输入\n");
            break;
        }
    } while (input);
    return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
#include<stdio.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]);

        }
        printf("\n");
        for (j = 0; j < col; j++)
        {
            if (i!=row-1)
            printf("___|");
        }
        printf("\n");
    }

}


//选择第一次谁先落子(先落子优势大)
void menu1()
{
    printf("2.玩家先走    3.电脑先走\n");
}

//玩家落子
void player_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;

    while (1)
    {
        printf("请输入坐标:>");
        scanf("%d %d", &x, &y);
        if ((x >= 0 && y <= row - 1) && (y >= 0 && y <= col - 1))     //  落子坐标不能超过棋盘
        {
            if (board[x][y] == ' ')
            {
                board[x][y] = 'x';
                break;
            }
            else
            {
                printf("下标有误,请重新输入\n");   //  输入的坐标已经有棋
            }
        }
        else                                       //   输入的坐标超出棋盘范围
        {
            printf("下标有误,请重新输入\n");
        }


    }

}


//电脑落子
void computer_move(char board[ROW][COL], int row, int col)
{
    int x = rand() % row;               //电脑是随机取数,故而坐标为 rand()%row;
    int y = rand() % col;
    while (1)
    {
        if (board[x][y] == ' ')
        {
            board[x][y] = '*';
            break;
        }
    }

}


//判断棋盘是否为满
static  int isfull(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 win_check(char board[ROW][COL], int row, int col, char c)
{
    int i = 0;
    int j = 0;

    // 检测行
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] != c)
                break;
        }

        if (j == col)
            return c;
    }


    // 检测列
    for (i = 0; i < col; i++)
    {
        for (j = 0; j < row; j++)
        {
            if (board[j][i] != c)
                break;
        }

        if (j == row)
            return c;
    }


    // 检测对角线
    for (i = 0; i < row; i++)
    {
        if (board[i][i] != c)
            break;
    }

    if (i == row)
        return c;

    // 检测对角线
    for (i = 0; i < row; i++)
    {
        if (board[i][row - i - 1] != c)
            break;
    }

    if (i == row)
        return c;

    if (isfull(board, ROW, COL))
    {
        return 'p';
    }

    return ' ';

}

void play_game(char board[ROW][COL], int row, int col)
{
    menu1();
    int k = 0;
    char ret = 0;
    printf("请选择玩家先走还是电脑先走:");
    scanf("%d", &k);

    while (1)
    {
        if (k == 2) //如果选择2,第一次玩家先走
        {
            player_move(board, ROW, COL);
            if ((ret = win_check(board, ROW, COL, 'x')) != ' ')
                break;
            display_board(board, ROW, COL);

            computer_move(board, ROW, COL);
            if ((ret = win_check(board, ROW, COL,'*')) != ' ')
                break;
            display_board(board, ROW, COL);

        }
        if (k == 3)     //选择3,第一次电脑先走
        {
            computer_move(board, ROW, COL);
            if ((ret = win_check(board, ROW, COL,'*')) != ' ')
                break;
            display_board(board, ROW, COL);

            player_move(board, ROW, COL);
            if ((ret = win_check(board, ROW, COL,'x')) != ' ')
                break;
            display_board(board, ROW, COL);
        }
    }

    if (ret == 'x')
    {
        printf("玩家赢\n");
    }
    else if (ret == '*')
    {
        printf("电脑赢\n");
    }
    else if (ret == 'p')
    {
        printf("平局\n");
    }

    display_board(board, ROW, COL);
}

game.h

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef  __GAME_H__
#define __GAME_H__



#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW  5
#define COL  5



void  init_board(char board[ROW][COL],int row,int col);
void  display_board(char board[ROW][COL], int row, int col);
void  play_game(char board[ROW][COL], int row, int col);
void menu1();
void  player_move(char board[ROW][COL],int row,int col);
void computer_move(char board[ROW][COL], int row, int col);
char win_check(char board[ROW][COL], int row, int col);
int isfull(char board[ROW][COL], int row, int col);


#endif  //_GAME_H__

总结
1. 改变宏定义即改变棋盘大小以及棋子个数

#define ROW  3
#define COL  3
  1. 输赢的判断时应考虑几种情况(以三子为例):
    1)横行三子相连为赢
    2)竖列三子相连为赢
    3)对角线三子相连为赢
    4)出现平局
char win_check(char board[ROW][COL], int row, int col, char c)
{
    int i = 0;
    int j = 0;

    // 检测行
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] != c)
                break;
        }

        if (j == col)
            return c;
    }


    // 检测列
    for (i = 0; i < col; i++)
    {
        for (j = 0; j < row; j++)
        {
            if (board[j][i] != c)
                break;
        }

        if (j == row)
            return c;
    }


    // 检测对角线
    for (i = 0; i < row; i++)
    {
        if (board[i][i] != c)
            break;
    }

    if (i == row)
        return c;

    // 检测对角线
    for (i = 0; i < row; i++)
    {
        if (board[i][row - i - 1] != c)
            break;
    }

    if (i == row)
        return c;

    if (isfull(board, ROW, COL))
    {
        return 'p';
    }

    return ' ';

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值