linux c 实现三子棋游戏

        三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。

        实现的原理比较简单,我们直接看代码。

three_chess.h

#ifndef _THREE_CHESS_H_
#define _THREE_CHESS_H_

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

#define ROW 3
#define COL 3
void start(void);

#endif

three_chess.c

#include "three_chess.h"
//判断棋盘是不是下满了,下满了返回0,没下满返回1
static int is_full(char board[][COL])
{
    int i, j;
    for(i = 0; i < ROW; i++)
    {
        for(j = 0; j < COL; j++)
        {
            if(board[i][j] == ' ')
            {
                return 1;
            }
        }
    }
    return 0;
}
//判断输赢的函数
static int is_win(char board[][COL])
{
    int i;
    //判断横着的三行,如果任意一行的符号全部一样说明,产生赢家
    for(i = 0; i < ROW; i++)
    {
        if(board[i][0] == board[i][1] && board[i][1] == board[i][2])
        {
            //如果是'o'这个字符,说明玩家赢了
            if(board[i][0] == 'o')
            {
                //玩家赢了,返回1
                return 1;
            }
            //如果是'x'这个字符,说明电脑赢了
            else if(board[i][0] == 'x')
            {
                //电脑赢了,返回2
                return 2;
            }
        }
    }
    //和判断行原理相同
    for(i = 0; i < COL; i++)
    {
        if(board[0][i] == board[1][i] && board[1][i] == board[2][i])
        {
            if(board[0][i] == 'o')
            {
                return 1;
            }
            else if(board[0][i] == 'x')
            {
                return 2;
            }
        }
    }
    //判断斜着的是否一样
    if(board[0][0] == board[1][1] && board[1][1] == board[2][2] || board[0][2] == board[1][1] && board[1][1] == board[2][0])
    {
        if(board[1][1] == 'o')
        {
            return 1;
        }
        else if(board[1][1] == 'x')
        {
            return 2;
        }
    }
    //走到这里说明棋盘满了,但是还没有产生赢家,那么返回3
    if(!is_full(board))
    {
        return 3;
    }
    //走到这里说明,棋盘没有下满,也没有产生赢家,继续走
    return 0;
}
//电脑产生0-2的随机数下棋,如果位置被占用,继续产生
static void computer_move(char board[][COL])
{
    srand((unsigned int)time(NULL));
    int x, y;
    do
    {
        x = rand() % 3;
        y = rand() % 3;
        if(board[x][y] == ' ')
        {
            board[x][y] = 'x';
            break;
        }
    }while(1);
}
//游戏玩家下棋函数
static void man_move(char board[][COL])
{
    int x, y;
    do
    {
        printf("请输入坐标<x, y> : ");
        scanf("%d%d", &x, &y);
        if(x < 1 || x > 3 || y < 1 || y > 3)
        {
            printf("坐标不在范围内!\n");
            continue;
        }
        if(board[x - 1][y - 1] != ' ')
        {
            printf("此位置已经被占用!\n");
            continue;
        }
        //走到这里说明输入正确,而且这个位置也没有被占用
        board[x - 1][y - 1] = 'o'; 
        break;
    }while(1);
}
//打印棋盘
static void print_board(char board[][COL])
{
    int i;
    for(i = 0; i < ROW; i++)
    {
        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
        if(i < ROW - 1)
        {
            printf("---|---|---\n");
        }
    }
}
//初始化棋盘,全部初始化为空格' '
static void init_board(char board[][COL])
{
    int i, j;
    for(i = 0; i < ROW; i++)
    {
        for(j = 0; j < COL; j++)
        {
            board[i][j] = ' ';
        }
    }
}

static void game(void)
{
    char board[ROW][COL];
    init_board(board);
    int res;
    do
    {
        system("clear");
        print_board(board);
        man_move(board);
        res = is_win(board);
        if(res)
        {
            break;
        }
        computer_move(board);
        res = is_win(board);
        if(res)
        {
            break;
        }
    }while(!res);
    //为了最后退出游戏时,能看到下的那步棋
    system("clear");
    print_board(board);
    if(1 == res)
    {
        printf("你赢了不会玩的电脑,hehe!\n");
        exit(0);
    }
    if(2 == res)
    {
        printf("恭喜电脑获胜,yeah!\n");
        exit(0);
    }
    if(3 == res)
    {
        printf("平局,666!\n");
        exit(0);
    }
}
//打印开始界面
static void menu(void)
{
    printf("######################\n");
    printf("######################\n");
    printf("## three chess game ##\n");
    printf("##      1.play      ##\n");
    printf("##      0.exit      ##\n");
    printf("######################\n");
    printf("######################\n");
    printf("Please choose: ");
}

void start(void)
{
    int num;
    do
    {
        system("clear");
        menu();
        scanf("%d", &num);
        switch(num)
        {
            case 1:
                game();
                break;
            case 0:
                exit(0);
                break;
            default:
                break;
        }
    }while(1);
}

main.c

#include "three_chess.h"

int main(void)
{
    start();
    return 0;
}

看一下游戏效果:


猜你喜欢

转载自blog.csdn.net/chenxin6991/article/details/80019511