我正在用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;
}
我不能运行你的程序,但是据我所知,你从来没有真正清除屏幕,你只是在旧数据的上面写,但是因为你没有写整行,任何可能仍然在屏幕上的旧数据都不会神奇地消失,除非你覆盖它。
在%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转换为字节数组,并检查该数组的长度,但我认为这并不能唯一地
问题内容: 我是否必须退还该物体然后放入新物体?还是我可以直接增加? 没有办法做到这一点(这行不通): 问题答案: 我是否必须退还该物体然后放入新物体? 只要使用包装器类,就可以,因为它是不可变的。您可以改用可变包装器类,即使是具有方法的包装器类。但是,您将失去对值使用自动装箱和自动拆箱的功能。