while图片文字闪烁

0

代码如下:

//主函数
int main()
{
	initgraph(800, 600);//初始画布600*400像素,和closegraph()成对出现
	
	
	mciSendString("stop 11.MP3",NULL,0,NULL);
	mciSendString("play 12.MP3 repeat",NULL,0,NULL);
	
	IMAGE img; // 定义 IMAGE 对象
	loadimage(&img, "2.jpg"); // 读取图片到 img 对象中
	putimage(0, 0, &img); // 在坐标 (0, 0) 位置显示 IMAGE 对象
	
	setlinecolor(YELLOW);
	line(0,400,800,400);
	
	
	int x, y;//字母随机出现的坐标
	char target;//字母
	int key;//记录用户按键
	char s[10] = { 0 };//score:显示得分
	char f[10] = { 0 };//wrong:显示失败分数
	int score = 0;
	int wrong = 0;
	sprintf(s,"SCORE:%d",score);//将整型score转换成字符串,格式化写入到字符型s中。
	outtextxy(0,550,s);//将s字符串得分在0*350的位置输出
	sprintf(f, "WRONG:%d", wrong);//格式化输入失分
	outtextxy(0, 575, f);//丢分输出
	srand((unsigned int)time(NULL));//生成随机种子
	
	//循环出现字母
	while (1)
	{
		target = 65 + rand() % 26;//随机生成大写字母,65-90是大写字母的ASCII码,在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个 //随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,故这句取值范围:65-90
		x = 30 + rand() % 740;//字母在x轴出现的位置
		
		IMAGE sm,sm1;//定义水母图片 
		loadimage(&sm, _T("shuimu1.jpg"),50,40,true);
		loadimage(&sm1, _T("shuimu2.jpg"),50,40,true);
		
		//判断是否结束游戏
		if (wrong == 10)
		{ 
			mciSendString("stop 12.MP3 ",NULL,0,NULL);
			initgraph(800, 600);//初始画布600*400像素,和closegraph()成对出现
			IMAGE img; // 定义 IMAGE 对象
			loadimage(&img, "3.jpg"); // 读取图片到 img 对象中
			putimage(0, 0, &img); // 在坐标 (0, 0) 位置显示 IMAGE 对象
			setbkmode(TRANSPARENT);
			settextstyle(60,0,"宋体");//设置字体样式
			settextcolor(RED);//字体颜色
			sprintf(s, "SCORE:%d", score);//格式化输入得分
			outtextxy(300,130,"GAME OVER");//输出GAME OVER
			outtextxy(300, 180, s);//输出得分
			
			break;//退出while循环
		}
		//字母掉落效果
		for (y = 0; y < 400; y++)
		{
			IMAGE img; // 定义 IMAGE 对象
			loadimage(&img, "2.jpg"); // 读取图片到 img 对象中
			putimage(0, 0, &img); // 在坐标 (0, 0) 位置显示 IMAGE 对象
			
			setlinecolor(YELLOW);
			line(0,400,800,400);
			
			putimage(x-20,y-9,&sm,SRCPAINT);
			putimage(x-20,y-9,&sm1,SRCAND);
			settextcolor(WHITE);//设置字母颜色
			outtextxy(x,y,target);//输出字母
			
			
			//字母调到底部扣分
			if (y >= 390)
			{
				wrong++;//扣分
				
				sprintf(f, "WRONG:%d", wrong);
				outtextxy(0, 575, f);//覆盖上次计分
				
				break;//退出for循环
			}
			//判断用户是否按键
			else if (_kbhit())
			{
				key = _getch();//记录按键
				//打字正确
				
				if (key == 27)
				{
					
					initgraph(800, 600);//初始画布600*400像素,和closegraph()成对出现
					IMAGE img; // 定义 IMAGE 对象
					loadimage(&img, "3.jpg"); // 读取图片到 img 对象中
					putimage(0, 0, &img); // 在坐标 (0, 0) 位置显示 IMAGE 对象
					setbkmode(TRANSPARENT);
					settextstyle(60,0,"宋体");//设置字体样式
					settextcolor(RED);//字体颜色
					sprintf(s, "SCORE:%d", score);//格式化输入得分
					outtextxy(210,130,"GAME OVER");//输出GAME OVER
					outtextxy(210, 180, s);//输出得分
					
					getchar();//防止闪屏
					
				}
				
				if (key == target || key == target + 32)
				{
					mciSendString("play 13.MP3 ",NULL,0,NULL);
					score++;//加分
					
					sprintf(s, "SCORE:%d", score);
					outtextxy(0, 550, s);//覆盖上次分数
					break;//退出for循环
				}
				
				//打字错误
				else 
				{
					wrong++;//丢分
					
					sprintf(f, "WRONG:%d", wrong);
					outtextxy(0, 575, f);//覆盖分数
					break;//退出for循环
				}
				
				
			}
			Sleep(1);//设置字母下落速度
			//防止字母掉落时遮盖得得分输出处
			//y++一次就输出一次得分
			settextcolor(WHITE);
			outtextxy(0, 550, s);
			outtextxy(0, 575, f);
		}
	}


	getchar();		//防止闪屏
	closegraph();	//关闭画布
	return 0;
}
ava
用户a709

2019-12-16

0

代码有问题: 整个代码只需要一处 initgraph(800, 600) 不能多次执行。

https://docs.easyx.cn/zh-cn/BeginBatchDraw

#include <graphics.h>

int main()
{
	BeginBatchDraw();
    while
	{
        ...
        ...
        // 绘图操作结束后添加下面函数
		FlushBatchDraw();
	}

	EndBatchDraw();

	closegraph();
}

即可解决闪烁问题

 

ava
xiongfj ◑◑

2019-12-16

你好,我闪烁问题解决了但是加入之后按esc退出黑屏怎么办 -  用户a709  2019-12-17
黑屏可能是绘图操作未 flush,确保绘图操作后面会执行 FlushBatchDraw() -  xiongfj ◑◑  2019-12-19
技术讨论社区