用C代码写贪吃蛇游戏--用按键控制蛇移动

本文介绍了如何使用C语言编写贪吃蛇游戏,并通过按键控制蛇的移动。利用kbhit()函数检测按键,实现非阻塞控制。游戏逻辑包括按键判断、蛇的移动方向控制等,代码中w、a、s、d对应上下左右移动。在英文输入法下运行,优化代码以解决bug。

通过按键控制蛇的移动,首先需要读取按键,通过按键来控制。

通过百度后得知用kbhit();

用一小段代码进行测试:

一直输出Hello World,直到用户按Esc结束

#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(void)
{
    char ch;
    while(ch!=27)
    {
        printf("HelloWorld\n");
        if(kbhit())
        {
            ch=getch();
        }
    }
    printf("End!\n");
    system("pause");
    return 0;
}

kbhit()在执行时,检测是否有按键按下,有按下返回非0值,没有按下则返回0,是非阻塞函数;
不同于getch()的在执行时,检测按下什么键,如果不按键该函数不返回,也就不进行下一步操作,是阻塞函数。

显而易见,我们需要在蛇移动的时候进行控制。我们只需要通过控制蛇头的方向,蛇身依次而动就可以了。

实现逻辑:

1、加入按键控制

2、判断是否有按键

3、按照按键来进行移动

4、没有按键,按照固定方向移动

用w a s d 分别表示上左下右,完整代码及注释如下:


#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>

#define SNAKELEN    10
#define SNAKEMAX    10
#define INITSNAKELEN    3


#define RIGHT   1
#define LEFT    2
#define DOWN    3
#define UP      4

COORD snakeBodyPosition[SNAKELEN];
void showSnake();
int snakeLen = 3;
void initSnake(COORD snakeHeadPosition )
{   
    int i = 0;

    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台
    COORD tmp = snakeHeadPosition;

    for(i = 0;i < INITSNAKELEN;i++)//打印蛇身
    {
        snakeBodyPosition[i] = tmp;
        SetConsoleCursorPosition(hout,tmp);
        printf("*");
        tmp.X--;

    }
    snakeLen = INITSNAKELEN;
}

void move(int direction)
{
    Sleep(100);
    system("cls");
    int i = 0;

    for(i = 0;i < snakeLen - 1;i++)
    {
        snakeBodyPosition[snakeLen -1-i] = snakeBodyPosition[snakeLen - 2-i];   
    }

    switch(direction)
    {
    case RIGHT:
        {
            snakeBodyPosition[0].X++;
            break;
        }
    case LEFT:
        {
            snakeBodyPosition[0].X--;
            break;
        }
    case DOWN:
        {
            snakeBodyPosition[0].Y++;
            break;
        }
    case UP:
        {
            snakeBodyPosition[0].Y--;
            break;
        }
        default:
        {
            break;
        }
    }
    showSnake();
}

void showSnake()
{

    int i = 0;
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    for(i = 0;i <snakeLen;i++)
    {
        SetConsoleCursorPosition(hout,snakeBodyPosition[i]);
        printf("*");
    }

}

void keyboard()     //按键控制
{
    char ch = 'd';
    int direction = RIGHT;  //前面宏定义RIGHT,UP等是int类型

    while(1)
    {
        move(direction);    //调用move函数
        switch(ch)
        {
        case 'w':
            {
                direction = UP;     //比如前面定义UP是4,这里把4赋值给direction
                break;
            }
        case 'a':
            {
                direction = LEFT;
                break;
            }
        case 's':
            {
                direction = DOWN;
                break;
            }
        case 'd':
            {
                direction = RIGHT;
                break;
            }   
        default:
            {
                move(direction);        //优化之后解决蛇按下除方向键外其他键或者不按键也能保持原来的移动方向
                break;
            }
        }

        if(kbhit())         //如果有按键
        {
            ch = getch();       //把getch获取到的按键赋值给ch
        }

    }   
}
int main(int argc, char* argv[])
{
    int i = 0;
    COORD   pos = {0,0};
    initSnake(pos);
    keyboard();
    printf("\n");
    return 0;
}

运行效果如下:
注意要在英文输入法下进行。
这里写图片描述

总结:

1、一段代码,从产生到最后完成,优化优化再优化
2、思考具体的问题时,一定要细致,尽可能多的解决bug

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值