网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月07日漏签0天
c语言吧 关注:801,016贴子:4,370,194
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 22回复贴,共1页
<<返回c语言吧
>0< 加载中...

一段代码,两个神奇的BUG,啊!大佬救命

  • 只看楼主
  • 收藏

  • 回复
  • 寻梦小子146
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一段还没全部完成的代码,已经出现两个找不到源头的BUG了,求大佬指点









  • 寻梦小子146
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
补充信息:
1. 调试里,enemyHP 的值全部是正确的,包括第四次该输出的0
2. 去掉 printf("我的HP:%d\t对手的HP:%d\n", myHP, enemyHP); 这一句里的 \n ,让下一句的得分和这一句显示在同一行,那个 0 就跑到得分后面去了,本来应该得分为 1 的显示得分为10


2025-11-07 22:33:30
广告
不感兴趣
开通SVIP免广告
  • 寻梦小子146
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
#include<windows.h>
#define WIDTH 80
#define HEIGHT 20
// 全局变量的定义
int position_x, position_y;
int enemy_x, enemy_y;
int mybullet_x, mybullet_y;
int myHP, enemyHP;
int isFire;
int score;
void gotoxy(int x, int y) // 定义,光标移动到(x, y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info={1, 0}; // 第二个值为0表示隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void startup()
{
position_x = WIDTH/4;
position_y = HEIGHT*3/4;
enemy_x = WIDTH*3/4;
enemy_y = HEIGHT*3/4;
mybullet_x = WIDTH+1;
myHP = 100;
enemyHP = 100;
score = 0;
}
void show()
{
gotoxy(0,0);
HideCursor();
int i, j;
for(j=0;j<HEIGHT;j++)
{
for(i=0;i<WIDTH;i++)
{
if(j==position_y && i==position_x)
printf("@");
else if(j==mybullet_y && i==mybullet_x)
printf("-");
else if(j==enemy_y && i==enemy_x)
printf("#");
else
printf(" ");
}
printf("\n");
}
printf("我的HP:%d\n", myHP);
printf("对手的HP:%d\n", enemyHP);
printf("得分:%d\n", score);
}
void updateWithoutInput()
{
int i, j;
if(mybullet_x==enemy_x && mybullet_y==enemy_y)
{
score++;
enemyHP-=25;
printf("enemyHP:%d\n",enemyHP);
}
if(mybullet_x<WIDTH)
mybullet_x++;
}
void updateWithInput()
{
if(kbhit())
{
char key = getch();
if(key==' ')
{
mybullet_x = position_x+1;
mybullet_y = position_y;
}
if(position_y==HEIGHT*3/4)
{
if(key=='a')
position_x--;
if(key=='d')
position_x++;
if(key=='w')
position_y--;
}
}
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}


  • 寻梦小子146
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这是调试中子弹第四次击中目标后 enemyHP 的值,包括其它时候都是正确的,但输出来却不正常


  • 指尖沁凉
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没清屏吧


  • 指尖沁凉
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
gotoxy 之前加一行 clrscr


  • 寻梦小子146
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@指尖沁凉 这是我将找到的 clrscr 函数定义换上去的效果,截了四次才截到的图,前三次截到的都是黑窗口

这是我换上去的 clrscr 函数定义:
/*清屏函数*/
#include <stdio.h>
#include <windows.h>
#define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s on line %d\n", __FILE__, GetLastError(), api, __LINE__);}
void MyCls(HANDLE) ;
inline void clrscr(void)
{
HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
MyCls(hStdOut);
return;
}
void MyCls(HANDLE hConsole)
{
COORD coordScreen={0,0};//设置清屏后光标返回的屏幕左上角坐标
BOOL bSuccess;
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;//保存缓冲区信息
DWORD dwConSize;//当前缓冲区可容纳的字符数
bSuccess=GetConsoleScreenBufferInfo(hConsole,&csbi);//获得缓冲区信息
PERR(bSuccess,"GetConsoleScreenBufferInfo");
dwConSize=csbi.dwSize.X * csbi.dwSize.Y;//缓冲区容纳字符数目
//用空格填充缓冲区
bSuccess=FillConsoleOutputCharacter(hConsole,(TCHAR)' ',dwConSize,coordScreen,&cCharsWritten);
PERR(bSuccess,"FillConsoleOutputCharacter");
bSuccess=GetConsoleScreenBufferInfo(hConsole,&csbi);//获得缓冲区信息
PERR(bSuccess,"ConsoleScreenBufferInfo");
//填充缓冲区属性
bSuccess=FillConsoleOutputAttribute(hConsole,csbi.wAttributes,dwConSize,coordScreen,&cCharsWritten);
PERR(bSuccess,"FillConsoleOutputAttribute");
//光标返回屏幕左上角坐标
bSuccess=SetConsoleCursorPosition(hConsole,coordScreen);
PERR(bSuccess,"SetConsoleCursorPosition");
return;
}
原文链接:https://blog.csdn.net/u012133341/article/details/81488148


  • 寻梦小子146
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原因应该就是没有清屏,改用 system("cls"); 能正确输出,但是窗口闪烁问题没能解决。
然后想到了一个办法:既然那个0是之前留下的,那只要把那个位置占了就行了。把那一句输出改为 printf("我的HP:%3d\t对手的HP:%3d\n", myHP, enemyHP); 就能正确显示了。
不过还是没找到能完美解决闪烁、清屏,也不需要占位的方法。


2025-11-07 22:27:30
广告
不感兴趣
开通SVIP免广告
  • 指尖沁凉
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
https://learn.microsoft.com/zh-cn/windows/console/console-virtual-terminal-sequences?source=recommendations


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 22回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示