初识数组、三子棋、相关思考~

       数组相关知识点总结:

1.关于strlen和sizeof,我们看一组代码:

 注:这里的11其实是一个随机值。

strlen是一个库函数,计算的是字符串的长度,并且只能针对字符串,关注的是字符串中是否有\0,计算的是\0之前的字符个数。所以strlen(arr1)中,最后没有\0,所以strlen继续往后找,知道在内存中找到了\0才停了下来。

而sizeof是一个操作符(库函数)。sizeof是用来计算变量所占空间大小的,任何类型都是可以使用的,只关注空间大小,不在乎内存中是否存在\0。

2.一维数组在内存中的存储。

我们看一组代码:

仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址也在有规律的递增,由此得出结论:数组在内存中是连续存放的。

3.二维数组在内存中的存储

我们看一组代码:

 

 通过结果我们可以分析到,其实二维数组在内存中也是连续存储的,可能与我们的想象不太一样。

4.我们写一个冒泡排序来学习一下数组传参。

我们先看一个错误的示范:

我们看到输出的结果并没正确的排序,原因就在于红色框里面的这句代码。数组传参的时候,arr传过去的是数组首元素的地址(除了sizeof(arr)和&arr之外,其他所有的arr都表示的是首元素的地址) 所以如果在bubble_sort函数内部计算数组大小的话,sizeof(arr)中的arr表示一个指针,指向数组的第一个元素,因此sizeof(arr)=4(这在前面指针的大小中提到),sizeof(arr)/sizeof(arr[0])=1。

正确的做法如下:

5. 三子棋的实现。

代码如下:

和“笨蛋”电脑“博弈”了一番之后,我取得了胜利。

 第一次写这么长的代码,很是艰难。主要有以下几个点:

①当头一棒就是重复定义:

我在game.c中包含了头文件game.h,然后在test.c中包含了game.h,但是我又在test.c中包含了game.c,这样的话game.c的内容相当于被我包含了两次,自然就出现了重复定义。将这里的#include"game.c"去掉,问题就迎刃而解。

②对于玩家走棋和电脑走棋的时候,没有对坐标位置的状态进行判断,例如玩家输入坐标之后,该坐标是否已经被占用。这就导致电脑随机生成位置的时候,将之前该位置的棋子覆盖。

 

③电脑下棋的时候是随机生成的地址,我们需要将这一步骤放在循环内部。

如果该地址不是空格,不能落子的话,那么继续进入循环重新生成一个地址 。而如果像箭头那样,放在循环外面,一旦判断地址不是空格,就会继续循环,但是生成地址的步骤在循环外面,就会形成死循环。

④最让我头疼的就是判断输赢部分。

横、竖、斜连续判断的时候,没有考虑都是空格的情况,这是需要注意的点。

其次,在头文件中,我们定义了全局变量ROW和COL,可以改变棋盘的大小,但是在判断输赢的部分,为了简单(毕竟是三子棋),我们将代码写死了,只能用来判断ROW=COL=3的情况,那么如果我们改成10*10或者20*20的棋盘的时候,显然就不适用了 。

我们进行如下思考:

一,如果我们将判断输赢改成循环来判断一整行或者一整列或者整个斜对角的棋子都一样,那如果是20*20的棋盘,我们需要20个棋子在一条线才能赢,显然不合适。

二,我们可以参照五子棋的思路,即使棋盘再大,我们只要判断5个棋子是否在一条直线就行,那么在玩家和电脑各自走一步之后都判断一下,当前落的棋子周围,是否有5个棋子(当然具体几个棋子连成线算赢,由我们说了算)连成一条线(横、竖、斜)。

我们将原三子棋代码判断部分改造如下:

参考学习了“生发液来这么高”的博客才有思路,并进行了一定的简化:输入五子棋棋盘判断输赢或平局—程序设计(C语言)_输入五子棋棋盘判断输赢—程序设计-CSDN博客_c语言五子棋判断输赢输入五子棋棋盘判断输赢或平局—程序设计(C语言)https://blog.csdn.net/qq_26957983/article/details/90770169

 判断是否连成线:

在这里改成了五子棋,玩一把的情况如下:

由于棋盘的行和列是头文件定义的全局变量,因此棋盘大小可以随意更改(当然如果是五子棋就不要改3*3了,这不是抬杠吗喂!) ,然后不管是三子棋还是五子棋还是七子棋,只要在判断部分将判断条件改一下就行。如改成三子棋:

 以上就是三子棋游戏的全部思考,当然可能还有细节没有想到,以后想到再说吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值