智能三子棋小游戏(简单+困难模式版)

在编写三子棋时最好采用图片中创建项目方式,将源文件和头文件分开创建


以后头文件放在game.h中就可以在其他源文件直接调用game.h头文件就行

game.h中放的代码如下:

#ifndef _GAME_H_
#define _GAME_H_

#include<stdio.h>
#include<windows.h>
#include<time.h>

#define ROW 3
#define COL 3

enum ED
{
    Easy = 1,
    Diff 
};

void InitBoard(char board[ROW][COL],int row,int col);//初始化棋盘函数
void DisplayBoard(char board[ROW][COL],int row,int col);//打印棋盘函数
void CompeterEasy(char board[ROW][COL],int row,int col);//简单电脑走函数
int CompeterDiff(char board[ROW][COL],int row,int col);//困难电脑走函数
void CompeterStartMove(char board[ROW][COL],int row,int col,int input2);//电脑先走函数
void PlayerMove(char board[ROW][COL],int row,int col,int input2);//人先走函数
void CompeterSelect(char board[ROW][COL],int row,int col,int input2);//电脑选择模式函数
char Iswin(char board[ROW][COL],int row,int col); //判断谁赢函数


#endif
game.c中主要放的是游戏中所需要的的功能
#define  _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void InitBoard(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++)
        {
            board[i][j] = ' ';//初始化为空
        }
    
    }
}

void DisplayBoard(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");
        }
        
    }
}
 static int Isfull(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 Iswin(char board[ROW][COL],int row,int col)//判断游戏是否出现赢家
{
    int i = 0;
    char ret = 0;
    for(i = 0;i < row;i++)
    {
        if((board[i][0]==board[i][1])&&(board[i][1]==board[i][2])&&(board[i][1]!= ' '))//横着三个棋子相等
        {
            return board[i][1];
        }
    }

    for(i = 0;i < col;i++)
    {
         if((board[0][i]==board[1][i])&&(board[1][i]==board[2][i])&&(board[1][i]!=' '))//竖着三个棋子相等
        {
            return board[1][i];
        }
    }

    if((board[0][0]==board[1][1])&&(board[2][2]==board[1][1])&&(board[1][1]!=' '))//左对角三个棋子相等
        {
            return board[1][1];
        }

    else if((board[0][2]==board[1][1])&&(board[2][0]==board[1][1])&&(board[1][1]!=' '))//右对角三个棋子相等
        {
            return board[1][1];
        }
    if(Isfull(board,row,col))//判断棋盘是否为满
    {
        return 'q';
    }
    else
    {
        return '#';
    }
}
void CompeterEasy(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] = 'D';
            break;
        }
        
    }
}
int CompeterDiff(char board[ROW][COL],int row,int col)//电脑困难模式
{
    int i = 0;
    for(i = 0;i < row;i++) //判断每一行上是否有两个相同的棋子
    {
        if((board[i][0]==board[i][1])&&(board[i][2]==' ')&&board[i][0]!=' ')
        {
            board[i][2] ='D';
            return 1;
        }
        if((board[i][0]==board[i][2])&&(board[i][1]==' ')&&board[i][2]!=' ')
        {
            board[i][1] ='D';
            return 1;
        }
        if((board[i][2]==board[i][1])&&(board[i][0]==' ')&&board[i][1]!=' ')
        {
            board[i][0] ='D';
            return 1;
        }
    }
    for(i = 0;i < col;i++) //判断每一列上是否有两个相同的棋子
    {
        if((board[0][i]==board[1][i])&&(board[2][i]==' ')&&board[0][i]!=' ')
        {
            board[2][i] ='D';
            return 1;
        }
        if((board[0][i]==board[2][i])&&(board[1][i]==' ')&&board[2][i]!=' ')
        {
            board[1][i] ='D';
            return 1;
        }
        if((board[2][i]==board[1][i])&&(board[0][i]==' ')&&board[1][i]!=' ')
        {
            board[0][i] ='D';
            return 1;
        }
    }
    //判断主对角线上是否有两个相同的棋子
    if((board[0][0]==board[1][1])&&(board[2][2]==' ')&&(board[0][0]!=' ')) 
        {
            board[2][2]='D';
            return 1;
            
        }
    if((board[2][2]==board[1][1])&&(board[0][0]==' ')&&(board[1][1]!=' ')) //做对角线
        {
            board[0][0]='D';
            return 1;
            
        }
    if((board[0][0]==board[2][2])&&(board[1][1]==' ')&&(board[2][2]!=' ')) //做对角线
        {
            board[1][1]='D';
            return 1;
        }
    //判断副对角线上是否有两个相同的棋子
    if((board[0][2]==board[2][0])&&(board[1][1]==' ')&&(board[0][2]!=' ')) 
        {
            board[1][1]='D';
            return 1;
        }
    if((board[0][2]==board[1][1])&&(board[2][0]==' ')&&(board[1][1]!=' ')) //做对角线
        {
            board[2][0]='D';
            return 1;
        }
    if((board[2][0]==board[2][2])&&(board[0][2]==' ')&&(board[2][2]!=' ')) //做对角线
        {
            board[0][2]='D';
            return 1;
        }
    return 0;
}
void PlayerMove(char board[ROW][COL],int row,int col)
{
    int x = 0;
    int y = 0;
    while(1)
    {
        printf("请输入->(x,y)");
        fflush(stdin);
        scanf("%d,%d",&x,&y);
        if(x>=1 && x<=3 && y>=1 && y<=3)
        {
            if(board[x-1][y-1] == ' ')
            {
                
                board[x-1][y-1] = '*';
                break;
            
            }
            else 
            {
                printf("坐标被占,请重新输入\n");
                continue;
            }

        }
        else
        {
            printf("输入坐标不在棋盘内\n");
            continue;
        }
    }    
}

void CompeterStartMove(char board[ROW][COL],int row,int col,int input2)
{
    char ret;
    InitBoard(board,row,col);//初始化
    DisplayBoard(board,row,col);//打印棋盘
    do
    {
        CompeterSelect(board,row,col,input2);//电脑走
        DisplayBoard(board,row,col);//打印棋盘
        ret = Iswin(board,row,col);//判断是否赢了
        if(ret != '#')
        {
            break;
        }
        PlayerMove(board,row,col);//玩家走
        DisplayBoard(board,row,col);
        ret = Iswin(board,row,col);
        if(ret != '#')
        {
            break;
        }
    }while(ret == '#');
    if(ret == 'D')
    {
        printf("你真弱,电脑赢了,好好练练吧\n");
    }
    else if(ret == '*')
    {
        printf("恭喜你,赢了\n");
    }
    else if(ret == 'q')
    {
        printf("平局\n");
    
    }
}

void PlayerStartMove(char board[ROW][COL],int row,int col,int input2)
{
    char ret = 0;
    InitBoard(board,row,col);
    DisplayBoard(board,row,col);
    while(1)
    {
        PlayerMove(board,row,col);
        DisplayBoard(board,row,col);
        ret = Iswin(board,row,col);
        {
            if(ret != '#')
            {
                break;
            }
        }
        CompeterSelect(board,row,col,input2);
        DisplayBoard(board,row,col);
        ret = Iswin(board,row,col);
        {
            if(ret != '#')
            {
                break;
            }
        }
    }
    if('*'==ret)
    {
        printf("恭喜你,赢了\n");
    }
    else if('D' == ret)
    {
        printf("你真弱,电脑赢了,好好练练吧\n");
    }
    else if('q'== ret)
    {
        printf("平局\n");
    }

}

void CompeterSelect(char board[ROW][COL],int row,int col,int input2)//选择电脑简单还是困难模式
{
    int ret=0;
    printf("电脑走\n");
    if(Easy == input2)
    {
        CompeterEasy(board,row,col);
    }
    if(Diff == input2)
    {    
        ret = CompeterDiff(board,row,col);
        if(0 == ret) //电脑无法给出最优位置,则随机给值
        {
            CompeterEasy(board,row,col);    
        }
    }
    
}


test.c中放的是main函数以及菜单的打印和调用game.c中功能的函数
#define  _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu1()
{
    printf("******************************\n");
    printf("****  欢迎来到三子棋游戏  ****\n");
    printf("****   1.玩游戏  0.退出   ****\n");
    printf("******************************\n");
}
void menu2()
{
    printf("*****************************\n");
    printf("****     1.简单模式      ****\n");
    printf("****     2.困难模式      ****\n");
    printf("*****************************\n");

}

void menu3()
{
    printf("******************************\n");
    printf("****      1.玩家先走      ****\n");
    printf("****      2.电脑先走      ****\n");
    printf("******************************\n");

}

void game()
{
    int input2 = 0;
    int input3 = 0;
    char  board[ROW][COL]= {0};
    menu2();
    fflush(stdin);
    printf("请选择模式\n");
    scanf("%d",&input2);
    system("cls");
    menu3();
    fflush(stdin);
    printf("请选择谁先手\n");
    scanf("%d",&input3);
    switch(input3)
    {
    case 1:
        PlayerStartMove(board,ROW,COL,input2);
        break;
    case 2:
        CompeterStartMove(board,ROW,COL,input2);
        break;
    default:
        printf("输入错误,请重新输入\n");
        break;
    }
}
void test()
{
    int input1 = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu1();
        printf("请输入:");
        fflush(stdin);
        scanf("%d",&input1);
        system("cls");
        switch(input1)
        {
        case 0:
            exit(0);
            break;
        case 1:
            game();
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    }while(input1);
}
int main()
{

    test();
    system("pause");
    return 0;

}


在编写这个程序时我出现的问题有:
 1.每行相等时==写成了=,这样判断值一直有问题;
 2.在返回return 'q '   时,我多给q后面打了一个空格,然后就会出现逻辑错误;
 ret = Iswin(board,ROW,COL);
 { 
    if(re t!= '  ' )     // 这里就会接收' ',而不是q,所以当我棋满是就会卡死   
    {  
        break;  
    }
 } 

3.每次打印棋盘都是要判断是否有人获胜 
4.在你编写游戏时,你要一步一步编写,一个功能实现后再加另一个功能,有错误了慢慢调试
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值