用C++写的五子棋 [转]

这是一个使用C++编写的五子棋游戏程序,包括棋盘显示、玩家输入、胜负判断等功能。玩家通过键盘控制棋子位置,当一方的棋子连成五子线时,游戏结束并显示胜者。程序提供了游戏说明和重置棋盘的选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用C++写的五子棋 [转]

 

#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
void chessboard(int name[N][N],int *,int *,int *);//棋盘,和下子
int win(int name[N][N],int *,int *);//判断胜负
int output(int count[8],int win);//输入胜负
void explain();//游戏说明
void reset(int name[N][N],int *,int *,int *);//重置棋盘

void main()
{
int name[N][N]={0},a=N/2,b=N/2,player,t,j;
do
{
  printf("1.开始游戏-------------------------2.游戏说明-------------------------0.结束游戏");
  scanf("%d",&t);
  switch(t)
  {
  case 1:
   system("cls");
   printf("********************************************************************************");
   printf("1.先手白棋/n2.先手黑棋/n");
   scanf("%d",&player);
   do
   {
   system("cls");
   chessboard(name,&a,&b,&player);
   }while(win(name,&a,&b));
   reset(name,&a,&b,&player);
   break;
  case 2:
   explain();
   break;
  case 0:
   printf("谢谢使用,欢迎下次光临");
   fflush(stdin);
         j=getch();
   break;
  }
system("cls");
}while(t);
}
void chessboard(int name[N][N],int *a,int *b,int *player)
{
int i,j;
for (i=0;i<N;i++)
{
  for(j=0;j<N;j++)
  {
   if(*a==i && *b==j)
    {
     printf("□");
    }
    else if(name[i][j]==0)
    {
        printf("╋");
    }
    else if(name[i][j]==1)
    {
     printf("●");
    }
    else
    {
     printf("○");
    }
  }
  printf("/n");
}
fflush(stdin);
    int input=getch();
    switch(input)
{
case 'w':
  if(*a>0)
  {
  (*a)--;
  }
  break;
case 's':
  if(*a<N-1)
  {
  (*a)++;
  }
  break;
  
case 'a':
  if(*b>0)
  {
         (*b)--;
  }
  break;
  
case 'd':
  if(*b<N-1)
  {
  (*b)++;
  }
  break;
case ' ':
     if(name[*a][*b]==0)
  {
   *player=*player==1?2:1;
   name[*a][*b]=*player;  
  }else
  {
   printf("此处有子!/n");
   printf("按任意键继续");
      fflush(stdin);
      j=getch();
  }
  break;
}
}
//判断胜负
int win(int name[N][N],int *a,int *b)
{
int i,j,count[8]={0},k,win;
//判断行是否5个
for(j=0;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i][j+k]==1)
   {
            count[0]++;
   }
            if(name[i][j+k]==2)
   {
            count[1]++;
   }
   }
   win=output(count,win);
    }
}
//判断列是否5个
for(j=0;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i+k][j]==1)
   {
            count[2]++;
   }
            if(name[i+k][j]==2)
   {
            count[3]++;
   }
   }
   win=output(count,win);
    }
}
//判断左到右斜方向是否有5个
for(j=0;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i+k][j+k]==1)
   {
            count[4]++;
   }
            if(name[i+k][j+k]==2)
   {
            count[5]++;
   }
   }
   win=output(count,win);
    }
}
//判断右到左斜方向是否有5个
for(j=1;j<N;j++)
{
       for(i=0;i<N;i++)
    {
         for(k=0;k<5;k++)
   {
            if(name[i+k][j-k]==1)
   {
            count[6]++;
   }
            if(name[i+k][j-k]==2)
   {
            count[7]++;
   }
   }
   win=output(count,win);
    }
}
return win;
}
//输出胜负
int output(int count[8],int win)
{
int i,j;
  if(count[0]==5 || count[2]==5 || count[4]==5 || count[6]==5)
{
   win=0;
   printf("白纸赢了/n");
   printf("按任意键回到主菜单");
   fflush(stdin);
   j=getch();
}
    if(count[1]==5 || count[3]==5 || count[5]==5 || count[7]==5)
{
     printf("黑子赢了/n");
        win=0;
   printf("按任意键回到主菜单");
   fflush(stdin);
   j=getch();
}
for(i=0;i<8;i++)
{
       count[i]=0;
}
return win;
}
//游戏说明
void explain()
{
int j;
printf("************************************游戏说明************************************");
printf("/n1.按w向上移动光标/n2.按s向下移动光标/n3.按a向左移动光标/n4.按d向右移动光标/n5.按空格放子/n/n/n/n");  
    printf("胜负条件:只要一方横竖斜连续达到5个,方可获胜!/n/n/n");
printf("按任意键回到主菜单/n/n/n");
fflush(stdin);
j=getch();
}
//重置棋盘
void reset(int name[N][N],int *a,int *b,int *player)
{
int i,j;
for (i=0;i<N;i++)
{
  for(j=0;j<N;j++)
  {
         name[i][j]=0;
  }
}
*a=N/2;
*b=N/2;
*player=1;
}

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值