一看就懂的贪吃蛇游戏(c++实现)

设计思路

        建议先将代码复制下来跑一遍再来看思路!!!

        通俗易懂,请仔细看。

        值得注意的是我给出的代码没有加墙体,如有需要自己添加。

        也没有难度设计,同上。

  1. 地图大小(这里设计了墙体,代码中未实现)

设置一个整形数组map,其大小为1600,对应着地图的大小为1600,并初始化数组,令数组中的值全为0,0代表空地。

我们通过设定窗口的宽度为80,打印时每个map[i] 所对应的字符占两格位置即可实现每打印40个map[i]就换行的效果。

这样地图的长宽即为40x40.

      2.墙体

墙体在地图的最外围,意味着当map[i]中的i为地图边界时,对应着墙体,使用if语句判断i的值,符合位于边界的条件打印墙体即可。

通过地图的大小我们了解到,当0<=i<=39时,map[i]对应着第一行,也就是地图的边界 ,同样的,地图左边界的i满足i%40==0,右边界的i满足(i+1)%40==0,,同理下边界。将上述符合的条件放入if语句中即可实现打印墙体的功能。

        3.蛇

蛇是如何移动呢?并且保持一定长度。其实我们只需要一个蛇头就可以办到,因为蛇身只是旧蛇头的位置,所以我们一直只需更新蛇头坐标就能达到目的,如何保持长度呢?,因为我们更新新的蛇头,去掉旧的蛇尾是很显然的事了,在地图大小中我们提到,map[i] 如果等于0,就是空地,让蛇尾的值变成0就行了,因为蛇一直在移动,所以当前蛇尾的前一节蛇身会是下一刻的蛇尾,很自然的联想到了以1为公差的一组数1234,分别对应蛇身的值,如果我们想使蛇连续的动起来,新蛇头的值为4,在加入新蛇头前将蛇尾变为0,蛇尾前一节蛇身变为此刻蛇尾对应的值为1,使蛇整体减去1,此时的蛇的值为0123,加入蛇头4,01234,此刻原蛇尾变为空地,原蛇尾前一截蛇身变为此刻的蛇尾。贪吃蛇的持续移动便完成了。

       4.食物

很自然的,在上面3节map[i]为0,正整数时都有了对应的含义,食物我们便使其 map[i] =-1.因为贪吃蛇游戏中食物的生成要求是随机的,但我们的c++课程中并没有提到,便在网上查找到了随机数生成的函数srand(上面的设定窗口大小也是如此),生成的随机数i可能超出数组大小,对i取1600的余数即可。食物只能生成在空地上,当map[i]等于0时,令map[i]=-1。新的食物便生成了。容易忽略的一点是,我们并没有给墙体map[i]的值,也就是所墙体的值在数组中对应的是空地,只不过通过i的位置来判断是否为墙体,在这里,同样也要加入墙体的位置到判断条件,以免食物生成在墙体内。新的食物在旧的食物被吃掉后立即生成。

      5.死亡判定

我们通过新蛇头所对应的值来判断蛇是否死亡

        (1)map[headx+heady*40]>0, 由3我们可以知道,蛇身所对应的map [i]  值大于0,新蛇头所对应的map值大于0也就意味着新蛇头在蛇身生成,按

照贪吃蛇的规则,游戏结束

       (2)(headx+heady*40)满足墙体的打印条件时,意味着蛇头在墙体生成,游戏结束

实现代码

#include<bits/stdc++.h>
#include<windows.h>
#include<iostream>
#include<conio.h>
int main() {
    int headx = 0, heady = 0, len = 5, map[1600] = { 0 }, i = 0;
    char c = 'd', cl = 'd',body=3,head=2;
    /*随机数生成*/
    srand((unsigned)time(0));
    system("mode con:cols=80 lines=40");
    map[rand() % 1600] = -1;
    while (true)
    {
        if (_kbhit())//判断键盘输入
        {
            cl =_getch();
            if (cl < 97) cl += 32;
            if (cl == 'a' && c != 'd' || cl == 'd' && c != 'a' ||cl == 'w' && c != 's' || cl == 's' && c != 'w')//判断输入方向是否与原方向冲突
                c = cl;
        }
        /*改变蛇头坐标*/
        if (c == 'a') headx--;
        if (c == 'd') headx++;
        if (c == 'w') heady--;
        if (c == 's') heady++;
        /*判断蛇头是否撞墙*/
        if(headx==-1||headx==40||heady==-1||heady==40)
            break;
        /*判断蛇头是否为空地*/
        if (map[heady * 40 + headx])
        {
            if (map[heady * 40+headx] > 0) break;
            /*吃到食物,蛇身+1,并在空地生成新的食物*/
            if (map[heady * 40 + headx] < 0)
            {
                len++;
                for (i = rand() % 1600; map[i] || !(map[i] = -1); i = rand() % 1600);
            }
        }
        /*是空地则蛇身值整体减1,蛇尾由1减为0变成空地*/
        else for (i = 0; i < 1600; i++)
        {
            if (map[i] > 0) map[i] -= 1;
        }
        system("cls");
        /*新蛇头赋值,遍历map,值大于0为蛇身,等于0为空地,小于0为食物*/
        for (map[heady * 40 + headx] = len, i = 0; i < 1600; i++)
        {
            if (map[i] == len) {
                printf("%2d", map[i]);
                continue;
            }
            if (map[i] > 0)  printf("%2d", map[i]);
            if (map[i] == 0)  printf("%2d", map[i]);
            if (map[i] == -1) printf("%2d", map[i]);//打印
         }
        Sleep(100);
    }
}

效果

 如果你仔细阅读了代码,将数字替换成你想要的符号(占两个字符大小如果是一个字符要加一个空格)是很简单的事情

如果你想要游戏循环进行,也是很容易办到的。

这只是个demo,你可以根据自己的需要任意的改写。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的 C++ 代码实现贪吃蛇游戏: ```c++ #include <iostream> #include <conio.h> #include <windows.h> using namespace std; // 定义游戏区域的宽度和高度 const int width = 20; const int height = 20; // 定义蛇的结构体 struct Snake { int x, y; } snake[100]; // 定义蛇的长度和方向 int length = 3, direction = 3; // 定义食物的坐标 int food_x, food_y; // 定义游戏是否结束的标志 bool gameover = false; // 初始化游戏 void init() { // 设置蛇的初始位置和方向 snake[0].x = 5; snake[0].y = 5; snake[1].x = 4; snake[1].y = 5; snake[2].x = 3; snake[2].y = 5; direction = 3; // 生成初始食物的位置 food_x = rand() % width; food_y = rand() % height; } // 绘制游戏画面 void draw() { system("cls"); // 清屏 // 绘制游戏区域 for (int i = 0; i <= height; i++) { for (int j = 0; j <= width; j++) { if (i == 0 || i == height) { cout << "#"; } else if (j == 0 || j == width) { cout << "#"; } else if (i == food_y && j == food_x) { cout << "F"; } else { bool print = false; for (int k = 0; k < length; k++) { if (snake[k].x == j && snake[k].y == i) { cout << "O"; print = true; } } if (!print) cout << " "; } } cout << endl; } // 显示得分 cout << "Score: " << length - 3 << endl; } // 更新游戏状态 void update() { // 根据方向更新蛇的位置 for (int i = length - 1; i > 0; i--) { snake[i] = snake[i - 1]; } if (direction == 0) snake[0].y--; if (direction == 1) snake[0].x++; if (direction == 2) snake[0].y++; if (direction == 3) snake[0].x--; // 判断蛇是否吃到食物 if (snake[0].x == food_x && snake[0].y == food_y) { // 生成新的食物位置 food_x = rand() % width; food_y = rand() % height; // 增加蛇的长度 length++; } // 判断是否撞墙或撞到自己的身体 if (snake[0].x == 0 || snake[0].x == width || snake[0].y == 0 || snake[0].y == height) { gameover = true; } for (int i = 1; i < length; i++) { if (snake[0].x == snake[i].x && snake[0].y == snake[i].y) { gameover = true; } } } // 处理用户输入 void input() { if (_kbhit()) { char ch = _getch(); if (ch == 'w') direction = 0; if (ch == 'd') direction = 1; if (ch == 's') direction = 2; if (ch == 'a') direction = 3; } } int main() { // 初始化游戏 init(); // 游戏循环 while (!gameover) { // 绘制游戏画面 draw(); // 处理用户输入 input(); // 更新游戏状态 update(); // 等待一段时间,控制游戏速度 Sleep(100); } // 游戏结束 cout << "Game Over!" << endl; cout << "Your Score: " << length - 3 << endl; return 0; } ``` 这个代码实现了一个基础版的贪吃蛇游戏,可以在控制台中运行。在游戏中,按 w、a、s、d 键可以控制蛇的移动方向,吃到食物可以增加分数,撞到墙或撞到自己的身体会导致游戏结束。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Krito.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值