用C写一个简单的三子棋游戏

基本思路:


打印菜单——选择游戏——打印初始棋盘(棋盘用数组实现)——玩家下棋(输入坐标)——电脑随机下棋(利用rand(srand)的库函数)——判断(棋盘格子是否为空,,棋盘是否满了,判断游戏结果)——结束游戏。

代码实现:

game.h


        #define _CRT_SECURE_NO_WARNINGS 1
        #ifndef GAME_H__
        #define GAME_H__
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.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 player_move(char board[ROW][COL], int row, int col);    //玩家走
        void computer_move(char board[ROW][COL], int row, int col);  //电脑走
        char check_win(char board[ROW][COL], int row, int col);       //判断输赢
        #endif

game.c

    #include"game.h"
    void init_board(char board[ROW][COL], int row, int col)//初始化
    {
        memset(board,' ',row * col * sizeof(char));
    }
    void display_board(char board[ROW][COL], int row, int col)//打印
    {
        int i = 0;
        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");
            }
        }
    }
    void player_move(char board[ROW][COL], int row, int col)//玩家走
    {
        int x = 0;
        int y = 0;
        while(1)
        {
            printf("请输入坐标:\n");
            scanf("%d%d",&x,&y);
            x--;
            y--;
            if(((x>=0)&&(x<=(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 = 0;
        int y = 0;
        while(1)
        {
            x = rand() % 3;
            y = rand() % 3;
            if(board[x][y] == ' ')
            {
                board[x][y] = 'O';
                break;
            }
        }
    }
    static 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] == ' ')
                return 0;
            }
        }
        return 1;
    }
    char check_win(char board[ROW][COL], int row, int col)//判断输赢
    {
        int i = 0;
        int j = 0;
        for (i = 0; i < row; i++)
        {
            if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != ' '))
            return board[i][0];//横向相同
        }
        for (j = 0; j < col; j++)
        {
            if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[0][j] != ' '))
            return board[0][j];//纵向相同
        }
        if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[0][0] != ' '))
        return board[0][0];//斜线相同
        if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2]) && (board[2][0] != ' '))
        return board[2][0];//斜线相同
        if (is_full(board, row, col))
        return 'Q';
        else
        return ' ';
    }

test.c

    #include "game.h"
    void menu()
    {
        printf("************************\n");
        printf("*******  1.play  *******\n");
        printf("*******  0.exit  *******\n");
        printf("************************\n");
    }
    void game()
    {
        char board[ROW][COL] = { 0 };
        char ret = '0';
        init_board(board, ROW, COL);
        display_board(board, ROW, COL);
        srand((unsigned int)time(NULL));
        while(1)
        {
            printf("该你走啦\n");
            player_move(board, ROW, COL);
            ret = check_win(board, ROW, COL);
            if(ret != ' ')
                break;
            display_board(board, ROW, COL);
            printf("\n");
            printf("电脑走\n");
            computer_move(board, ROW, COL);
            ret = check_win(board, ROW, COL);
            if(ret != ' ')
                break;
            display_board(board, ROW, COL);
        }
                if('X'==ret)
        {
            printf("恭喜你赢啦!\n");
        }
        else if('O'==ret)
        {
            printf("垃圾,电脑赢了!\n");
        }
        else if('Q'==ret)
        {
            printf("很遗憾,平局\n");
        }
        display_board(board, ROW, COL);
    }
    int main()
    {
        int input = 0;
        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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值