【C语言】实现简单的五子棋
用c语言实现简单的五子棋
(2019年10月文档)
ps:那时候刚刚学会用走迷宫就自己从零开始实现了下五子棋,这里下棋的思路现在想起来也特别新奇,并不是简单的输入坐标下棋,我一开始就琢磨出了wasd去取棋子与下棋,为后面写出各种神奇的程序做出了铺垫。
写这程序首先要学会写走迷宫:
学会如何读取键盘键位学会简单的移动。
学会如何在移动的情况下刷新界面。
这个小游戏是从零开始的实现的,框架灵感来自于小游戏《走迷宫》。
游戏代码配置: 二维数组+简单逻辑+getch读取键盘+windows函数(刷屏,改颜色,改窗口大小)
整体代码
代码博客链接
gihub
https://github.com/404name/C-game
画面演示
胜利画面
娱乐画面
实现过程
o设计棋盘 |
o实现棋子选点下落| (主要难点)
o设定交叉下棋|
o设定胜利规则|
■设计棋盘
搭建框架
char map[1000][1000] = {{"||==================================||"},{"|| x ||欢乐五子棋|| o ||"},{"|| ============== ||"},{"[====================================]"},{"[[==================================]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[ ]]"},{"[[==================================]]"},{"[====================================]"}};
本来中间想用“ + ”填充就和棋盘一样,但太密了。就还是空格代替。
印象中五子棋棋盘应该是横竖线交纵的,但好像仅仅以键盘上的字符很难实现布线。尝试了各种符号填充(理论上’+'能实现但成像很花),jpg,最后选择了空格,视觉效果好点**
■实现棋子选点下落(如何下棋这是个大问题)
首先要在已有棋盘框架上下棋要解决以下几个问题
1.棋子在指定棋盘内
棋子要是下在外边可就不好判断了
2.棋子不可覆盖已有棋子
还记得玩贪吃蛇删了一些代码,结果边界被我给吃完了。
3.棋子能下在任何符合规定的棋盘内
因为一开始我设置棋子作为实体不可覆盖,那假若指针被棋子围起来了那该如何出去是个大问题。
1.一开始要构思一种控制选点下棋的思路
首先我考虑了
1.<鼠标确定下点>
这是最理想的方法,鼠标点一下,棋盘上就出现对应棋子,但问题在于就目前所学而言,鼠标来选点下棋太难实现。
于是马上转变另一种控制途径
2.<键盘控制虚拟指针来选点>
这里我不由的想起了《啊哈c》这本书最后的游戏教学部分:走迷宫小游戏。
这个小游戏实现wasd上下左右控制小球移动,并碰到“#”可判断不能执行移动。(简单的if判断该坐标是否为“#”而决定是否移动,这可以将#理解成实体了)
下面简单说下原理,自行可以了解下小球是如何移动的,并认清问题1.2为什么存在;
ch = getch(); //获取键盘命令 if ( ch == 's') //下移 { if( map[x+1][y]!= '#')//如果不是”#“那就能移动(#变成实体) { map[x][y] = ' '; //原坐标还原空格 x++; map[x][y] = 'o'; //更新下一坐标 } //看懂原理后就知道如果没有if判断 //小球可以随意移动,并进过的地方都变成空格(即问题2) }
受此启发,假若把已有棋子和边界都设定不可触碰的实体,小球改成我所需要的“鼠标”,用wasd控制移动,设置键盘按下“L”为确认下棋,这样问题1.2就都完美解决了。(但此时你能想到让棋子也变成实体变成这样会造成什么大bug嘛-后文说明)
■实现交叉下棋
很简单的思路,如果我设定 键盘 “l”是下棋,那么每次按下 “l”后num++,下一步鼠标储存的棋子就在“x”,“o”间交换。
while (num)
{if (num % 2 != 0)turn = 'x'; //用turn 保存状态,并依次转变elseturn = 'o';// xxxxxx程序 然后 num++;
}
###
本游戏的指针可视为走迷宫的小球 “o”,按下键盘的“L”即会在棋盘上留下“o”的痕迹并在下一次移动时变为另一个状态“x”即可实现交叉下棋于留下棋盘痕迹。
■设计胜利规则
走到这一步了,后面判断胜利就不用说啦,处理水平,垂直,斜线判断五子连珠的能力还是绰绰有余的。这里就不介绍了。
■后期找bug (这个游戏的灵魂。。)
此时看似理论已实现只需敲代码了,结果。。。
这个局面,假设鼠标指针在小圈圈外面,那就相当于里面区域被墙围住了,那我要下里面就进不去了。
问题来的很突然,也很致命,我要思考如何让鼠标移动进入实体围成的区域内。
但恰恰是这个问题让我想到个很巧的解决方法,
甚至实现了我预期外的效果。
解决如何思路如下
(ps感觉这个简单却巧妙的解决思路为我后面的程序铺了一条很顺畅的路线)
建立在上面小球移动原理上
我想到了一个用一个temp巧妙地存储指标所在坐标之前的状态的方法,
指标移动到一个新的坐标,先用temp储存坐标原有状态,再将指标存储在坐标上打印呈现出来(作为鼠标指针显示出来);
然后执行下一次移动时,将temp所存值还给原有坐标,新坐标重复规则。`
ch = getch();
if (ch == 's') //下移
{ //turn是该次鼠标指针的状态('x' or 'o');//此时除棋盘界线 棋盘上任何坐标都是可移动的if (map[x + 1][y] != '=' && map[x + 1][y] != ']' && map[x + 1][y] != '[') //防越界{map[x][y] = temp; //原坐标恢复原来的状态x++; //移动x++到新的坐标temp = map[x][y]; //储存新的坐标的状态map[x][y] = turn; //在新的坐标上打印鼠标}
} //可以对比上面小球移动原理观察temp的妙用
再在这个基础上加入按下”L“才能改变状态(下棋),这样下来,除了棋盘边界,每个位置都能访问,每一个坐标状态都是可改动的(按下“L”更改状态即下棋,加上判断语句又可避免在原有基础上下棋),所以整个棋盘都是稳定的动态状态。
然后猛然发现,这个temp本质不就是程序: a 与 b交换值的升级版嘛!!虽然原理简单,但这个仅仅靠巧妙的改动,
一下子全部解决了 3 大问题,也让我感觉打开了新世界大门。
后续
就此我的五子棋就搞完了。从有想法到做完也只用一天,想加入更多元素,但后面马上有了个更有趣的东西“折磨”了我两三天——搭建博客。从周二到周五三天,我忙前忙后,美化主题时在各种小问题上摔跤,三两次把我的博客搞崩溃,最终才在今天有空在原来五子棋基础上加入了一些细节。也写下了这篇文章。。。
这是2019.10.18 周五的晚上
回顾起来这周收获了很多,学了许多新东西。
做了个小游戏,在学长帮忙下用了hexo搭了一个满意的博客,周五还初步被c语言老师教了用linux系统写代码,晚上又用markdown写了一篇博客。
所以完成这篇博客这周的忙碌也告一阶段了。
希望下周也能很充实
希望后续能记录更多有趣的东西~
但好像一个星期没有碰过oj系统做题了。。。尴尬。周末赶快去刷刷题找找感觉。顺便补补其他科目。
【C语言】实现简单的五子棋相关推荐
- 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏
原标题:C语言制作简单的五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是 ...
- c语言实现简单的五子棋游戏
摘要: 基于c语言以及esayx库的五子棋游戏 操作说明: 将图片保存为test.jpg,并放在程序根目录下. 使用左键下黑棋,使用右键下白棋,中键进行棋子的覆盖并实现悔棋. 源代码: /****** ...
- C语言实现简单的五子棋代码
#define _CRT_SECURE_NO_WARNINGS // VS2013添加这个宏,关闭C4996报错 #include <stdio.h>#define N 16 // 定义棋 ...
- 用c语言做一个五子棋程序,C语言制作简单五子棋游戏
原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...
- 五子棋下法C#语言,C#实现简单的五子棋游戏
最近利用业余时间写了一个简单的五子棋游戏,没有利用深层次的面向对象技术,自学一年,代码和程序设计有不妥之处,还望大神指出,先看下实现的功能,三个button按钮,黑棋和白棋选择先出,和重置. 其他的不 ...
- 【C语言】通过C语言实现简单的三子棋
[C语言]通过C语言实现简单的三子棋 文章目录 [C语言]通过C语言实现简单的三子棋 前言 一.本次小小小小项目前提 二.游戏简易菜单 1.菜单打印 2.游戏菜单的逻辑执行 三.三子棋游戏 1.初始化 ...
- c语言实现简单的多子棋游戏
c语言实现简单的多子棋游戏# 系列文章目录 c语言实现简单的多子棋游戏 前言 *大家好呀!今天我们要探究怎么用c语言实现以三子棋为基础的五子棋.十子棋等等多子棋游戏.游戏对代码的要求不高,只需要学习c ...
- C语言三子棋,五子棋,n子棋的代码实现
C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...
- 实用c语言函数源码,C语言编写简单朗读小工具(有源码)
原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...
最新文章
- 利用基于GPU的AI模拟一个现实宇宙 仅需36分钟
- 解决MongoDB 日志文件过大,清理后还占用很大磁盘空间的问题
- uniapp实战项目仿糗事百科_项目设计最好用的底层思考模型——黄金圈
- Python实战-获取鼠标键盘事件
- 图文结合,白话 Go 的垃圾回收原理
- PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
- python minimize_【趣味案例】用Python来做一个屏幕录制工具
- 修车-最小费用最大流
- java 子网掩码 位数_java实现子网掩码转换为网络标识位
- Java 如何获取线程状态呢?
- win10查看电脑已连接过的无线密码
- Ubuntu下解压rar的分卷文件 faster_rcnn_models.part1.rar
- Macbook Pro(MBP)上固态硬盘SSD,光驱位装HDD
- 使用前端js代码开发了一个图片转ico图标的功能
- 快过年了,用五种不同的JS特效带你看烟花
- 用python 写hadoop 需要怎么配置环境 python开发hadoop教程
- 多模态的研究现状与应用场景的调查研究
- 全球电力行业十大网络安全攻击事件
- 画一条连接两点的线,由两点坐标确定一条直线
- 信号相角位移量的计算与信号位移计算-附Matlab代码
热门文章
- json嵌套字典数据获取
- excel批量生成批处理语句另存为.bat文件批量改名
- The setting mapUnderScoreToCamelCase is not known. Make sure you spelled it correctly (case sensiti
- GBase 8c异地容灾
- Ardupilot 航线规划代码学习
- android:TableRow之平均分布列
- 软件产品选型测试/POC测试
- xynuoj 1919 三国志
- 安装完固态硬盘后计算机里没显示,如何解决安装固态硬盘后系统看不到的问题[详细介绍]...
- 亲测,2023年私藏的免费好用的磁力网盘资源搜索网站,找资源不用愁