C/C++——关键字练习编程

运行界面如图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码如下:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

const int WIDTH = 640;/*界面宽度*/
const int HEIGHT = 500;/*界面高度*/
int right = 0;/*正确个数*/
int error = 0;/*错误个数*/
IMAGE picture;
/*下坠文字的结构体*/
struct TARGET
{
    
    
	int x;
	int y;
	char* str;
}words[3];
/*用户输入的值*/
struct USRKEY
{
    
    
	int x;
	int y;
	char str[20];
}userkey = {
    
    320,500-30,""};//用户指定位置输入
/*指定位置输出整数*/
void outtextxy_int(int x, int y,const char* format, int num)
{
    
    
	char str[20] = "";
	sprintf(str, format, num);
	outtextxy(x, y, str);
	
}
/*指定位置输出浮点数*/
void outtextxy_double(int x, int y, const char* format, double num)
{
    
    
	char str[20] = "";
	sprintf(str, format, num);
	outtextxy(x, y, str);
}
/*绘制界线*/
void divWindow()
{
    
    
	line(WIDTH - 100, 0, WIDTH - 100, HEIGHT - 40);
	line(0, HEIGHT - 40, WIDTH + 50, HEIGHT - 40);
	line(WIDTH - 100, 130, WIDTH + 50, 130);
}
/*初始化随机性关键字*/
void initTarget(struct TARGET *words, int n)
{
    
    
	static char str[32][10] = 
	{
    
    
		"auto", "break", "case", "char", "const", "continue","default",
		"do", "double", "else", "enum", "extern","float", "for", "goto",
		"if", "int", "long","register", "return", "short", "signed", "sizeof",
		"static","struct", "switch","typedef","union", "unsigned", "void",
		"volatile", "while" 
	};

	words[n].str = str[rand() % 32];
	/*字符串时重新初始化*/
	while (words[n].str == words[(n + 1) % 3].str || words[n].str == words[(n + 2) % 3].str)
	{
    
    
		words[n].str = str[rand() % 32];
	}
	words[n].x = rand() % (WIDTH - 200);
	words[n].y = -20;
}
/*绘制菜单栏*/
void drawMenu()
{
    
    
	settextcolor(LIGHTBLUE);
	settextstyle(20, 0, "隶书");

	outtextxy(WIDTH - 90, 25, "关键字练习");
	outtextxy(WIDTH - 90, 50, "程序员专属");
	outtextxy(WIDTH - 90, 75, "练习游戏");
	outtextxy(WIDTH - 90, 225, "正确数");
	outtextxy_int(WIDTH - 90, 250, "%d",right);

	outtextxy(WIDTH - 90, 285, "错误数");
	outtextxy_int(WIDTH - 90, 310, "%d", error);
	
	outtextxy(WIDTH - 90, 345, "正确率");
	//除数不为0 分类讨论
	if (right + error == 0)
	{
    
    
		outtextxy_double(WIDTH - 90, 370, "%.2lf%%", 0.00);
	}
	else
	{
    
    
		double sum = right + error;
		outtextxy_double(WIDTH - 90, 370, "%.2lf%%", right/sum*100);
	}
}
/*字符串处理*/
void strDispose()
{
    
    
	//碰线 处理
	for (int n = 0; n < 3; n++)
	{
    
    
		words[n].y += 5;
		if (words[n].y > (HEIGHT - 40 - textheight(words[n].str)))
		{
    
    
			initTarget(words, n);
		}
	}
	//打印字符串
	for (int n = 0; n < 3; n++)
	{
    
    
		settextcolor(RGB(75, 213, 213));
		outtextxy(words[n].x, words[n].y, words[n].str);
	}
}
/*装载资源*/
void loadResourse()
{
    
    
	srand(time(NULL));//播种种子
	initgraph(WIDTH + 50, HEIGHT);//初始化图形
	loadimage(&picture, "1.jpg", 690, 500);//装载背景图
	setbkmode(TRANSPARENT);//设置图案背景色透明
	mciSendString("open 1.mp3", 0, 0, 0);//打开音乐
	mciSendString("play 1.mp3 repeat",0,0,0);
	/*初始 随机 字符串*/
	for (int n = 0; n < 3; n++)
	{
    
    
		initTarget(words, n);
		words[n].y = -15 - n * 30;
	}
}
int main()
{
    
    
	int i = 0;
	loadResourse();//装载资源
	BeginBatchDraw();
	while (1)
	{
    
    
		cleardevice();
		putimage(0, 0, &picture);
		divWindow();//绘制界线	
		drawMenu();//绘制菜单栏
		strDispose();//字符串处理

		/*用户输入*/
		if (_kbhit())
		{
    
    
			char target;
			if ((target = _getch()) != '\r')
			{
    
    
				userkey.str[i++] = target;
			}
			else
			{
    
    
				int flagError = 0;
				for (i = 0; i < 3; i++)
				{
    
    
					if (strcmp(userkey.str, words[i].str) == 0)
					{
    
    
						initTarget(words, i);
						right++;
						flagError = 1;
					}
				}
				if (flagError == 0)
				{
    
    
					error++;
				}
				i = 0;
				userkey.x = 320;
				memset(userkey.str, 0, 20);
			}	
		}
		outtextxy(userkey.x, userkey.y, userkey.str);

		FlushBatchDraw();
		Sleep(50);
	}
	getchar();
	closegraph();
	return 0;
}

源代码资源链接:https://pan.baidu.com/s/1VaR1rzgxbq56mIjOHC9DeQ
提取码:z4wc

猜你喜欢

转载自blog.csdn.net/weixin_53391957/article/details/118612586