用easyx给猜数游戏做图形界面 运行后输入任何数总显示低了重新输入的死循环

0
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include <graphics.h>
int r[3][4]={{30,20,130,60},{170,20,220,60},{260,20,310,60}};//三个按钮的二维数组
int guess,num;
char s[3];//输入字符串变量
int button_judge(int x,int y)//按钮判断函数
{
	if(x>r[0][0] && x<r[0][2] && y>r[0][1] && y<r[0][3])return 1;
	if(x>r[1][0] && x<r[1][2] && y>r[1][1] && y<r[1][3])return 2;
	if(x>r[2][0] && x<r[2][2] && y>r[2][1] && y<r[2][3])return 3;
	return 0;
}
void user()//用户猜数
{
    srand(time(NULL));//时间种子以改变重新开始时guess的值
	guess=rand()%100+1;//产生随机数
	while(num!=guess)
	{
		if(num<guess)
		{
			InputBox(s,30,"低了,请再次输入");
			continue;
		}
		else
		{
			if(num>guess)
			{
				InputBox(s,30,"高了,请再次输入");
				continue;
			}
			else
			{
				closegraph();//关闭绘图环境
			    exit(0);//正常退出
			}
		}
	}
}
int main()
{
    initgraph(480,360);//初始化窗口
	setbkcolor(WHITE);
    cleardevice();
    MOUSEMSG m;//鼠标指针
    RECT R1={r[0][0],r[0][1],r[0][2],r[0][3]};
	RECT R2={r[1][0],r[1][1],r[1][2],r[1][3]};
	RECT R3={r[2][0],r[2][1],r[2][2],r[2][3]};
	while(1){//最外层循环,起重新开始作用
	//char a;
    LOGFONT f;//字体样式指针
	gettextstyle(&f);					//获取字体样式
	_tcscpy(f.lfFaceName,_T("宋体"));	//设置字体为宋体
	f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
	settextstyle(&f);                     // 设置字体样式
	settextcolor(BLACK);				//BLACK在graphic.h头文件里面被定义为黑色的颜色常量
	drawtext("用户",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
	drawtext("计算机",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示
	drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示
	setlinecolor(BLACK);
    rectangle(r[0][0],r[0][1],r[0][2],r[0][3]);
	rectangle(r[1][0],r[1][1],r[1][2],r[1][3]);
	rectangle(r[2][0],r[2][1],r[2][2],r[2][3]);
    while(true)
	{
	MOUSEMSG m = GetMouseMsg();//获取一条鼠标消息

		switch(m.uMsg)
		{
			case WM_MOUSEMOVE:
				setrop2(R2_XORPEN);
				setlinecolor(LIGHTCYAN);//线条颜色为亮青色
				setlinestyle(PS_SOLID, 3);//设置画线样式为实现,10磅
				setfillcolor(WHITE);//填充颜色为白色
				break;
			case WM_LBUTTONDOWN:
				setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色)
	switch(button_judge(m.x,m.y)) //结构体实现A,B,C三个功能
	 {
	 	case 1:
			{
				InputBox(s,30,"请输入一个1-100间的数");
		        user();
                FlushMouseMsgBuffer();//单击事件后清空鼠标消息
			};break;
	    case 2:
			{
	 	        int max=100;
	 	        int min=0;//二分法首先定义一个最大最小值
				while(1)
				{
					InputBox(s,30,"请输入一个1-100间的数");
                    scanf(s,"%d",&num);//将输入字符串依次扫描到全局变量里面
                    int c;//定义整形常量C,通过给c赋值,来执行if条件语句,判断高低
	                // printf("我猜对(1)了吗?是高(0)了还是低(2)了:");
	                scanf("%d",&c);
			        if(c>1)
					{
						min=guess;//根据情况每次小循环改变min max的值
			 	        guess=int((min+max)/2);
				        continue;
					}
			        else if(c<1)
					{
						max=guess;
				        guess=int((min+max)/2);
				        continue;
					}
				}
			};break;
	 case 3:
		 closegraph();//关闭绘图环境
		 exit(0);//正常退出
	 default:
		 FlushMouseMsgBuffer();//单击事件后清空鼠标消息
		 break;
	}
	getchar();
	}
	}
	}
	return 0;
}
ava
◡̈

2021-8-8

0

错在scanf,这个函数并不能将字符串转为整形。可能你需要sscanf。

ava
慢羊羊

2021-8-8

技术讨论社区