首页 > 其他分享 >C语言项目——简易版贪吃蛇

C语言项目——简易版贪吃蛇

时间:2023-10-29 11:06:42浏览次数:39  
标签:case coor food direct C语言 int 简易版 贪吃蛇 snake

使用工具

CLion 2022

前期准备

导入第三方库Easyx,详细教程 => 在 CLion、Dev-C++ 或 Code::Blocks 下面配置 EasyX(2023-7-23 更新) - CodeBus

运行效果

C语言项目——简易版贪吃蛇_C语言

代码实现

/*
 * 1. 定义蛇结构
 * 2. 定义食物结构
 * 3. 游戏初始化
 * 4. 蛇行进
 * 5. 按键控制(方向,暂停)
 * 6. 吃食物
 * 7. 死亡判定
 */
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

#define LENGTH_MAX 100  // 蛇的最大长度
enum DIR{   // 方向
    W, S, A, D
};

struct Snake{
    // 蛇的长度,行进方向,行进速度,以及所在位置(坐标)
    int length;
    int direct;
    int speed;
    POINT coor[LENGTH_MAX];
}snake;

struct Food{
    // 食物所在位置,大小,是否被吃
    int x;
    int y;
    int r;
    int grade;
    bool flag;
}food;

void GameInit(){
    // 设置游戏窗口大小
    initgraph(648,475);
    // 设置随机数种子
    srand(GetTickCount());
    // 设置蛇的参数
    snake.length = 3;
    snake.direct = D;
    snake.speed = 10;
    for(int i = 0; i < snake.length; i++){
        snake.coor[i].x = 334-10*i;
        snake.coor[i].y = 200;
    }
    // 设置食物的参数
    food.x = rand()%638+10;
    food.y = rand()%465+10;
    food.r = rand()%8+8;
    food.grade = 0;
    food.flag = true;
}

void GameDraw(){
    // 防闪烁
    BeginBatchDraw();
    // 设置背景颜色
    setbkcolor(RGB(255,250,240));
    cleardevice();
    // 画蛇
    setfillcolor(RGB(85,107,47));
    for(int i = 0; i < snake.length; i++){
        solidcircle(snake.coor[i].x,snake.coor[i].y,5);
    }
    // 画食物
    setfillcolor(RGB(220,20,60));
    if(food.flag){
        solidcircle(food.x,food.y,food.r);
    }
    // 显示分数
    char over[100];
    setcolor(RGB(107,142,35));
    sprintf(over, "Your score is: %d", food.grade);
    outtextxy(10, 10, over);
    EndBatchDraw();
}

void SnakeMove(){
    // 从第二蛇身个开始都跟着上一个
    for(int i = snake.length-1; i > 0; i--){
        snake.coor[i] = snake.coor[i-1];
    }
    // 行进和穿墙设置
    switch (snake.direct) {
        case W:
            snake.coor[0].y -= snake.speed;
            if(snake.coor[0].y <= 0){
                snake.coor[0].y = 475;
            }
            break;
        case S:
            snake.coor[0].y += snake.speed;
            if(snake.coor[0].y >= 475){
                snake.coor[0].y = 0;
            }
            break;
        case A:
            snake.coor[0].x -= snake.speed;
            if(snake.coor[0].x <= 0){
                snake.coor[0].x = 648;
            }
            break;
        case D:
            snake.coor[0].x += snake.speed;
            if(snake.coor[0].x >= 648){
                snake.coor[0].x = 0;
            }
            break;
    }
}

void MoveControl(){
    if(_kbhit()){
        switch (_getch()) {
            // 记得设置不能原地掉头
            case 'w':
            case 'W':
            case 72:
                if(snake.direct != S){
                    snake.direct = W;
                }
                break;
            case 's':
            case 'S':
            case 80:
                if(snake.direct != W){
                    snake.direct = S;
                }
                break;
            case 'a':
            case 'A':
            case 75:
                if(snake.direct != D){
                    snake.direct = A;
                }
                break;
            case 'd':
            case 'D':
            case 77:
                if(snake.direct != A){
                    snake.direct = D;
                }
                break;
                // 设置按空格暂停
            case ' ':
                while(1){
                    if(_getch()==' '){
                        return;
                    }
                    break;
                }
        }
    }
}

void EatFood(){
    if(food.flag && abs(snake.coor[0].x-food.x) < food.r+1 && abs(snake.coor[0].y-food.y) < food.r+1 ){
        food.flag = false;
        food.grade++;
        snake.length++;
    }
//  食物刷新
    if(!food.flag){
        food.x = rand()%648;
        food.y = rand()%475;
        food.r = rand()%5+5;
        food.flag = true;
    }
}

bool snakeDie() {
    for (int i = 1; i < snake.length; ++i) {
        if (snake.coor[i].x == snake.coor[0].x && snake.coor[i].y == snake.coor[0].y) {
            return true;
        }
    }
    return false;
}

void ClearScore(){
    food.grade = 0;
}
int main() {
    int tmp;
    do{
        GameInit();
        while(!snakeDie()){
            GameDraw();
            SnakeMove();
            MoveControl();
            EatFood();
            Sleep(65); // 控制速度
        }
        // 按 0重新开始,按其他键退出游戏
        char over[100] = "Game Over! Press '0' to restart, press other to quit.";
        setcolor(RED);
        outtextxy(180, 50, over);
        setcolor(WHITE);
        system("pause");
        tmp = _getch();
    }while(tmp != 0);
    return 0;
}

标签:case,coor,food,direct,C语言,int,简易版,贪吃蛇,snake
From: https://blog.51cto.com/goku0623/8076677

相关文章

  • B站C语言第四课
    1,EOF -endoffile-文件结束标志-12,结构体//创建一个结构体类型structBook{ charname[20];//C语言程序设计 shortprince;//55};intmain(){ //利用结构体类型-创建一个该类型的结构体变量 structBookb1={"C语言程序设计",55}; structBook*pb=&b1; //利......
  • C语言二分查找法新手
    如果有一天我们想通过输入一个数去查找这个数在数组的下标。我们应该怎么去实现呢?首先我们肯定要创建一个数组组,我们知道数组的数组是从零开始的,首先呢,我们要了解二分查找法可以在百度里面查到。二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采......
  • C语言入门之数组之一维和二维----小白
    今天的介绍C语言数组的概念。数组的分类一维数组和多维数组。一维数组和二维数组,这是我们今天主要介绍的两种。一数组的概念。数组是一组相同类型元素的集合,我们在前面介绍了数据类型。他可以将多个相同类型的数据,放到一起。1.数组的数据不能为0,至少要放一个元素。或者对他进行初始......
  • c语言学习的第三天
    intmain()//{// externintg_val;// printf("g_val=%d\n",g_val);//extern--申明外部符号+// return0;//static修饰全局变量改变了变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用,出了源文件就没法在使用了//static修饰函数改变了函数的链接属性 //st......
  • 【每日例题】蓝桥杯 C语言 凯撒加密
    凯撒加密题目题目描述给定一个单词,请使用凯撒密码将这个单词加密。凯撒密码是—种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即α变为d,b变为e,·,w变为z,Z变为a,g变为b,z变为c。输入描述输入格式:输入一行,包含一个单词,单词中只包含小写英文字母,单词中......
  • 【C语言Coding】第二十八天
    【例题1】2744.最大字符串配对数目-力扣(LeetCode)intmaximumNumberOfStringPairs(char**words,intwordsSize){intans=0;for(inti=0;i<wordsSize-1;i++){for(intj=i+1;j<wordsSize;j++){//字符串长度不相等intlen1=st......
  • C语言小案例
    1.从键盘输入3个实数,输出其中的最大值、最小值和平均值#include<stdio.h>intmain(){ doublenumber[3]; doublemax,min,average=0; inti; printf("Pleaseinputthreenumbers:"); for(i=0;i<3;i++){ scanf("%lf",&number[i]); } max=min=number[0]; ......
  • B站C语言第三课
    1,字符串的结束标志:’\0'//"abcdef";//'\0'-转义字符-0//0->数字0//‘0’->48//'a''b''c''0''1''2'//EOF-endoffile-文件结束标志 -1return0;2,~按(2进制)位取反1010----0101//原码--------......
  • C语言--数组
    数组:一维数组1.一维数组的创建数组是一组相同类型的元素的集合。数组的创建:数组的元素类型数组名常量表达式(指定数组的大小)type_tarr_name[const_n]数组创建的实例:#include<stdio.h>intmain(){chararr1[10];intarr2[10......
  • C语言获取结构体变量地址并且输出结构体变量任意地址的数据
    #include<stdio.h>typedefstructTest{floatItem1;charItem2;intItem3;shortItem4;longItem5;doubleItem6;}TestStr1;intmain(){structTestTestStr;void*Ptr;TestStr.Item1=1.11;TestStr.It......