贪吃蛇C语言小黑窗实现

思路:

1.利用整型二维数组保存显示数据,小蛇每移动一次清屏并便利数组做到动态效果。每次移动(清屏)的间隔时间控制了游戏难度,这个时间应不断缩减,直到游戏结束。

2.需要保存小蛇移动的方向,然后写一个函数通过小蛇的移动方向去处理二维数组中的数据,达到移动小蛇的目的。

3.小蛇的移动可分解为两个过程:头部像前方生长一格然后尾部消去一格。如果蛇头吃到食物,尾部无需消去,此时应立即随机生成一个新的食物。

4.游戏开始时小蛇应随机生成在地图某一位置,此时小蛇的默认移动方向也应该是随机的。

5每次移动前应接收玩家由键盘输入的移动方向,如果接收到后,判断合法后将其设为小蛇的默认移动方向,如果玩家未进行任何输入,小蛇应按照默认方向移动。

个人难点:

1.小蛇移动

        该函数需要拿到蛇头当时所在的位置坐标和小蛇的移动方向。随后可由蛇头位置往移动方向往前生长一格,即将二维数组中目标移动位置的数据设置为小蛇的数据。消去蛇尾另写一个函数,调用前需先判断是否吃到食物,是否撞到墙壁或者是自身,然后决定是否削去尾部。消去蛇尾需获得蛇尾的位置,所以我们在该函数内加入递归搜索蛇尾的算法:进入函数后先判断此时的位置是否为蛇尾,若不是就将自身位置往后移动一格(将蛇身往后一格的坐标输入给DeleteTail函数,然后继续此过程),直到遇到蛇尾,然后将其消去(置零)。

具体代码实现如下:

int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t)
{
	int ret = 1;//默认前进成功
	//printf("trend=%d\n", trend);
	switch (trend) {
	case 1:*py -= 1; break;//向上
	case 2:*px -= 1; break;//向左
	case 3:*py += 1; break;//向下
	case 4:*px += 1; break;//向右
	}//找到即将前进的坐标
	if (data[*py][*px] == 6) {
		data[*py][*px] = trend;
		CreatFood(data);
		*t *= 0.9;
	}//如果蛇头要前进的格子是食物,向前长一格,尾部不变;
	else if (data[*py][*px] == 0) {
		data[*py][*px] = trend;//向前长一格
		DeleteTail(*px, *py, data);//消去最后的尾巴
	}
	else {
		ret = 0;
		printf("前进失败\n");
	}//前进失败
	return ret;
}

int DeleteTail(int x, int y, int data[ROW][COL])
{
	//PrintTest(data);
	if (data[y][x] <= 4 && data[y][x] >= 1) {
		switch (data[y][x]) {
		case 1:
			if (DeleteTail(x, y + 1, data) == 0) {
				data[y][x] = 0;
			}
			break;
		case 2:
			if (DeleteTail(x + 1, y, data) == 0) {
				data[y][x] = 0;
			}
			break;
		case 3:
			if (DeleteTail(x, y - 1, data) == 0) {
				data[y][x] = 0;
			}
			break;
		case 4:
			if (DeleteTail(x - 1, y, data) == 0) {
				data[y][x] = 0;
			}
			break;
		}
		return 1;
	}
	else {
		return 0;
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值