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

猜你喜欢

转载自blog.csdn.net/ainuliba/article/details/134673462
今日推荐