贪吃蛇(C语言小游戏)

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

#define SNAKE_NUM 500//蛇的最大节数
#define WINDOW_HEIGHT 480  //高度
#define WINDOW_WIDTH 640  //宽度

struct Snake{
    POINT coor[SNAKE_NUM];  //坐标
    int size;   //节数
    int direction;  //方向
    int speed;
}snake;

struct Food
{
    int x;
    int y;
    int r;
    bool flag;
    DWORD color;
}food;

//初识化方向(枚举)
enum DIR
{
    UP,
    DOWN,
    LEFT,
    RIGHT,
};

//死亡提示框
HWND hwnd = NULL;

//数据初始化
void GameInit()
{
    //初始化graph 窗口
    initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);  
    //初始化蛇
    snake.size = 3;
    snake.speed = 10;
    snake.direction = RIGHT;
    for (int i =0; i<snake.size; ++i){
        snake.coor[i].x = 40-10*i;
        snake.coor[i].y = 10;
    }
    //初始化食物
    srand(GetTickCount());      //设置随机数种子 GetTickCount()是用来获取系统开机,到现在缩经过的毫秒数
    food.x = rand() % WINDOW_WIDTH;
    food.y = rand() % WINDOW_HEIGHT;
    food.color = RGB(200, 10, 0);
    food.flag = true;
    food.r = 6;
}

//绘制窗口
void GameDraw()
{
    BeginBatchDraw(); //双缓冲绘图
    setbkcolor(RGB(65, 130, 160));
    cleardevice();  //使用当前背景色清空绘图设备
    //绘制蛇
    //半径为5的实心圆
    for (int i=0;i<snake.size;++i){
        setfillcolor(GREEN);
        solidcircle(snake.coor[i].x, snake.coor[i].y, 5);
    }
    if(food.flag){
        setfillcolor(food.color);
        solidcircle(food.x,food.y,5);
    }
    EndBatchDraw();
}

void snakeMove()
{
    //让第2个蛇身跟着第一个移动
    for(int i=snake.size-1; i>0; --i){
        snake.coor[i] = snake.coor[i-1];
    } 
    switch (snake.direction)
    {
    case UP:
        snake.coor[0].y -= snake.speed;
        snake.coor[0].y = (WINDOW_HEIGHT + snake.coor[0].y) % WINDOW_HEIGHT;
        break;
    case DOWN:
        snake.coor[0].y += snake.speed;
        snake.coor[0].y = snake.coor[0].y % WINDOW_HEIGHT;
        break;
    case LEFT:
        snake.coor[0].x -= snake.speed;
        snake.coor[0].x = (WINDOW_WIDTH + snake.coor[0].x) % WINDOW_WIDTH;
        break;
    case RIGHT:
        snake.coor[0].x += snake.speed;
        snake.coor[0].x = snake.coor[0].x % WINDOW_WIDTH;
        break;
    } 
}

//通过按键改变蛇的方向
void keyControl(){
    if(_kbhit()!=0)        //有按键被按下
    {
        switch (_getch())  //从控制台中获取输入的字符
        {
        case'w':
        case'W':
        case 72:
            if(snake.direction != DOWN){
                snake.direction = UP;
            }
            break;
        case's':
        case'S':
        case 80:
            if(snake.direction != UP){
                snake.direction = DOWN;
            }
            break;
        case'a':
        case'A':
        case 75:
            if(snake.direction != RIGHT){
                snake.direction = LEFT;
            }
            break;
        case'd':
        case'D':
        case 77:
            if(snake.direction != LEFT){
                snake.direction = RIGHT;
            }
            break;
        case ' ': 
            //阻塞函数,直到有字符输入时才会返回
            while (_getch() != ' '){ }
            break;
        }
    }
}

void EatFood(){
    if(food.flag && snake.coor[0].x >= food.x -food.r && snake.coor[0].x <= food.x +food.r   //接触到食物就算被吃
       && snake.coor[0].y >= food.y -food.r && snake.coor[0].y <= food.y +food.r)
    {
        food.flag = false;
        snake.size++;
    }
    if(! food.flag)    //食物被吃完立刻再随机生成一个
    {
        food.x = rand() % WINDOW_WIDTH;
        food.y = rand() % WINDOW_HEIGHT;
        food.color = RGB(200, 10, 0);
        food.flag = true;
        food.r = 6;
    }
}

//蛇死亡
int snakeDie()
{
	/*用时取消即可
	//玩法2,撞墙死
	if (snake.coor[0].x > 640 || snake.coor[0].x < 0 ||
		snake.coor[0].y>480 || snake.coor[0].y < 0)
	{
		outtextxy(200, 200,"你撞墙啦!");
		MessageBox(hwnd, "Game Over!","撞墙警告", MB_OK);
		return 1;
	}
	*/

	//通用代码:自己吃自己
	for (int i = 4; i < snake.size; i++)
	{
		if (snake.coor[0].x == snake.coor[i].x  &&
			snake.coor[0].y == snake.coor[i].y )
        {
                outtextxy(200, 200, "你撞到自己啦!");
			    MessageBox(hwnd, "Game Over!", "自杀警告", MB_OK);	
			return 1;
		}
	}
	return 0;
}


int main()
{
	GameInit();
    while (1)
    {
        GameDraw();
        if (snakeDie()){
			break;
		}
        snakeMove();
        keyControl();
        EatFood();
        Sleep(80);
    }
    getchar();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于2048小游戏贪吃蛇,你需要了解一些基础的C语言知识和图形库的使用。下面是一个简单的示例代码,可以帮助你入门。 ``` #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <graphics.h> #define ROWS 20 // 行数 #define COLS 20 // 列数 #define BLOCK_SIZE 30 // 方块大小 #define WIDTH (COLS * BLOCK_SIZE) // 窗口宽度 #define HEIGHT (ROWS * BLOCK_SIZE) // 窗口高度 int map[ROWS][COLS]; // 地图 int score = 0; // 分数 int gameover = 0; // 游戏是否结束 // 初始化地图 void init_map() { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { map[i][j] = 0; } } } // 在指定位置绘制方块 void draw_block(int x, int y, int color) { setfillcolor(color); setlinecolor(BLACK); rectangle(x * BLOCK_SIZE, y * BLOCK_SIZE, (x + 1) * BLOCK_SIZE, (y + 1) * BLOCK_SIZE); fillrectangle(x * BLOCK_SIZE + 1, y * BLOCK_SIZE + 1, (x + 1) * BLOCK_SIZE - 1, (y + 1) * BLOCK_SIZE - 1); } // 在地图上绘制游戏界面 void draw_map() { int i, j; cleardevice(); setbkcolor(WHITE); settextcolor(BLACK); settextstyle(20, 0, "黑体"); char str[20]; sprintf(str, "分数:%d", score); outtextxy(10, 10, str); for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { if (map[i][j] > 0) { draw_block(j, i, map[i][j]); } } } } // 在地图上生成新的方块 void generate_block() { int i, j; do { i = rand() % ROWS; j = rand() % COLS; } while (map[i][j] > 0); map[i][j] = rand() % 2 == 0 ? 2 : 4; } // 判断游戏是否结束 int is_gameover() { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { if (map[i][j] == 0 || (j > 0 && map[i][j] == map[i][j - 1]) || (i > 0 && map[i][j] == map[i - 1][j])) { return 0; } } } return 1; } // 向左移动 void move_left() { int i, j, k; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { if (map[i][j] > 0) { for (k = j - 1; k >= 0; k--) { if (map[i][k] == 0) { map[i][k] = map[i][k + 1]; map[i][k + 1] = 0; } else if (map[i][k] == map[i][k + 1]) { map[i][k] *= 2; score += map[i][k]; map[i][k + 1] = 0; break; } else { break; } } } } } } // 主函数 int main() { initgraph(WIDTH, HEIGHT); init_map(); generate_block(); generate_block(); while (1) { draw_map(); if (kbhit()) { int key = getch(); if (key == 27) { break; } else if (key == 'a') { move_left(); } } if (is_gameover()) { gameover = 1; break; } generate_block(); Sleep(100); } if (gameover) { MessageBox(NULL, "游戏结束!", "提示", MB_OK); } closegraph(); return 0; } ``` 这个示例代码实现了一个简单的贪吃蛇游戏,你可以通过修改代码来实现2048小游戏。同时,你还需要了解图形库的使用,例如Windows下的GDI或者Linux下的SDL等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值