C++代码贪吃蛇

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <cmath>
#include <windows.h>
using namespace std;
 
/*** 光标定位 ***/
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
 
void locate(int x,int y)
{
    coord.X=y;
    coord.Y=x;
    SetConsoleCursorPosition(hout,coord);
};
 
/*** 隐藏光标 ***/
void hide()
{
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(hout, &cursor_info);
}
 
/*** 生成随机数 ***/
double random(double start, double end)
{
    return start+(end-start)*rand()/(RAND_MAX + 1.0);
}
 
/*** 定义地图的长宽,蛇的坐标,长度,方向,食物的位置 ***/
int m,n;
 
struct node
{
    int x,y;
}snake[1000];
 
int snake_length,dir;
node food;
int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
 
/*** 输出墙 ***/
void print_wall()
{
    cout << " ";
    for (int i=1;i<=n;i++)
        cout << "-";
    cout << endl;
    for (int j=0;j<=m-1;j++)
    {
        cout << "|";
        for (int i=1;i<=n;i++) cout << " ";
        cout << "|" << endl;
    }
    cout << " ";
    for (int i=1;i<=n;i++)
        cout << "-";
}
 
/*** 首次输出蛇,其中snake[0]代表头 ***/
void print_snake()
{
    locate(snake[0].x,snake[0].y);
    cout << "@";
    for (int i=1;i<=snake_length-1;i++)
    {
        locate(snake[i].x,snake[i].y);
        cout << "*";
    }
}
 
/*** 判断是否撞墙或者自撞 ***/
bool is_correct()
{
    if (snake[0].x==0 || snake[0].y==0 || snake[0].x==m+1 || snake[0].y==n+1) return false;
    for (int i=1;i<=snake_length-1;i++)
    {
        if (snake[0].x==snake[i].x && snake[0].y==snake[i].y) return false;
    }
    return true;
}
 
/*** 随机生成并输出食物位置 ***/
bool print_food()
{
    srand((unsigned)time(0));
    bool e;
    while (1)
    {
        e=true;
        int i=(int) random(0,m)+1,j=(int) random(0,n)+1;
        food.x=i;food.y=j;
        for (int k=0;k<=snake_length-1;k++)
        {
            if (snake[k].x==food.x && snake[k].y==food.y)
            {
                e=false;break;
            }
        }
        if (e) break;
    }
    locate(food.x,food.y);
    cout << "$";
    return true;
}
 
/*** 蛇的前进 ***/
bool go_ahead()
{
    node temp;
    bool e=false;
    temp=snake[snake_length-1];
    for (int i=snake_length-1;i>=1;i--)
        snake[i]=snake[i-1];
    snake[0].x+=direct[dir][0];
    snake[0].y+=direct[dir][1];
    locate(snake[1].x,snake[1].y);
    cout << "*";
    /*** 吃到了食物 ***/
    if (snake[0].x==food.x && snake[0].y==food.y)
    {
        snake_length++;
        e=true;
        snake[snake_length-1]=temp;
    }
    /*** 输出此时蛇状态 ***/
    if (!e)
    {
        locate(temp.x,temp.y);
        cout << " ";
    }
    else
        print_food();
    locate(snake[0].x,snake[0].y);
    cout << "@";
    /*** 如果自撞 ***/
    if (!is_correct())
    {
        system("cls");
        cout << "You lose!" << endl << "Length: " << snake_length << endl;
        return false;
    }
    return true;
}
 
/*** 主函数 ***/
int main()
{
    cout << "--------------------贪吃蛇---------------------" << endl;
    cout << "请注意窗口大小,以免发生错位.建议将窗口调为最大." << endl;
    cout << "先选择难度.请在1-10中输入1个数,1最简单,10则最难" << endl;
    cout << "然后进入游戏画面,以方向键控制方向.祝你游戏愉快!" << endl;
    cout << "-----------------------------------------------" << endl;
    m=25;
    n=40; 
    if (m<10 || n<10 || m>25 || n>40)
    {
        cout << "ERROR" << endl;
        system("pause");
        return 0;
    }
    int hard;
    cin >> hard;
    if (hard<=0 || hard>100)
    {
        cout << "ERROR" << endl;
        system("pause");
        return 0;
    }
    /*** 数据全部初始化,包括蛇长,位置,方向 ***/
    snake_length=5;
    clock_t a,b;
    char ch;
    double hard_len;
    for (int i=0;i<=4;i++)
    {
        snake[i].x=1;
        snake[i].y=5-i;
    }
    dir=3;
    /*** 输出初始地图,蛇与食物 ***/
    system("cls");
    hide();
    print_wall();
    print_food();
    print_snake();
    locate(m+2,0);
    cout << "Now length: ";
    /*** 开始游戏 ***/
    while (1)
    {
        /*** 难度随长度增加而提高 ***/
        hard_len=(double)snake_length/(double) (m*n);
        /*** 调节时间,单位是ms ***/
        a=clock();
        while (1)
        {
            b=clock();
            if (b-a>=(int)(400-30*hard)*(1-sqrt(hard_len))) break;
        }
        /*** 接受键盘输入的上下左右,并以此改变方向 ***/
        if (kbhit())
        {
            ch=getch();
            if (ch==-32)
            {
                ch=getch();
                switch(ch)
                {
                case 72:
                    if (dir==2 || dir==3)
                        dir=0;
                    break;
                case 80:
                    if (dir==2 || dir==3)
                        dir=1;
                    break;
                case 75:
                    if (dir==0 || dir==1)
                        dir=2;
                    break;
                case 77:
                    if (dir==0 || dir==1)
                        dir=3;
                    break;
                }
            }
        }
        /*** 前进 ***/
        if (!go_ahead()) break;
        /*** 在最后输出此时长度 ***/
        locate(m+2,12);
        cout << snake_length;
    }
    system("pause");
    return 0;
}

以下是一个使用 Dev - C++ 编写的简单贪吃蛇游戏代码示例,该代码使用了 Windows 控制台绘图相关的函数: ```cpp #include <iostream> #include <windows.h> #include <conio.h> #include <time.h> using namespace std; #define WIDTH 20 #define HEIGHT 20 // 蛇的结构体 struct Snake { int x[100]; int y[100]; int length; int direction; }; // 食物的结构体 struct Food { int x; int y; }; // 绘制游戏界面 void draw(Snake snake, Food food) { system("cls"); for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { bool isSnake = false; for (int k = 0; k < snake.length; k++) { if (snake.x[k] == j && snake.y[k] == i) { cout << "O"; isSnake = true; break; } } if (!isSnake) { if (food.x == j && food.y == i) { cout << "X"; } else { if (i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) { cout << "#"; } else { cout << " "; } } } } cout << endl; } } // 移动蛇 void move(Snake& snake) { for (int i = snake.length - 1; i > 0; i--) { snake.x[i] = snake.x[i - 1]; snake.y[i] = snake.y[i - 1]; } switch (snake.direction) { case 0: // 上 snake.y[0]--; break; case 1: // 下 snake.y[0]++; break; case 2: // 左 snake.x[0]--; break; case 3: // 右 snake.x[0]++; break; } } // 检查是否吃到食物 bool eat(Snake& snake, Food& food) { if (snake.x[0] == food.x && snake.y[0] == food.y) { snake.length++; food.x = rand() % (WIDTH - 2) + 1; food.y = rand() % (HEIGHT - 2) + 1; return true; } return false; } // 检查是否撞到墙壁或自己 bool isGameOver(Snake snake) { if (snake.x[0] == 0 || snake.x[0] == WIDTH - 1 || snake.y[0] == 0 || snake.y[0] == HEIGHT - 1) { return true; } for (int i = 1; i < snake.length; i++) { if (snake.x[0] == snake.x[i] && snake.y[0] == snake.y[i]) { return true; } } return false; } // 改变蛇的方向 void changeDirection(Snake& snake) { if (_kbhit()) { char ch = _getch(); switch (ch) { case 'w': if (snake.direction != 1) snake.direction = 0; break; case 's': if (snake.direction != 0) snake.direction = 1; break; case 'a': if (snake.direction != 3) snake.direction = 2; break; case 'd': if (snake.direction != 2) snake.direction = 3; break; } } } int main() { srand(time(NULL)); Snake snake; snake.length = 3; snake.x[0] = WIDTH / 2; snake.y[0] = HEIGHT / 2; for (int i = 1; i < snake.length; i++) { snake.x[i] = snake.x[i - 1] - 1; snake.y[i] = snake.y[i - 1]; } snake.direction = 3; Food food; food.x = rand() % (WIDTH - 2) + 1; food.y = rand() % (HEIGHT - 2) + 1; while (true) { draw(snake, food); changeDirection(snake); move(snake); eat(snake, food); if (isGameOver(snake)) { cout << "Game Over!" << endl; break; } Sleep(100); } return 0; } ``` ### 代码说明: 1. **结构体定义**:定义了 `Snake` 和 `Food` 两个结构体,分别用于表示蛇和食物的信息。 2. **绘制界面**:`draw` 函数用于绘制游戏界面,包括蛇、食物和墙壁。 3. **移动蛇**:`move` 函数根据蛇的当前方向移动蛇的身体。 4. **检查是否吃到食物**:`eat` 函数检查蛇头是否与食物重合,如果重合则蛇的长度加 1,并重新生成食物。 5. **检查游戏是否结束**:`isGameOver` 函数检查蛇是否撞到墙壁或自己,如果是则游戏结束。 6. **改变蛇的方向**:`changeDirection` 函数根据用户输入改变蛇的方向。 7. **主函数**:初始化蛇和食物,进入游戏循环,不断更新游戏状态。 ### 编译和运行: 将上述代码保存为 `.cpp` 文件,在 Dev - C++ 中打开该文件,编译并运行即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值