当前位置: 首页 > 知识库问答 >
问题:

C在减去整数时将一个额外的数加到整数上

南宫保臣
2023-03-14

我正在用C语言开发ASCII游戏。玩家绕着障碍物('X')移动。玩家拥有生命值并在遇到障碍时失去生命值。我将健康声明为int,并设置为100:

int health = 100;

然后我做了一个检测碰撞的开关盒。然后我输入:

health--;

然后运行程序。我遇到了一个障碍,它降低了健康度,但增加了一个额外的数字(例如,不是说99,而是说999)。我试着调试,但什么也没找到。我做错了什么?以下是完整的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#define FPS 100

using namespace std;

char Map[21][33] =
{
    "##############################",
    "#@                           #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                            #",
    "#                           !#",
    "##############################",


};

int x = 1;
int y = 1;
int choice;
int level = 1;
int health = 100;
int lives = 5;
int score;

void clearScreen()
{
    short posX = 0;
    short posY = 0;
    COORD coord = {posX,posY};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void clearMoney()
{
    for(int i = 0; i < 21; i++)
    {
        for(int j = 0; j < 33; j++)
        {
            switch(Map[i][j])
            {
            case '$':
            {
                Map[i][j] = ' ';
            }
            }
        }
    }
}

void setupMoney()
{
    clearMoney();
    for(int i = 0; i < 21; i++)
    {
        for(int j = 0; j < 33; j++)
        {
            switch(Map[i][j])
            {
            case ' ':
            {
                choice = rand() % 30 + 1;
                switch(choice)
                {
                case 2:
                {
                    Map[i][j] = '$';
                }
                }
            }
            }
        }
    }
}

void clearObstacles()
{
    for(int i = 0; i < 21; i++)
    {
        for(int j = 0; j < 33; j++)
        {
            switch(Map[i][j])
            {
            case 'X':
            {
                Map[i][j] = ' ';
            }
            }
        }
    }
}

void setupObstacles()
{
    clearObstacles();
    for(int i = 0; i < 21; i++)
    {
        for(int j = 0; j < 33; j++)
        {
            switch(Map[i][j])
            {
            case ' ':
            {
                choice = rand() % 15 + 1;
                switch(choice)
                {
                case 2:
                {
                    Map[i][j] = 'X';
                }
                }
            }
            }
        }
    }
}

void showMap()
{
    for(int i = 0; i < 20; i++)
    {
        for(int j = 0; j < 33; j++)
        {
            printf("%c", Map[i][j]);
        }
        putchar('\n');
    }
}

void convertToAscii()
{
    for(int g = 0; g < 20; g++)
    {
        for(int h = 0; h < 30; h++)
        {
            switch(Map[g][h])
            {
            case '#':
            {
                Map[g][h] = 219;
                break;
            }
            case '@':
            {
                Map[g][h] = 254;
                break;
            }
            }
        }
    }
}

int main()
{
    srand(time(NULL));
    printf("Loading...");
    convertToAscii();
    setupObstacles();
    setupMoney();
    system("cls");
    for( ; ; )
    {
        if(GetAsyncKeyState(VK_UP))
        {
            switch(Map[y-1][x])
            {
            case ' ':
            {
                for(int i = 0; i < rand() % 5 + 2; i++)
                {
                    switch(Map[y-1][x])
                    {
                    case ' ':
                    {
                        y--;
                        Map[y][x] = 254;
                        Map[y+1][x] = ' ';
                        showMap();
                        clearScreen();
                        Sleep(FPS);
                        break;
                    }
                    case 'X':
                    {
                        health--;
                        break;
                    }
                    case '!':
                    {
                        Map[y][x] = ' ';
                        x = 1;
                        y = 1;
                        Map[y][x] = 254;
                        setupObstacles();
                        setupMoney();
                        level++;
                        break;
                    }
                    case '$':
                    {
                        score += 50;
                        y--;
                        Map[y][x] = 254;
                        Map[y+1][x] = ' ';
                        showMap();
                        clearScreen();
                    }
                    }
                }
                break;
            }
            case 'X':
            {
                health--;
                break;
            }
            case '!':
            {
                Map[y][x] = ' ';
                x = 1;
                y = 1;
                Map[y][x] = 254;
                setupObstacles();
                setupMoney();
                break;
            }
            case '$':
            {
                score += 50;
                y--;
                Map[y][x] = 254;
                Map[y+1][x] = ' ';
            }
            }
        }
        else if(GetAsyncKeyState(VK_DOWN))
        {
            switch(Map[y+1][x])
            {
            case ' ':
            {
                for(int i = 0; i < rand() % 5 + 2; i++)
                {
                    switch(Map[y+1][x])
                    {
                    case ' ':
                    {
                        y++;
                        Map[y][x] = 254;
                        Map[y-1][x] = ' ';
                        showMap();
                        clearScreen();
                        Sleep(FPS);
                        break;
                    }
                    case 'X':
                    {
                        health--;
                        break;
                    }
                    case '!':
                    {
                        Map[y][x] = ' ';
                        x = 1;
                        y = 1;
                        Map[y][x] = 254;
                        setupObstacles();
                        setupMoney();
                        level++;
                        break;
                    }
                    case '$':
                    {
                        score += 50;
                        y++;
                        Map[y][x] = 254;
                        Map[y-1][x] = ' ';
                        showMap();
                        clearScreen();
                    }
                    }
                }
                break;
            }
            case 'X':
            {
                health--;
                break;
            }
            case '!':
            {
                Map[y][x] = ' ';
                x = 1;
                y = 1;
                Map[y][x] = 254;
                setupObstacles();
                setupMoney();
                break;
            }
            case '$':
            {
                score += 50;
                y++;
                Map[y][x] = 254;
                Map[y-1][x] = ' ';
            }
            }
        }
        else if(GetAsyncKeyState(VK_LEFT))
        {
            switch(Map[y][x-1])
            {
            case ' ':
            {
                for(int i = 0; i < rand() % 5 + 2; i++)
                {
                    switch(Map[y][x-1])
                    {
                    case ' ':
                    {
                        x--;
                        Map[y][x] = 254;
                        Map[y][x+1] = ' ';
                        showMap();
                        clearScreen();
                        Sleep(FPS);
                        break;
                    }
                    case 'X':
                    {
                        health--;
                        break;
                    }
                    case '!':
                    {
                        Map[y][x] = ' ';
                        x = 1;
                        y = 1;
                        Map[y][x] = 254;
                        setupObstacles();
                        setupMoney();
                        level++;
                        break;
                    }
                    case '$':
                    {
                        score += 50;
                        x--;
                        Map[y][x] = 254;
                        Map[y][x+1] = ' ';
                        showMap();
                    }
                    }
                }
                break;
            }
            case 'X':
            {
                health--;
                break;
            }
            case '!':
            {
                Map[y][x] = ' ';
                x = 1;
                y = 1;
                Map[y][x] = 254;
                setupObstacles();
                setupMoney();
                level++;
                break;
            }
            case '$':
            {
                score += 50;
                x--;
                Map[y][x] = 254;
                Map[y][x+1] = ' ';
            }
            }
        }
        else if(GetAsyncKeyState(VK_RIGHT))
        {
            switch(Map[y][x+1])
            {
            case ' ':
            {
                for(int i = 0; i < rand() % 5 + 2; i++)
                {
                    switch(Map[y][x+1])
                    {
                    case ' ':
                    {
                        x++;
                        Map[y][x] = 254;
                        Map[y][x-1] = ' ';
                        showMap();
                        clearScreen();
                        Sleep(FPS);
                        break;
                    }
                    case 'X':
                    {
                        health--;
                        break;
                    }
                    case '!':
                    {
                        Map[y][x] = ' ';
                        x = 1;
                        y = 1;
                        Map[y][x] = 254;
                        setupObstacles();
                        setupMoney();
                        level++;
                        break;
                    }
                    case '$':
                    {
                        score += 50;
                        x++;
                        Map[y][x] = 254;
                        Map[y][x-1] = ' ';
                        showMap();
                        clearScreen();
                    }
                    }
                }
                break;
            }
            case 'X':
            {
                health--;
                break;
            }
            case '!':
            {
                Map[y][x] = ' ';
                x = 1;
                y = 1;
                Map[y][x] = 254;
                setupObstacles();
                setupMoney();
                level++;
                break;
            }
            case '$':
            {
                score += 50;
                x++;
                Map[y][x] = 254;
                Map[y][x-1] = ' ';
            }
            }
        }
        showMap();
        putchar('\n');
        printf("Health: %i", health);
        putchar('\n');
        printf("Lives: ", lives);
        putchar('\n');
        printf("Score: %i", score);
        putchar('\n');
        printf("Level: %i", level);
        Sleep(FPS);
        clearScreen();
        continue;
    }
    return 0;
}

共有1个答案

施喜
2023-03-14

我不能运行你的程序,但是据我所知,你从来没有真正清除屏幕,你只是在旧数据的上面写,但是因为你没有写整行,任何可能仍然在屏幕上的旧数据都不会神奇地消失,除非你覆盖它。

在%i后面放一些空格,我打赌你的问题会消失。试试这个吧:

    printf("Health: %i         ", health);

您可能希望在每一行上都执行这种操作,因为它不总是写出相同数量的列。

另外,为什么不把换行符放在printf中,而不是放在后续的putchar中?

    printf("Health: %i         \n", health);
 类似资料:
  • 最近我遇到了一个编程难题,我一生都找不到一个满意的答案:计算字符串给出的两个任意大整数之和,其中第二个整数可能是负数。这是在Java中完成的,没有使用任何BigInteger、BigNumber等类。 我最初使用伪代码的方法如下: 如果第二个字符串的第一个字符是'-',则设置减法标志。 将每个字符串转换为一个整数数组,每个数字一个。 用零扩展最短数组和左键,以便两个数组大小相同。 循环遍历数组的每

  • 我有一个很愚蠢的问题。当我们向ArrayList添加一个int值时,它会创建该int值的新整数对象吗?例如: 在上面的代码中,“a”是一个值为1的原始类型,“list”是一个包含整数类型元素的数组列表。那么在“列表”中添加“a”时,“列表”如何将“a”视为整数?

  • 3. 整数的加减运算 我们已经了解了计算机中正整数如何表示,加法如何计算,那么负数如何表示,减法又如何计算呢?本节讨论这些问题。为了书写方便,本节举的例子都用8个bit表示一个数,实际计算机做整数加减运算的操作数可以是8位、16位、32位甚至64位的。 3.1. Sign and Magnitude表示法 要用8个bit表示正数和负数,一种简单的想法是把最高位规定为符号位(Sign Bit),0表

  • 将一个整数,分拆为若干整数的和。例如实现: 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1 解决(Python) #! /usr/bin/env python #encoding:utf-8 """ """ def int_divided(m,r,out_list): if(r==0): return True tm=r while tm>0:

  • 我正在解决这个问题,其中他们要求第一个1000位斐波那契数的索引,我的第一个想法类似于: 然而,据我所知,没有计算BigInteger的位数的方法。这是真的吗?绕开它的一种方法是使用。ToString()。一个BigInteger的长度方法,但我听说字符串处理很慢。 大整数也有一个。ToByteArray(),我曾想过将BigInteger转换为字节数组,并检查该数组的长度,但我认为这并不能唯一地

  • 问题内容: 我是否必须退还该物体然后放入新物体?还是我可以直接增加? 没有办法做到这一点(这行不通): 问题答案: 我是否必须退还该物体然后放入新物体? 只要使用包装器类,就可以,因为它是不可变的。您可以改用可变包装器类,即使是具有方法的包装器类。但是,您将失去对值使用自动装箱和自动拆箱的功能。