超简单的C语言贪吃蛇 不闪屏 双缓冲

C语言贪吃蛇

今天把以前自己写的贪吃蛇总结了一下,发到博客上,怕放在电脑上哪天丢失了都不知道, 有不当之处还望指教 (*・ω< ) ヾ(◍°∇°◍)ノ゙

贪吃蛇中, 我们看到的蛇在不断的移动,其实就是在屏幕上不断的打印显示信息,又不断的擦除,就让蛇看起来在移动,在这里要用到语句: system("cls"), 但这个就造成了一个问题,打印不能一下打印完,所以造成了 闪屏, 解决闪屏的办法是 双缓冲, 双缓冲我在后边介绍
在这里插入图片描述

主要思想

大致准备

  1. 首先是用一个二维数组 arr 来存放屏幕上的布局, 用0来表示空白的地方,蛇可以移动的区域,
  2. 其他的食物、还有最外边的墙都用小于零的数来表示
  3. 我们的蛇身的话就用大于零的数表示,蛇尾用1表示,从蛇尾到蛇头依次增大,就可以根据蛇头值的大小来判断这个蛇吃了多少的食物
  4. 还有一些就是键盘上的方向键的, 总行、总列数,我们可以用宏定义, 这样方向键在用的时候就不用写 ASCII码了,直接用标识符又比较明显知道是哪个方向,不易错;
  5. 还要用一个1行2列的数组来存放蛇头的坐标位置,默认蛇是有长度的,所以要默认在数组中给蛇安排好它的位置,就是把数组中蛇身坐标的位置的值改为从蛇尾0到蛇头依次增大的值,
    在这里插入图片描述

随机产生食物

  1. 那我们现在开始随机产生食物,用一个函数 produceFood 专用来随机产生食物
  2. 随机产生一个坐标垂直vertical的水平的 level v = rand() % ROW; l = rand() % COL 判断 arr[v][l] 是否是空白区域,如果不是再重新产生,直到产生的是空白区域

方向选择

  1. 根据按键,判断出是哪个方向,就把相应的方向存好,注意: 如果按的是和蛇移动的方向相反,我们应该不处理,让蛇继续往这个方向移动,不然就会出现蛇吃自己,那就应该死亡了,这样体验要好一些些, 因为有好多时候就这样死亡了体验不好

蛇移动

  1. 那我们怎么来让蛇移动呢,首先我们要默认给蛇一个移动的方向,还要用一个1行2列的数组来存放蛇头的坐标位置,知道了蛇头的移动方向,还有坐标位置,那我们就知道了蛇头要移动到下一个坐标点的位置,那我们根据我们的数组就知道下一个坐标点位置是什么东西(食物,墙,空白地方,蛇身),我们就可以判断了
  2. 如果是 空白地方: 首先,我们让整个数组中大于零的值都 减1, 那原先的蛇尾的值为 1 变为了 0 , 就变为空白区域了,蛇尾就移动了, 之后我们让下一个坐标点位置的值改为蛇头的值 加1 ,蛇头就自然移动到下一个位置了
  3. 如果是 食物:把下一个坐标点位置的值改为蛇头的值 加1,这样蛇移动了,且变长了,吃了一个食物,之后调用 产生食物的函数,继续运行
  4. 如果是 墙或蛇身:死亡了, 根据蛇头的值,判断出吃了多少食物,得了多少分, 显示分数,退出游戏

双缓冲

写这个贪吃蛇已经快有一年了, 我也忘了双缓冲了(>ω・* )ノφ(>ω<*) ,只能模糊的记得些,让我说我也不知道怎样说, 我太菜了┗( ▔, ▔ )┛,但我代码里面有双缓冲,具体的双缓冲可以看
http://m.bubuko.com/infodetail-582228.html
https://blog.youkuaiyun.com/weixinhum/article/details/72179593
可以去网上了解了解 , 好了, 看看代码吧,不足之处欢迎指教 ─=≡Σ(((つ•̀ω•́)つ

代码如下:

/*********************************************
 *贪吃蛇 
 *用0表示空白的地方,用大于0的数做蛇,从蛇尾到蛇头的数依次增大,其它(墙,食物)的用负数表示,
 *碰到食物就把食物那个点的值变成蛇头值+1,食物的点变成蛇头,退出
 *没有碰到食物,下一个点为空,就把下一个点的值变成蛇头值+1,
 *在将整个数组大于0的值都减一,蛇尾为一的自然变为0,就消失了,其它情况直接退出
 *@author zhoufei
 *@date 2018-06-03
 *********************************************/
#include<stdio.h>
#include<windows.h>
#define FOOD -4     //食物
#define WALL -9   //墙
#define COL 35
#define ROW 20
#define VK_UP 72   //方向键上下左右的第二个值,方向键有两个值,第一个是224,分别是72,...
#define VK_DOWN 80
#define VK_LEFT 75
#define VK_RIGHT 77
#define int short  //把所有的int类型数据换成short类型节约空间 
/*心得,常量大写,变量有多个单词加下划线,函数多个单词首字母小写,其余首字母大写*/
//用word打特殊符号,再复制
void fangXiangChoice(int arr[][COL]);  //输入的方向的
void start(int p[][COL]);           //开始之前的初始化操作
void print(int* a);                 //输出函数,输出到屏幕
void produceFood(int a[][COL]);        //产生食物
void moveSnake(int (*arr)[COL],int * fx);          //蛇的移动
int head_v = 4,head_h = 5;
    //蛇头的纵向坐标和横向坐标,用大于0的数做蛇,从蛇尾到蛇头的数依次增大,
int arr[ROW][COL];
int speed_snake = 5;  //蛇移动的速度,几次循环执行一次来控制
int fang_xiang = VK_RIGHT;//蛇移动的方向,默认向右
int exitgame = 0;

HANDLE hOutput,hOutBuf;  //控制台屏幕缓冲区句柄
HANDLE *houtpoint;
COORD coord = {
   
   1,0};
DWORD bytes = 0;
char data[ROW][COL];
int zhixiang_hOutput = 0;  //通过指针轮流指向两个缓冲区,实现双缓冲 
void main()
{
   
   
    int k;
    start(arr);
    produceFood(arr);
    puts("嗨~欢迎你来到贪吃蛇的世界!请君坐好了,要开车了~"
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值