下C语言做的五子棋,20年没输过

很多时候,心里明明不是那样想的,却控制不了自己而说出相反的话。

嗨,这里是狐狸~~

今天是2021年的12月16日,今天不知为啥充满了圣诞节的氛围,明明距离圣诞节还有一段时间,不知道大家有没有这种感觉,但有一说一,这快到圣诞节,你们想好对圣诞老人许下什么愿望了嘛,过几天我看有没有时间出一期圣诞特辑,教大家用代码来过圣诞节。

扯得有点远了,回归正题,前几天发了有关数据结构的两个实验,反响并不是很好,是因为大家觉得太难,还是有其他原因呢,希望大家可以尽早告知,好叭,今天整点简单的,我们来写个游戏项目——《五子棋》。

项目简介

五子棋的棋具与围棋通用,是一种传统的棋种,有两种玩法。

一种是双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。还有一种是自己形成五子连线就替换对方任意一枚棋子。被替换的棋子可以和对方交换棋子。最后以先出完所有棋子的一方为胜。

五子棋容易上手,老少皆宜,而且趣味横生,引人入胜:它不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

我们今天来完成第一种玩法,让我们一起来实现它。

游戏规则

(1)对局双方各执一色棋子。

(2)空棋盘开局。

(3)黑先、白后,交替下子,每次只能下一子。

(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落            别处。

(5)黑方的第一枚棋子必须下在天元点上,即中心交叉点

(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)。

五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

项目思路

1、绘制棋盘  void drawqp(void)

2、定义棋子的结构体 struct Sor、

3、游戏初始化   void init(void)

4、判断输赢    void win(void)

5、游戏更新  void gameplay(void)

6、游戏结束 void gameover(void)

项目代码

1、结构体

struct Sor
{
     int x;
     int y;/*x,y表示当前光标的位置*/
     int yes[N][N];/* 0表示无棋子,1表示白色棋子,2表示黑色棋子*/
     int kao;/* 1表示白棋准备落子,2表示黑棋落子*/
     int ok;/*1表示白棋胜出,2表示黑棋胜出*/
}sor;

2、初始化

void init(void)   
{
     int driver=DETECT,mode=0;
     registerbgidriver(EGAVGA_driver);
     initgraph(&driver,&mode,"");
}

3、绘画函数

void drawqp(void)/*画棋盘*/
{
     setcolor(3);
     for(i=50;i<=(N-1)*20+30;i+=20)
     {
          line(50,i,(N-1)*20+30,i);
          line(i,50,i,(N-1)*20+30);
     }
     setcolor(11);
     for(i=1;i<3;i++)
     {
          circle((N-1)*10+40,(N-1)*10+40,i);
          circle(130,130,i);
          circle(130,330,i);
          circle(330,130,i);
          circle(330,330,i);
     }
}

4、光标位置

void place(void)/*画出光标的位置*/
{
     line(sor.x-10,sor.y-10,sor.x-7,sor.y-10);
     line(sor.x-10,sor.y-10,sor.x-10,sor.y-7);

     line(sor.x-10,sor.y+10,sor.x-10,sor.y+7);
     line(sor.x-10,sor.y+10,sor.x-7,sor.y+10);

     line(sor.x+10,sor.y-10,sor.x+10,sor.y-7);
     line(sor.x+10,sor.y-10,sor.x+7,sor.y-10);

     line(sor.x+10,sor.y+10,sor.x+7,sor.y+10);
     line(sor.x+10,sor.y+10,sor.x+10,sor.y+7);

 }

5、输赢判断

void win(void)/*判断是否胜出*/
{
     for(i=1;i<N;i++)
     {
          for(j=1;j<N;j++)
          {
               if(((j+4)<N&&sor.yes[i][j]!=0&&
                    sor.yes[i][j]==sor.yes[i][j+1]&&
                    sor.yes[i][j+1]==sor.yes[i][j+2]&&
                    sor.yes[i][j+2]==sor.yes[i][j+3]&&
                    sor.yes[i][j+3]==sor.yes[i][j+4])||

                    ((i+4)<N&&sor.yes[i][j]!=0&&
                    sor.yes[i][j]==sor.yes[i+1][j]&&
                    sor.yes[i+1][j]==sor.yes[i+2][j]&&
                    sor.yes[i+2][j]==sor.yes[i+3][j]&&
                    sor.yes[i+3][j]==sor.yes[i+4][j])||

                    ((i+4)<N&&(j+4)<N&&sor.yes[i][j]!=0&&
                    sor.yes[i][j]==sor.yes[i+1][j+1]&&
                    sor.yes[i+1][j+1]==sor.yes[i+2][j+2]&&
                    sor.yes[i+2][j+2]==sor.yes[i+3][j+3]&&
                    sor.yes[i+3][j+3]==sor.yes[i+4][j+4])||

                    ((i+4)<N&&j>4&&sor.yes[i][j]!=0&&
                    sor.yes[i][j]==sor.yes[i+1][j-1]&&
                    sor.yes[i+1][j-1]==sor.yes[i+2][j-2]&&
                    sor.yes[i+2][j-2]==sor.yes[i+3][j-3]&&
                    sor.yes[i+3][j-3]==sor.yes[i+4][j-4]))
               {
                    if(sor.yes[i][j]==1)
                         sor.ok=1;
                    else
                         sor.ok=2;
                         break;
               }
          }
          if(sor.ok!=0)
               break;
     }
}

6、游戏结束

void gameover(void)
{
     if(sor.ok==1)
     {
          drawmat(bai64H,64,488,119,0);
          drawmat(bai64H,64,490,120,4);
     }
     else
     {
          drawmat(hong64H,64,488,119,0);
          drawmat(hong64H,64,490,120,4);
     }

     drawmat(fang64H,64,488,189,0);
     drawmat(huo64H,64,488,259,0);
     drawmat(sheng64H,64,488,329,0);

     drawmat(fang64H,64,490,190,4);
     drawmat(huo64H,64,490,260,4);
     drawmat(sheng64H,64,490,330,4);
}

7、游戏更新

void gameplay(void)
{
     for(i=1;i<N;i++)/*棋盘初始化*/
          for(j=1;j<N;j++)
               sor.yes[i][j]=0;
     sor.kao=1; /*白棋先走*/
     sor.ok=0;/*双方胜负未分*/
     sor.x=(N-1)*10+40;
     sor.y=(N-1)*10+40;/*初始化光标,将光标定位在棋盘的中心*/
     setcolor(15);
     place();

     while(1)
     {
          xandy();
          key=bioskey(0);
          if(key==esc)
               break;

          /*白棋键盘移动*/
          else if(key==up&&sor.y>50&&sor.kao==1)
          {
               setcolor(0);place();
               sor.y-=20;
          }
          else if(key==down&&sor.y<(N-1)*20+30&&sor.kao==1)
          {
               setcolor(0);place();
               sor.y+=20;
          }
          else if(key==left&&sor.x>50&&sor.kao==1)
          {
               setcolor(0);place();
               sor.x-=20;
          }
          else if(key==right&&sor.x<(N-1)*20+30&&sor.kao==1)
          {
               setcolor(0);place();
               sor.x+=20;
          }

          /*红方键盘移动*/
          else if(key==W&&sor.y>50&&sor.kao==2)
          {
               setcolor(0);place();
               sor.y-=20;
          }
          else if(key==S&&sor.y<(N-1)*20+30&&sor.kao==2)
          {
               setcolor(0);place();
               sor.y+=20;
          }
          else if(key==A&&sor.x>50&&sor.kao==2)
          {
               setcolor(0);place();
               sor.x-=20;
          }
          else if(key==D&&sor.x<(N-1)*20+30&&sor.kao==2)
          {
               setcolor(0);place();
               sor.x+=20;
          }
          else if(key==space&&sor.yes[(sor.x-30)/20][(sor.y-30)/20]==0&&sor.kao==2)
          {
               setcolor(13);
               for(i=1;i<=9;i++)
               {
                    circle(sor.x,sor.y,i);
                    delay(10000);
               }
               sor.yes[(sor.x-30)/20][(sor.y-30)/20]=2;
               sor.kao=1;
               win();
               if(sor.ok!=0)
               {
                    gameover();
                    break;
               }
          }
          else if(key==enter&&sor.yes[(sor.x-30)/20][(sor.y-30)/20]==0&&sor.kao==1)
          {
               setcolor(15);
               for(i=1;i<=9;i++)
               {
                    circle(sor.x,sor.y,i);
                    delay(10000);
               }
               sor.yes[(sor.x-30)/20][(sor.y-30)/20]=1;
               sor.kao=2;
               win();
               if(sor.ok!=0)
               {
                    gameover();
                    break;
               }
          }
          else
               continue;
          if(sor.ok!=0)
               break;
          if(sor.kao==1)
               setcolor(15);
          else
               setcolor(13);
          place();
     }/*endwhile(1)*/
}

8、主函数

main()
{
     while(1)
     {
          init();
          cleardevice();
          clew();
          drawqp();
          setfillstyle(SOLID_FILL,7);
          bar(430,50,620,410);
          show();
          gameplay();
          setcolor(15);
          settextstyle(0,0,2);
          outtextxy(230,450,"CONTINUE(Y/N)?");
          while(1)
          {
               key=bioskey(0);
               if(key==Y||key==n||key==esc)
                    break;
          }
          if(key==n||key==esc)
               break;
     }
     closegraph();
}

效果演示

总结

这个项目难度还是有一些的,大家也知道只要有关棋类的都会包含点算法进去,这里面也是有一些关于算法的知识,不知道大家看完后有没有完全理解,不能理解的欢迎在评论区一起讨论,我会尽我所能的去回复大家。

好了,大家还想看什么一定要在评论区告诉我,后续我还会发布更多的项目源或者学习资料,希望大家可以持续关注,有什么问题可以回帖留言。想要C/C++学习资料以及其他项目的源码的可以加群【1083227756】了解。想要对程序员的未来发展有兴趣的可以关注微信公众号:【狐狸的编码时光】,希望和大家一起学习进步!!!

另外还有

视频讲解

https://www.bilibili.com/video/BV1aF411z75g/https://www.bilibili.com/video/BV1aF411z75g/icon-default.png?t=LA92https://www.bilibili.com/video/BV1aF411z75g/

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>