首页 > 其他分享 >新人小练习(贪吃人)

新人小练习(贪吃人)

时间:2023-12-30 16:34:05浏览次数:24  
标签:case width 新人 练习 ++ break int printf 贪吃

#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77

int x, y; // 豆人的坐标
int fruitX, fruitY; // 果实的坐标
int score; // 得分
int width = 20; // 地图宽度
int height = 20; // 地图高度
int gameover; // 游戏结束标志

int tailX[100], tailY[100]; // 豆人尾巴的坐标
int nTail; // 豆人尾巴的长度

void setup()
{
    gameover = 0;
    x = width / 2; // 初始位置在地图中间
    y = height / 2;
    fruitX = rand() % width; // 随机生成果实的位置
    fruitY = rand() % height;
    score = 0;
}

void draw()
{
    system("cls"); // 清空屏幕
    for (int i = 0; i < width + 2; i++)
        printf("#"); // 打印上边界
    printf("\n");

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (j == 0)
                printf("#"); // 打印左边界

            if (i == y && j == x)
                printf("O"); // 打印豆人
            else if (i == fruitY && j == fruitX)
                printf("F"); // 打印果实
            else
            {
                int printTail = 0;
                for (int k = 0; k < nTail; k++)
                {
                    if (tailX[k] == j && tailY[k] == i)
                    {
                        printf("o"); // 打印豆人尾巴
                        printTail = 1;
                    }
                }
                if (!printTail)
                    printf(" ");
            }

            if (j == width - 1)
                printf("#"); // 打印右边界
        }
        printf("\n");
    }

    for (int i = 0; i < width + 2; i++)
        printf("#"); // 打印下边界
    printf("\n");
    printf("Score: %d\n", score);
}

void input()
{
    if (_kbhit()) // 检测键盘输入
    {
        switch (_getch())
        {
        case 'w':
            y--;
            break;
        case 's':
            y++;
            break;
        case 'a':
            x--;
            break;
        case 'd':
            x++;
            break;
        case 'x':
            gameover = 1;
            break;
        }
    }
}

void logic()
{
    int prevX = tailX[0];
    int prevY = tailY[0];
    int prev2X, prev2Y;
    tailX[0] = x;
    tailY[0] = y;
    for (int i = 1; i < nTail; i++)
    {
        prev2X = tailX[i];
        prev2Y = tailY[i];
        tailX[i] = prevX;
        tailY[i] = prevY;
        prevX = prev2X;
        prevY = prev2Y;
    }

    switch (_getch())
    {
    case UP:
        y--;
        break;
    case DOWN:
        y++;
        break;
    case LEFT:
        x--;
        break;
    case RIGHT:
        x++;
        break;
    case 'x':
        gameover = 1;
        break;
    }

    if (x >= width || x < 0 || y >= height || y < 0)
        gameover = 1; // 撞墙,游戏结束

    for (int i = 0; i < nTail; i++)
    {
        if (tailX[i] == x && tailY[i] == y)
            gameover = 1; // 撞到自己,游戏结束
    }

    if (x == fruitX && y == fruitY)
    {
        score += 10;
        fruitX = rand() % width;
        fruitY = rand() % height;
        nTail++;
    }
}

int main()
{
    setup();
    while (!gameover)
    {
        draw();
        input();
        logic();
        Sleep(100); // 控制游戏速度
    }
    return 0;
}

标签:case,width,新人,练习,++,break,int,printf,贪吃
From: https://blog.51cto.com/u_16485171/9040954

相关文章

  • OI练习记录 - 28/12/2023
    悲报:Div4打寄了......
  • python turtle画图练习一
    1. 使用turtle库的函数绘制10层旋状放大的类正方形,提示:类正方形边长从0度方向,边长为1像素开始,每条边长度比前一条边增加2个像素,画笔逆时针旋转91度。效果如下图所示: 2. 使用turtle库的turtle.righ()函数和turtle.circle()函数绘制一个星星图形,圆弧的半径为90......
  • 队列练习题
    求m区间内的最小值(洛谷P1440)题目大意对一序列a,从左至右扫描,取每个位置前m个数的最小值,位置为首位置时输出0,不足m个数时就取这段范围内的最小值。解题思路使用单调队列,保持队头存最小元素下标,从队尾更新最值,超出窗口范围时队头出队。未知的代码#include<bits/stdc++.h>u......
  • OI练习记录 - 27/12/2023
    早安......
  • 栈练习题
    单调栈(洛谷P5788)题目大意与栈中的向右看齐相同题解未知的代码#include<bits/stdc++.h>usingnamespacestd;constintN=3e6+5;inta[N],ans[N],n;stack<int>s;intmain(){cin>>n;for(inti=1;i<=n;i++)cin>>a[i];for(inti=n;i>=1;i--){......
  • 牛客OJ在线编程常见输入输出练习
    练习链接:https://www.nowcoder.com/exam/test/76850250/detail?pid=27976983&examPageSource=Search 题目:A+B(4)输入数据包括多组。每组数据一行,每行的第一个整数为整数的个数n(1<=n<=100),n为0的时候结束输入。接下来n个正整数,即需要求和的每个正整数。示例:输入......
  • 年底了,网站被挂马了,关于IIS被陌生DLL劫持(新人发帖,写的不好的地方,请多多担待)
    一上班被分到两个需要杀毒的站点,情况是SEO被劫持 出现一些博彩信息,但是打开确实正常内容,使用站长工具的网站被黑检测功能,发现网站的HEAD前面加载一对加密的东西 一开始我使用D盾扫描网站,删除了一些后门文件,然后再去站长工具检测,发现还是属于被黑的情况。 然后我去排查一......
  • 贪吃蛇login.js代码
    // pages/login/login.jsPage({  /**   * 页面的初始数据   */  data: {    username:"",    password:"",  },  usernameinput(e){    this.setData({      username:e.detail.value    })  },  passwordinput(e){    this.setDat......
  • C练习——水仙花数
     “水仙花数”是指一个三位数,其每位数字的立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。//打印100-999的所有水仙花数//利用for循环控制100-999个数,每个数分解出个位,十位,百位,再分别求立方相加并判断即可。#include<stdio......
  • C练习——不创建临时变量,交换两个数值
    该问题面试可能会问方法一(有缺陷,int型数值有上限,a+b可能超范围)//int型数值有上限,a+b可能超范围#include<stdio.h>intmain(){inta=2;intb=3;printf("交换前:%d%d\n",a,b);a=a+b;//3+2b=a-b;//3+2-3a=a-b;//3+2-2......