C语言 三子棋等(棋盘大小可改)

代码在一个项目里完成,分成三个.c.h文件(game.c,game.h,main.c)
在Clion软件中通过运行调试。


//main.c
//#include<stdio.h>
//#include<stdlib.h>
//#include<time.h>
#include"game.h"

// 显示菜单
void menu(){
    printf("*********1.game***0.退出*********\n");
    printf("*********输入数字进行选择***********\n");
}
//游戏核心
void game() {
    char array[ROW][COL] = {0};
    char judge =0;
    //初始化棋盘
    Init(array, ROW, COL);
    //显示棋盘
    display(array, ROW, COL);

    //落子
    while (1) {
        //玩家下棋
        Play_game(array, ROW, COL);
        //显示
        display(array, ROW, COL);
        //判断输赢
        judge = Judge_end(array, ROW, COL);
        if (judge != ' ')
            break;

        //电脑落子
        Computer_play(array, ROW, COL);
        //显示
        display(array, ROW, COL);
        //判断输赢
        judge = Judge_end(array, ROW, COL);
        if (judge != ' ')
            break;
    }

    if (judge == '*')
        printf("玩家赢\n");
    else if (judge == '#')
        printf("电脑赢\n");
    else
        printf("平局\n");
}

int main()
{
    setbuf(stdout,NULL);
    int number=0;
    srand((unsigned int )time(NULL));//由时间戳生产电脑的随机坐标值

    do{
        menu();
        scanf("%d",&number);
        getchar();
        switch(number)
        {
            case 1:
                game();
                break;
            case 0:
                printf("正在退出\n");
                break;
            default:
                printf("选择错误,重新输入\n");
                break;
        }
    }while(number);


}


//game.c
#include"game.h"

void Init(char array[][COL],int row,int col){
    //棋盘初始化为空白
    for(int x=0;x<ROW;x++){
        for(int y=0;y<ROW;y++){
            array[x][y]=' ';
        }
    }
}

//   |   |
//---|---|---
//   |   |
//---|---|---
//   |   |
//显示初始化棋盘
void display(char array[][COL],int row,int col){
    for(int x=0;x<row;x++){
        for(int y=0;y<col;y++){
            printf(" %c ",array[x][y]);
            if(y<col-1)
                printf("|");
        }
        printf("\n");

        for(int y=0;y<col;y++){
            if(x<row-1)
                printf("---");
            if(y<col-1&&x<row-1)
                printf("|");
        }
        printf("\n");
    }

}
// 玩家输入坐标
void Play_game(char array[][COL],int row,int col){
    int x=0;
    int y=0;
    char arr[5]="\0";

    printf("玩家输入落子坐标值(x,y):\n");
    while(1) {
        //将玩家输入信息当作字符处理,只要用户输入信息格式为1.1或1-1等都可,只要确保第一个字符和第三个字符正确
       gets(arr);
        x=arr[0]-'0';
        y=arr[2]-'0';

        //坐标有效
        if((x>=1&&x<=row)&&(y>=1&&y<=col))
        {
            if (array[x - 1][y - 1] == ' ') {
                array[x - 1][y - 1] = '*';
                break;
            }
            else
                printf("此坐标已有子,请重新输入\n");
        }
        else
            printf("坐标无效,请重新输入\n");
    }
}
// 电脑随机函数生成电脑落子坐标
void Computer_play(char array[][COL],int row,int col){
    int x=0;
    int y=0;
    printf("电脑落子:\n");
    while(1) {
        x=rand()%row;//和main函数里的时间戳一起生成随机坐标
        y=rand()%col;
        if (array[x][y] == ' '){
            array[x][y] = '#';
            break;
        }
    }
}

//玩家赢
//电脑赢
//平局
//棋盘未满

//判断电脑的输赢  基本就是判断玩家输赢代码复制了一份 由*改成了#
char Judge_end(char array[][COL],int row,int col) {
    int x = 0, y = 0;
    int flag = 0, temp = 0;
    //行列采用1&  假如每行/每列都是*/#  最后结果就是1
    //对角线判断规则是:是想要的*/#  次数++ 最后看次数是不是对角线长度
    
	//玩家
    //行
    for (x = 0; x < row; x++) {
        flag = 1;
        for (y = 0; y < col; y++) {
            if (array[x][y] == '*')
                flag &= 1;
            else
                flag &= 0;
        }
        if (flag == 1) {
            printf("①玩家行规则\n");
            return '*';
        }
    }
    //列
    for (x = 0; x < col; x++) {
        flag = 1;
        for (y = 0; y < row; y++) {
            if (array[y][x] == '*')
                flag &= 1;
            else
                flag &= 0;
        }
        if (flag == 1) {
            printf("②玩家列规则\n");
            return '*';
        }
    }
    //左对角线
    flag = 0;
    for (x = 0; x < row; x++) {
        for (y = 0; y < col; y++) {
                if ((array[x][y] == '*')&&(x == y))
                    flag ++;
        }
    }
    if (flag == row) {
        printf("③玩家左对角线规则\n");
        return '*';//左对角线
    }
    //右对角线
    flag = 0;
    for (x = row - 1; x >= 0; x--) {
        for (y = 0; y < col; y++) {
                if ((array[x][y] == '*')&&((x + y) == (row-1)))
                    flag ++;
        }
    }
    if (flag == row) {
        printf("④玩家右对角线规则\n");
        return '*';//右对角线
    }
    //电脑
    //行
    for (x = 0; x < row; x++) {
        temp = 1;
        for (y = 0; y < col; y++) {
            if (array[x][y] == '#')
                temp &= 1;
            else
                temp &= 0;
        }
        if (temp == 1) {
            printf("①电脑行规则\n");
            return '#';
        }
    }

    //列
    for (x = 0; x < col; x++) {
        temp = 1;
        for (y = 0; y < row; y++) {
            if (array[y][x] == '#')
                temp &= 1;
            else
                temp &= 0;
        }
        if (temp == 1) {
            printf("②电脑列规则\n");
            return '#';
        }
    }
    //左对角线
    temp = 0;
    for (x = 0; x < row; x++) {
        for (y = 0; y < col; y++) {
                if ((array[x][y] == '#')&&(x == y))
                    temp++;
        }
    }
    if (temp == row) {
        printf("③电脑左对角线规则\n");
        return '#';//左对角线
    }
    //右对角线
    temp = 0;
    for (x = row - 1; x >= 0; x--) {
        for (y = 0; y < col; y++) {
                if ((array[x][y] == '#')&&((x + y) == (row-1)))
                    temp ++;
        }
    }
    if (temp == row) {
            printf("④电脑右对角线规则\n");
            return '#';//右对角线
    }
    //棋盘未满
    for (x = 0; x < row; x++) {
        for (y = 0; y < col; y++) {
          if (array[x][y] == ' ')
               return ' ';
        }
    }
        //平局
        return 'r';
    }

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

#define ROW 4//棋盘行数字可改
#define COL 4//棋盘列数字可改

#ifndef TEXT1_GAME_H
#define TEXT1_GAME_H

//初始化棋盘
void Init(char array[][COL],int row,int col);
//显示
void display(char array[][COL],int row,int col);
//玩家输入坐标
void Play_game(char array[][COL],int row,int col);
//电脑随机坐标
void Computer_play(char array[][COL],int row,int col);
//判断输赢
char Judge_end(char array[][COL],int row,int col);
#endif 
//TEXT1_GAME_H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值