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

嗨,这里是狐狸~~

今天是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;elsesor.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;}}elsecontinue;if(sor.ok!=0)break;if(sor.kao==1)setcolor(15);elsesetcolor(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/https://www.bilibili.com/video/BV1aF411z75g/

下C语言做的五子棋,20年没输过相关推荐

  1. 用c语言做一个五子棋程序,C语言制作简单五子棋游戏

    原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...

  2. vc6.0c语言五子棋程序,哪位大虾可以给我个VC6.0下用C语言编的五子棋,要有流程图...

    五子棋 代码 VC6.0 qq_29018467112015-06-14 五子棋 (用C语言编写五子棋游戏) rannianzhixia170392017-04-20 基于easyx图形的五子棋游戏 ...

  3. 一.不同环境下C语言的编译

    Ubuntu系统下C语言的编译及makefile的应用 一.不同环境下C语言的编译 Ubuntu 20.04下 1.主程序main1.c 由vim编写 2.程序sub1.c 3.用gcc编译 将sub ...

  4. Linux 应用程序 嵌汇编,Linux下C语言嵌汇编

    Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...

  5. win2003下APACHE2.050+PHP5+MYSQL4.0.20+PHPMYADMIN2.57 的简易安装配置

    win2003下APACHE2.050+PHP5+MYSQL4.0.20+PHPMYADMIN2.57 的简易安装配置 先从各官方网站下了APACHE2.050.PHP5.MYSQL4.0.20.PH ...

  6. m_Orchestrate learning system---二十九、什么情况下用数据库做配置字段,什么情况下用配置文件做配置...

    m_Orchestrate learning system---二十九.什么情况下用数据库做配置字段,什么情况下用配置文件做配置 一.总结 一句话总结: 配置文件 开发人员 重置 数据库 非开发人员 ...

  7. 您知道Linux下C语言编程的一些注意事项吗_教育中国

    您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...

  8. linux操作系统下 c语言编程入门

    linux操作系统下 c语言编程入门 (一)目录介绍 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门 ...

  9. [转] linux操作系统下c语言编程入门

    (一)目录介绍 1)Linux程序设计入门--基础知识  2)Linux程序设计入门--进程介绍  3)Linux程序设计入门--文件操作  4)Linux程序设计入门--时间概念  5)Linux程 ...

最新文章

  1. 多显示器设置检测不到_这台显示器让我欲罢不能:华硕ROG PG279QR 电竞显示器 评测...
  2. Android之ActivityLifecycleCallbacks的得到当前的activity的状态
  3. matlab 传感器的迟滞,MATLAB PI迟滞模型问题
  4. docker容器的标准使用过程_phpStorm中使用xdebug工具调试docker容器中的程序
  5. 80. 删除排序数组中的重复项 II golang
  6. C语言的数组基础,C语言基础-数组
  7. SVM与感知机的异同点
  8. ⑥NuPlayer播放源码分析之DecoderBase分析
  9. Oracle的join默认为,oracle join用法
  10. myeclipse6.5集成freemaker
  11. Web应用中优化IBatis性能
  12. shell命令技巧——文本去重并保持原有顺序
  13. Linxu终端远程协助工具termpair
  14. wordpress邮件地址混淆 你没权限访问整个邮件地址造成的死链接
  15. mac 清理微信缓存文件
  16. go语言爬虫解析html,Python爬虫【如何爬取内容(html)和解析内容】-Go语言中文社区...
  17. 为什么转置一个512x512的矩阵,会比513x513的矩阵慢很多?
  18. c语言文件被认为是木马,为啥我用c语言写成的exe文件会被360当做木马?
  19. 论文中提到的池化方法的总结
  20. sudo -l和sudo -v说明(suse linux sudo)

热门文章

  1. Linux终端和Line discipline图解
  2. 前端学习资料 百度云盘
  3. 用nodejs写一个命令行应用-前言
  4. Hutool - 信息脱敏工具 - DesensitizedUtil
  5. STM32驱动W5100实现udp通信
  6. 一个比较全的C++农历算法
  7. 看漫画学python 怎么样_看着漫画学Python是种怎样的体验?
  8. 基于Lua的新语言NL
  9. Revit获取平面视图参照标高及视图范围
  10. 宇宙中最大的神秘结构被发现 跨度达40亿光年