C语言实现双人五子棋

 //一个可以实现5~9棋盘格局的双人五子棋小游戏,

//新增了可以输入姓名,更改棋盘大小,当然,你想改6子棋,可以直接在开头的define里改N的值

//输入两个数字分别对应:行、列。(从1行1列开始,不包括0行!!!)

//代码如下

 

#include <stdio.h>
#define N 5

int main()
{
    printf("********欢迎使用五子棋小程序********\n"); //下棋姓名 
    char n[2][20]; 
    int i,j;//临时变量 
    for(i=0;i<2;i++)
    {
            printf("请输入第%d位选手姓名:",i+1);
            scanf("%s",*(n+i));    
            printf("\n%s 做好准备!\n",*(n+i));    //两位选手    
    }
    
    int size();//棋盘长度 
    int xyz(int size,char thexy[size][size]);//输出棋盘程序 
    int winCol(int size,char thexy[size][size]);//判断胜利 
    int size_m= size();//输出棋盘长宽表面文章 
    
    const int sizeN=size_m;
    char thexy[sizeN][sizeN]; //棋盘储存 


    for(i=0;i<size_m;i++)//把xy格填满* 
    {
        for(j=0;j<size_m;j++)
        {
            *(*(thexy+i)+j)='*';//thexy[i][j];
        }
    }
    
    xyz(size_m,thexy);//定义并输出棋盘格局 
    
    printf("\n开始下棋!\n"); 
    
    i=0;//1,2号玩家 
    int star=1;//裁判程序 
    int xy_s;//玩家输入 
    int x,y;//长宽 
    int win=0;//胜利条件 
    do//下棋程序 
    {
        printf("\n%s玩家开始下棋\n",*(n+i));
         
        if(i==0)
        printf("你的棋子是“o”\n"); 
        if(i==1)
        printf("你的棋子是“x”\n");
        
        printf("你下的棋子为(两位数):");
        
        scanf("%d",&xy_s);//记录xy坐标 
        
        x= (xy_s/10)-1;//x坐标 
        y= (xy_s%10)-1;//y坐标 
        
        if(i==0) 
        {
            if(thexy[x][y]=='*')//判断能否下棋 
            thexy[x][y]='o';//下棋程序 o
            else
            {
                printf("请勿重复下棋\n"); 
                continue;
            }
        }
        else if(i==1) 
        {
            if(thexy[x][y]=='*')//判断能否下棋 
            thexy[x][y]='x';//下棋程序 x
            else
            {
                printf("请勿重复下棋\n"); 
                continue;
            } 
        }
        
             win=winCol(size_m,thexy);//进行胜负判断    
            xyz(size_m,thexy);//输出棋盘格局  
            
        if(win==1)//胜利判断 
        {
            printf("\n|---------------%s玩家获胜---------------|\n",*(n+0));
        }
        
        else if(win==2)//胜利判断 
        {
            printf("\n|---------------%s玩家获胜---------------|\n",*(n+1));
        }
        if(win!=0)//
        {
            printf("\n开始下一局吗?(1 or 0)\n"); 
            scanf("%d",&star);
            
            if(star==1)//继续游戏 
            {
                win =0;
                int q,w;
                for(q=0;q<size_m;q++)//把xy格填满* 
                {
                    for(w=0;w<size_m;w++)
                    {
                      *(*(thexy+q)+w)='*';//thexy[i][j];
                    }
                }
                    xyz(size_m,thexy);//输出棋盘格局  
            }
        }
        
        i++;
        if(i==2)i=0;//使i循环,轮到下一位下棋
        
    }while(star!=0);
    printf("\n_______________感谢你玩我的游戏!_______________\n"); 
}

int size()//棋盘长度 
{
    int size;
    do{
        printf("请输入棋盘格局(需要输入一个大于%d的数字):",N-1); 
        scanf("%d",&size);//自定义棋盘长宽 
        if(size<N)
          {
        printf("\n输入有误\n");
        }
    }while(size<N);
    
    
    printf("\n棋盘格局为:%d*%d\n",size,size);
    return size;
}

int xyz(int size,char thexy[size][size])//输出棋盘程序 
{
    int i,j;
    printf("  ");
    for(i=1;i<=size;i++)
    {
        printf("%d ",i); // 1~size长度 
    }
    printf("\n"); 
    for(i=0;i<size;i++)
    {
    for(j=0;j<size;j++)
    {
        if(j==0)
        printf("%d ",i+1);
        printf("%c ",thexy[i][j]);//输出xy的棋盘 
    }
        printf("\n");
    }
    
}

int winCol(int size,char thexy[size][size])//判断胜利条件 
{
int i,j;//行,列 
int x1,o1; 
for(i=0;i<size;i++)//行检测 
{
    x1=0;
    o1=0;
    for(j=0;j<size;j++)
    {
    if(thexy[i][j]=='x')
    {
        o1=0;
        x1=x1+1;
    }
    else if(thexy[i][j]=='o')
    {
        x1=0;
        o1=o1+1;
    }
    else if(thexy[i][j]=='*')
    {
        x1=0;
        o1=0;
    }
    if(x1==N)
    return 2;
    if(o1==N)
    return 1;    
    }
}

for(i=0;i<size;i++)//列检测 
{
    x1=0;
    o1=0;
    for(j=0;j<size;j++)
    {
    if(thexy[j][i]=='x')
    {
        o1=0;
        x1=x1+1;
    }
    else if(thexy[j][i]=='o')
    {
        x1=0;
        o1=o1+1;
    }
    else if(thexy[j][i]=='*')
    {
        x1=0;
        o1=0;
    }
    if(x1==N)
    return 2;
    if(o1==N)
    return 1;    
    }
}

for(i=4;i<size;i++)//斜线 / 上检测 
{
    x1=0;
    o1=0;
    for(j=0;j<=i;j++)
    {
        if(thexy[i-j][j]=='x')
    {
        o1=0;
        x1=x1+1;
    }
    else if(thexy[i-j][j]=='o')
    {
        x1=0;
        o1=o1+1;
    }
    else if(thexy[i-j][j]=='*')
    {
        x1=0;
        o1=0;
    }
    if(x1==N)
    return 2;
    if(o1==N)
    return 1;
    }
}

for(j=0;j<=size-5;j++)//斜线 \ 上检测 
{
    x1=0;
    o1=0;
    for(i=0;i<=size-j;i++)
    {
        if(thexy[i][j+i]=='x')
    {
        o1=0;
        x1=x1+1;
    }
    else if(thexy[i][j+i]=='o')
    {
        x1=0;
        o1=o1+1;
    }
    else if(thexy[i][j+i]=='*')
    {
        x1=0;
        o1=0;
    }
    if(x1==N)
    return 2;
    if(o1==N)
    return 1;
    }
}

int xi=0;//下检测的加数 
for(j=1;j<=size-5;j++)//斜线 / 下检测  
{
    x1=0;
    o1=0;
    xi=0;
    for(i=size-1;i>=j;i--,xi++)
    {
        if(thexy[i][j+xi]=='x')
    {
        o1=0;
        x1=x1+1;
    }
    else if(thexy[i][j+xi]=='o')
    {
        x1=0;
        o1=o1+1;
    }
    else if(thexy[i][j+xi]=='*')
    {
        
        x1=0;
        o1=0;
    }
    if(x1==N)
    return 2;
    if(o1==N)
    return 1;
    }
}

for(i=size-5;i>0;i--)//斜线 \ 下检测 
{
    x1=0;
    o1=0;
    xi=0;
    for(j=0;j<=size-i;j++,xi++)
    {
        if(thexy[i+xi][j]=='x')
    {
        o1=0;
        x1=x1+1;
    }
    else if(thexy[i+xi][j]=='o')
    {
        x1=0;
        o1=o1+1;
    }
    else if(thexy[i+xi][j]=='*')
    {
        x1=0;
        o1=0;
    }
    if(x1==N)
    return 2;
    if(o1==N)
    return 1;
    }
}
return 0;
}

题目:五子棋对弈 对弈规则如下: 主要功能是实现两人之间的对弈,在画好的棋盘上,两个玩家轮流选择自己的落子坐标,然后由五子棋系统自动识别判断游戏的进展,知道一方的五子连成一条线或者棋盘已经无法落子时游戏结束。 选定五子棋的棋盘大小为19*19,玩家可以在这个棋盘上选择落子坐标位置,通过在棋盘上显示不同的符号来代替不同玩家所下的棋子,“o”代表A玩家,“*”代表B玩家。玩家每次落子之后游戏系统都会对落子位置进行检查,如果落子坐标输入有错应提示错误,并要求玩家继续输入。 当出现同一玩家五子连成一线时,无论是行、列或是对角线的五子连线,都表示玩家游戏胜利,退出游戏 任务:编程实现以下功能 1. 欢迎主界面 提示玩家选择游戏开始,结束,设置悔棋次数等。 2. 绘制棋盘 该模块要求的功能是实现棋盘的显示及棋子的显示,,“o”代表A玩家,“*”代表B玩家。在每次下棋后要对棋盘进行刷新,将棋盘的状态变化为当前最新状态,然后等待另一个玩家下棋。 3. 玩家交替下棋 玩家能在棋盘上下棋,玩家每次选择好下棋的行和列坐标,并在该位置落子。 要求:a.提示当前玩家输入落子坐标 b.能判断用户输入的坐标是否正确(坐标超出范围或该处已有棋子) 4. 悔棋功能 玩家选择悔棋后刷新棋盘,删除前一次的落子,悔棋次数有限制。 5. 输赢判断 判断输赢模块的作用是每次玩家落子后判断是否已分出胜负,如果是,则返回胜利者相关信息。 6. 设计丰富的用户界面,方便用户操作 设计要求: ① 根据以上功能需求,自己定义合适的数据结构,并说明原因; ② 每个功能能提供友好的用户界面,方便用户操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值