五子棋游戏纯C实现

首先这是一个用c语言实现的五子棋游戏,实现手法简单,算法思想简单,只用到了一些基础的C的知识。

一:画出界面

首先现在界面上画出棋盘的样子,利用自定义函数 draw_lline()画出我们的所要使用到的棋盘的样子,控制好间隔,距离坐标,颜色等因素即可。

二:定义棋盘棋子状态

定义一个 全局的数组 a[ROW][COL]用来表示棋盘所有的空格状态,没有棋子为0,有黑子或者白子为1或者2,根据玩家的输入将相应 的位置更改为相应的状态。

三:画出带棋子的棋盘

使用自定义函数drow_qizi()判断棋盘上各个格子的状态,并将相应的状态显示在棋盘上,利用前景背景的不同颜色显示白子黑子与空棋盘的各种状态。

四:判断输赢

每当用户落下一子都去判断该子周围的横向纵向,竖向斜向等各个方向是否有五颗棋子相同,如果存在就结束游戏,宣布胜利。

 

================================================================================================

#include <stdio.h>

//棋盘的规格

#define ROW 20
#define COL 30

#define LTOPX 3//起始坐標x
#define LTOPY 3//起始坐標y

//一组颜色的定义

enum {
    BLACK,RED,GREEN,YELLOW,BLUE,PURPLE,DEEPGREEN,WHITE
};
int a[ROW][COL]={0};

/*设置字符的前景色*/
void set_front_col(int n)
{
    printf("\033[3%dm", n);
}

/*设置字符的背景色*/

void set_hou_col(int n)
{
    printf("\033[4%dm", n);
}


/*设置光标的x,y坐标*/
void set_xy_pos(int x, int y)
{
    printf("\033[%d;%dH", y, x);
}

/*从光标位置x,y处从左向右画由字符c组成的水平线,线长为len*/
void draw_hline(int x, int y, int len, char c)
{
    int i;

    for (i = 0; i < len; i++) {
        set_xy_pos(x+i, y);    
        printf("%c", c);
    }
}

/*从光标位置x,y处从上向下画由字符c组成的垂直线,线长为len*/
void draw_lline(int x, int y, int len, char c)
{
    int i;

    for (i = 0; i < len; i++) {
        set_xy_pos(x, y+i);    
        printf("%c", c);
    }
}

void Wether_Success(int x,int y);//判断横向与竖向是否成功
void Wether_Success1(int x,int y);//判断斜边是否成功

void shuru(int m)///輸入棋子坐標
{
    int x,y;
    set_xy_pos(COL*3+4, 4);    
    if(m==2)
    printf("請輸入要下白棋子的坐標:");
    else
    printf("請輸入要下黑棋子的坐標:");
    scanf("%d %d",&x,&y);
    
        if((x<0)||(x>=COL)||(y<0)||(y>=ROW))
        {
            set_xy_pos(COL*3+4, ROW*2);    
            printf("輸入坐標錯誤,請重新輸入!");
            shuru(m);
        }else
        {
            if(a[x][y]==0)
            {
                a[x][y]=m;

         Wether_Success(x,y);
         Wether_Success1(x,y);
            }
            else
            {
            set_xy_pos(COL*3+4, ROW*2);    
            printf("輸入重復,請重新輸入!");
            shuru(m);    
            }
        }
}

//画出棋子

void drow_qizi()
{
    int i,j;
    for (i = 0; i < COL+1; i++) //畫出數組中的棋子
    for (j = 0; j <ROW+1; j++) 
    {
        if(a[i][j]==1)
        {
        set_hou_col(BLACK);
        set_xy_pos(i*3+4, j*2+4);    
        printf("%c", '[');
        set_xy_pos(i*3+5, j*2+4);    
        printf("%c", ']');
        }
        if(a[i][j]==2)
        {
        set_hou_col(WHITE);
        set_xy_pos(i*3+4, j*2+4);    
        printf("%c", '[');
        set_xy_pos(i*3+5, j*2+4);    
        printf("%c", ']');
        }
    }

}

//画出棋盘

void DROW_qipan()
{
    int i,j;
    set_front_col(RED);
    set_hou_col(BLUE);
    for (i = 0; i < ROW+1; i++) {//畫出行線與數字標號
        if(i!=20)
        {
            set_xy_pos(LTOPX-2, LTOPY+2*i+1);    
            printf("%d", i);
        }
        draw_hline(LTOPX, LTOPY+2*i, 3*COL+1, '-');            
    }
    for (i = 0; i <COL+1; i++) {//畫出類線與數字標號
        if(i!=30)
        {
            set_xy_pos(LTOPX+3*i+1, LTOPY-2);    
            printf("%d", i);
        }
        draw_lline(LTOPX+3*i,LTOPY,2*ROW+1 , '|');
    }
}

void DROW()
{
    system("clear");
    DROW_qipan();//畫出棋盤
    drow_qizi();//畫出棋子
}

//判斷橫向戍向是否成功
void Wether_Success(int x,int y)
{
    int i=1,n;
    for(n=1;n<=4;n++)
    {    if((y+n)<COL){
        if(a[x][y+n]==a[x][y])
        {
        i++;
        }
        else
        {
            for(n=1;n<=4;n++)
                {
                if((y-n)>=0)
                {
                    if(a[x][y-n]==a[x][y])
                    {
                    i++;
                    }else
                    {
                        n=5;
                    }
                }
                }
        }
    }
    }
    if(i>=5)
    {
            DROW();
            set_xy_pos(COL*3+4, ROW*2);    
            printf("sucess!\n");
            exit(0);
    }
    for(i=1,n=1;n<=4;n++)
    {
    if((x+n)<ROW){
        if(a[x+n][y]==a[x][y])
        {
        i++;
        }
        else
        {
            for(n=1;n<=4;n++)
                {
                if(x-n>=0){
                    if(a[x-n][y]==a[x][y])
                    {
                    i++;
                    }else
                    {
                        n=5;
                    }
                }

                }        
        }
    }
    }
    if(i>=5)
    {
            DROW();
            set_xy_pos(COL*3+4, ROW*2);    
            printf("sucess!\n");
            exit(0);
    }
}


void Wether_Success1(int x,int y)//判斷斜向是否成功
{
    int i=1,n;
    for(n=1;n<=4;n++)
    {    if((y+n)<COL&&(x+n<ROW)){
        if(a[x+n][y+n]==a[x][y])
        {
        i++;
        }
        else
        {
            for(n=1;n<=4;n++)
                {
                if((y-n)>=0&&(x-n>=0))
                {
                    if(a[x-n][y-n]==a[x][y])
                    {
                    i++;
                    }else
                    {
                        n=5;
                    }
                }
                }
        }
    }
    }
    if(i>=5)
    {
            DROW();
            set_xy_pos(COL*3+4, ROW*2);    
            printf("sucess!\n");
            exit(0);
    }
    for(i=1,n=1;n<=4;n++)
    {
    if((x+n)<ROW&&(y-n)>=0){
        if(a[x+n][y-n]==a[x][y])
        {
        i++;
        }
        else
        {
            for(n=1;n<=4;n++)
                {
                if(x-n>=0&&(y+n)<COL){
                    if(a[x-n][y+n]==a[x][y])
                    {
                    i++;
                    }else
                    {
                        n=5;
                    }
                }

                }        
        }
    }
    }
    if(i>=5)
    {
            DROW();
            set_xy_pos(COL*3+4, ROW*2);    
            printf("sucess!\n");
            exit(0);
    }
}

int main(void)
{
int i=1;
while(1)
    {
    DROW();
    set_hou_col(BLUE);
    shuru(i);
    if(i==1)i=2;
    else    i=1;
    }
    return 0;
}

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值