C语言实现三子棋

一 要实现三子棋有以下几个基本功能:

1.初始化棋盘:用空字符初始化

2.打印棋盘:控制打印九宫格来表示棋盘

3.玩家下棋:用X表示玩家的棋子

4.电脑随机下棋:随机生成坐标,用0表示玩家的棋子

5.判断输赢:分为玩家赢,电脑赢,平局,继续游戏四种情况

二 程序如下:

1.头文件(函数的声明)

#define _CRT_SECURE_NO_WARNINGS 1    
#ifndef  __SANZIQI_H__    
#define  __SANZIQI_H__    
   
#define ROW 3    
#define COL 3    
    
//初始化    
void InitBorad(char arr[ROW][COL], int row, int col);    
    
//显示棋盘    
void Display(char arr[ROW][COL], int row, int col);    
    
//电脑走    
void Computer(char arr[ROW][COL], int row, int col);    
    
//人走    
void Player(char arr[ROW][COL], int row, int col);    
    
//判断是否还有空格    
int Check_full(char arr[ROW][COL], int row, int col);    
    
//判断输赢    
char Is_Win(char arr[ROW][COL], int row, int col);    
   
#endif  

2.子程序

#define _CRT_SECURE_NO_WARNINGS 1    
#include <stdio.h>    
#include <stdlib.h>    
#include <time.h>    
  //初始化    
void InitBorad(char arr[ROW][COL], int row, int col)    
{    
    int i;    
    int j;    
    for (i = 0; i < row;i++)    
    for (j = 0; j < col; j++)    
        arr[i][j] = ' ';    
}    
    
//显示棋盘    
void Display(char arr[ROW][COL], int row, int col)    
{    
    int i;    
    int j;    
    printf("----------\n");    
    for (i = 0; i < row; i++)    
    {    
        printf("|");    
        for (j = 0; j < col; j++)    
        {    
            printf("%2c|", arr[i][j]);    
        }    
        printf("\n----------\n");    
    }    
}    
    
//电脑走    
void Computer(char arr[ROW][COL], int row, int col)    
{    
    srand((unsigned int)time(NULL)); //产生随机数    
    while (1)    
    {    
        int x = rand() % 3; //产生一个小于3的数    
        int y = rand() % 3;    
        if (arr[x][y] == ' ') //判断这个元素是否为空    
        {    
            arr[x][y] = 'X';    
            break;    
        }       
    }       
}    
    
//人走    
void Player(char arr[ROW][COL], int row, int col)    
{    
    int x;    
    int y;    
    while (1)    
    {    
        printf("请输入坐标:");    
        scanf("%d%d", &x, &y);    
        x--;    
        y--;    
        if ((0 <= x && x <= row - 1) && (0 <= y && y <= col - 1)) //玩家输入的坐标要在棋盘范围内    
        {    
            if (arr[x][y] == ' ')    
            {    
                arr[x][y] = 'O';    
                break;    
            }    
            else    
            {    
                printf("你输入的下标被占,请重新输入!\n");    
            }    
        }    
        else    
        {    
            printf("越界了,请重新输入!\n");    
        }       
    }    
}    
    
//判断是否还有空格    
int Check_full(char arr[ROW][COL], int row, int col)    
{    
    int i;    
    int j;    
    for (i = 0; i < row; i++)    
    {    
        for (j = 0; j < col; j++)    
        {    
            if (arr[i][j] == ' ') //判断数组中有没有空格,如果出现一次空格,就已经可以证明数组没满    
                return 0;    
        }    
    }    
    return 1;    
}    
    
//判断输赢    
char Is_Win(char arr[ROW][COL], int row, int col)    
{    
    int i;    
    if (Check_full(arr, ROW, COL) == 1) //棋盘满了没有空格,平局    
        return 'Q';    
    for (i = 0; i < row; i++)//某一行连3    
    {    
        if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2])    
        return arr[i][1];    
    }    
    for (i = 0; i < col; i++) //某一列连3    
    {    
        if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i])    
        return arr[1][i];    
    }    
    if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]) //右对角线\连3    
        return arr[1][1];    
    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0]) //左对角线/连3    
        return arr[1][1];    
    return ' '; //如果没有判断出谁赢并且棋盘还没满,则继续进行游戏    
}  

3.主函数 即main

#define _CRT_SECURE_NO_WARNINGS 1    
#include <stdio.h>    
#include <stdlib.h>    
  
void menu()    
{    
    printf("**************************************\n");    
    printf("*************** 1.play ***************\n");    
    printf("*************** 0.exit ***************\n");    
    printf("**************************************\n");    
}    
void game()    
{    
    char arr[ROW][COL];    
    InitBorad(arr,ROW,COL);//初始化棋盘    
    //Display(arr, ROW, COL);    
    do{    
        Computer(arr, ROW, COL); //电脑先走    
        Display(arr, ROW, COL); //打印棋盘    
        if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环    
        {    
            break;    
        }    
        Player(arr, ROW, COL); //玩家走    
        Display(arr, ROW, COL); //打印棋盘    
        if (Is_Win(arr, ROW, COL) != ' ') //如果棋盘不为空的话,即判断出谁赢或平局,就跳出循环    
        {    
            break;    
        }    
    } while (Is_Win(arr, ROW, COL) == ' '); //如果棋盘没有满,同时也没有判断出输赢的话,继续执行循环,否则跳出循环    
    if (Is_Win(arr, ROW, COL) == 'O')    
        printf("玩家赢\n");    
    else if (Is_Win(arr, ROW, COL) == 'X')    
        printf("电脑赢\n");    
    else if (Is_Win(arr, ROW, COL) == 'Q')    
        printf("平局\n");    
    
}    
int main()    
{    
    int choose = 0;     
    do{    
        menu();    
        printf("请选择>");    
        scanf("%d", &choose);    
        switch (choose)    
        {    
        case 1:    
            game();    
            break;    
        case 0:    
            printf("退出游戏\n");    
            break;    
        default:    
            printf("输入错误,重新输入!\n");    
        }    
    } while (choose);    
    system("pause");    
    return 0;    
}    

程序运行结果如下:



猜你喜欢

转载自blog.csdn.net/yzyjaaa/article/details/79859078