三子棋游戏

本文详细介绍了如何使用二维数组和函数实现三子棋游戏。通过定义一个3*3的棋盘,实现玩家与电脑的对战功能,包括打印棋盘、玩家走棋、判断输赢以及电脑走棋等步骤。通过一步步的逻辑设计,最终达到完整的游戏效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要完整地、清晰地实现三子棋的功能。必须有一个清晰地思路,再将思路转化为一个个功能不同的函数,最终实现三子棋人和电脑对战的效果。首先我先构想需要实现的功能,将这些功能封装成没一个函数,函数的具体实现在后面的过程中再具体完善。
首先我先要清楚我将要通过定义一个3*3的二维数组来完成三子棋基本功能,通过对二维数组的改变来实现三子棋的各个操作。
思路:选择菜单
1.打印棋盘;
2.玩家走;
3.判断输赢;
4.电脑走;
5.判断输赢;
代码如下:


game.h   //头文件



#ifndef _GAME_H_

#define _GAME_H_

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


#define ROW 3   //行数
#define COL 3   //列数

void Init_board(int arr[ROW][COL],int row,int col);//初始化棋盘
void Print_board(int arr[ROW][COL],int row,int col);//打印棋盘
void Player_move(int arr[ROW][COL],int row,int col);//玩家走
void Computer_move(int arr[ROW][COL],int row,int col);//电脑走
int Check_win(int arr[ROW][COL],int row,int col);//判断输赢


#endif// _GAME_H_




game.c   //游戏部分



#include "game.h"
void Init_board(int arr[ROW][COL],int row,int col)//初始化棋盘
{ 
    int i = 0;
    for(i=0;i<row;i++)
    {
        int j = 0;
        for(j=0;j<col;j++)
        {
            arr[i][j]=' ';
        }
    }

}
void Print_board(int arr[ROW][COL],int row,int col )//打印棋盘
{
    int i = 0;
    for(i=0;i<row;i++)
    {
        printf("|%2c|%2c|%2c|\n",arr[i][0],arr[i][1],arr[i][2]);
        if(i<row-1)//最后一行不打印,美观
        {
            printf("|--|--|--|\n");
        }

    }
    printf("\n");

}
void Player_move(int arr[ROW][COL],int row,int col)//玩家走
{
    int x = 0;
    int y = 0;
    while(1)
    {
        printf("输入坐标(x,y):");
        scanf("%d%d",&x,&y);
        if((x>=1)&&(x<=row)&&(y>=1)&&(y<=col))//保证坐标有效
        {
            if(arr[x-1][y-1]!=' ')
            {
                printf("输入的坐标被占用,请重新输入!\n");
            }
            else 
            {
                arr[x-1][y-1]='*';//下标
                break;
            }
        }
        else
        {
            printf("输入的坐标无效!\n");
        }
    }
    printf("\n");
}
void Computer_move(int arr[ROW][COL],int row,int col)//电脑走
{
    int x = 0;
    int y = 0;
    while(1)
    {
        x=rand()%row;//电脑产生随机数
        y=rand()%col;
        if(arr[x][y]==' ')
        {
            arr[x][y]='X';
            break;
        }

    }
    printf("\n");
}
int Is_full(int arr[ROW][COL],int row,int col)//判断棋盘是否满格
{
    int i = 0;
    for(i = 0;i<row;i++)
    {
        int j = 0;
        for(j=0;j<col;j++)
        {
            if(arr[i][j]==' ')
                return 0;
        }
    }
    return 1;
}
int Check_win(int arr[ROW][COL],int row,int col)//判断输赢
{
    int i= 0;
    for(i=0;i<row;i++)//从行判断
    {
        if((arr[i][0]==arr[i][1])&&
            (arr[i][1]==arr[i][2])&&
            arr[i][2]!=' ')
        {
            return arr[i][0];
        }
    }
    for(i=0;i<col;i++)//从列判断
    {
        if((arr[0][i]==arr[1][i])&&
            (arr[1][i]==arr[2][i])&&
            arr[2][i]!=' ')
        {
            return arr[0][i];
        }

    }
    //从对角线判断
    if((arr[0][0]==arr[1][1])&&
        (arr[1][1]==arr[2][2])&&
        arr[2][2]!=' ')
    {
        return arr[0][0];
    }
    if((arr[0][2]==arr[1][1])&&
        (arr[1][1]==arr[2][0])&&
        arr[2][0]!=' ')
    {
        return arr[0][2];
    }
    if(Is_full(arr,row,col))
    {
        return 'q';
    }
    return ' ';
}




test.c   //测试部分




#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()//打印菜单
{
    printf("******************************\n");
    printf("*****       1.play       *****\n");
    printf("*****       0.exit       *****\n");
    printf("******************************\n");
}
void game()//开始游戏
{
    int board[ROW][COL]={0};
    int ret = 0;
    Init_board(board,ROW,COL);//初始化棋盘
    do
    {
        Print_board(board,ROW,COL);
        printf("玩家走:");
        Player_move(board,ROW,COL);
        Print_board(board,ROW,COL);
        ret=Check_win(board,ROW, COL);

        if(ret!=' ')
            break;
        printf("电脑走:");
        printf("\n");
        Computer_move(board,ROW,COL);
        Print_board(board,ROW,COL);
        ret=Check_win(board,ROW, COL);

        if(ret!=' ')
            break;
    }while(1);

    if(ret=='X')
    {
        printf("电脑赢\n");

    };
    void  test ()
    {
        int input =0;
         srand=((unsigned)time(NULL));//初始化时间种子
         do
         {
        menu();
        printf("请输入->:")

        scanf("%d",&input);
        switch(input)
        {
        case 1:game();
            break;
        case 0:
            break;
        default:printf("输入错误,请重新输入!\n");
            break;
        }
    }while(input);
}
int main()
{
    test();
    system("pause");
    return 0;
}

结果:
这里写图片描述
这里写图片描述
这里写图片描述

总结完毕,请多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值