相信各位应该有了解过金山打字通吧,今天的话,小编就暂且写一个金山打字通这个系列的,打字系统,用C语言写一下,涉及到的知识点也并不是很多的,涉及到的 文件操作 字符数组 字符串函数 C语言基本语法 图形界面,下面小编把代码发出来一下
/*****************************************
1、程序,发给女朋友,同学,用不了。
2、脱离控制台,带界面的好看,C语言。
3、编写程序的逻辑。
******************************************/
#include <stdio.h> //标准的输入输出头文件
#include <graphics.h> //图形界面头文件
#include "resource.h"
#include <conio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <mmsystem.h> //多媒体设备接口
#pragma comment(lib,"winmm.lib")
IMAGE backImg; //一种类型 保存图片的类型
void Inter();
void Convention();
void loadArtcle();
void Typing(char content[6000]);
int main()
{
int flag = 1;
//初始化一个图形界面,参数1:界面的宽 参数2:界面的高
initgraph(1000,800); //printf(); scanf(); 像素
srand((unsigned int)time(NULL));
//PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_RESOURCE|SND_LOOP|SND_ASYNC);
//加载图片
//loadimage(存放图片的变量,图片的路径,图片拉伸的宽,图片拉伸的高);
//loadimage(&backImg, L"./image/背景.jpg", 1000, 800);
////输出图片
//putimage(0, 0, &backImg);
loadimage(&backImg, L"IMAGE", MAKEINTRESOURCE(IDR_IMAGE1), 1000, 800);
MOUSEMSG msg = { 0 }; //鼠标信息
while (1)
{
msg = GetMouseMsg(); //不断获取鼠标信息
if (msg.x >= 350 && msg.x <= 630 && msg.y >= 250 && msg.y <= 290)
{
settextcolor(BLUE);
outtextxy(350, 250, L"◆ 游 戏 模 式 ◆"); //
}
else if (msg.x >= 350 && msg.x <= 630 && msg.y >= 350 && msg.y <= 390)
{
settextcolor(BLUE);
outtextxy(350, 350, L"◆ 常 规 模 式 ◆"); //
}
else if (msg.x >= 350 && msg.x <= 630 && msg.y >= 450 && msg.y <= 490)
{
settextcolor(BLUE);
outtextxy(350, 450, L"◆ 音 乐 开 关 ◆"); //
}
else if (msg.x >= 350 && msg.x <= 630 && msg.y >= 550 && msg.y <= 590)
{
settextcolor(BLUE);
outtextxy(350, 550, L"◆ 退 出 系 统 ◆");
} //学习C语言 C++的过程中 很难坚持 枯燥 找到一种兴趣 练习提高的学习过程。
else
{
Inter(); //会有闪烁 需要用到缓冲
}
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (msg.x >= 350 && msg.x <= 630 && msg.y >= 250 && msg.y <= 290)
{
}
else if (msg.x >= 350 && msg.x <= 630 && msg.y >= 350 && msg.y <= 390)
{
Convention(); //常规
}
else if (msg.x >= 350 && msg.x <= 630 && msg.y >= 450 && msg.y <= 490)
{
flag = -flag;
if (flag == -1)
PlaySound(NULL, NULL, NULL);
else
PlaySound((LPCWSTR)(rand()%2+102), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
}
else if (msg.x >= 350 && msg.x <= 630 && msg.y >= 550 && msg.y <= 590)
{
//退出
closegraph();
exit(0);
}
break;
}
}
closegraph(); //关闭图形界面
return 0;
}
void Inter()
{
//文字
//1、设置背景模式(透明) 2、设置文字的颜色 3、文字的格式
setbkmode(TRANSPARENT); //透明
settextcolor(RGB(239, 39, 228)); //黑色
BeginBatchDraw();
putimage(0, 0, &backImg);
settextstyle(70, 0, L"华文琥珀");
outtextxy(240, 80, L"极品打字练习系统"); //在指定的坐标输出文字
settextstyle(40, 0, L"华文琥珀");
outtextxy(350, 250, L"◆ 游 戏 模 式 ◆"); //
outtextxy(350, 350, L"◆ 常 规 模 式 ◆"); //
outtextxy(350, 450, L"◆ 音 乐 开 关 ◆"); //
outtextxy(350, 550, L"◆ 退 出 系 统 ◆"); //
EndBatchDraw();
}
void Convention()
{
setlinecolor(RED);
setlinestyle(PS_SOLID, 3);
setbkcolor(RGB(79,135,230));
cleardevice();
rectangle(50, 50, 950, 100);
for (int i = 200; i < 800; i += 100)
{
rectangle(50, 50, 950, i); //50,50
}
loadArtcle();
getch();
}
//
void loadArtcle()
{
settextcolor(YELLOW);
settextstyle(20, 0, L"Segoe UI Historic");
setlinestyle(PS_SOLID, 1);
FILE* fp;
if ((fp = fopen("./type.txt", "r")) == NULL)
return;
char content[6000]; //6000个字符
int readlen;//实际的字符个数
fgets(content, 6000, fp);
long len1 = strlen(content); //len1 实际
int j = 0;
int y = 130;
for (int x = 60; x <= 940 && j<=len1; x += 8, j++)
{
outtextxy(x, y, content[j]);
if (j != 0 && j % 108 == 0)
{
x = 60;
y += 100;
}
if (y >= 900)
break;
}
readlen = j;
Typing(content);
}
//getch() 显示到屏幕上 判断一下跟数组一样吗 一样 黄色 不一样红色 黄色个数 总个数 正确率
void Typing(char content[6000])
{
settextstyle(20, 0, L"Segoe UI Historic");
int x = 60;
int y = 170;
char ch;
int i=0;
while (1)
{
ch = getch();
if (ch == content[i])
{
setcolor(YELLOW);
}
else
{
setcolor(RED);
}
if (ch == '\b') // \b
{
if (i > 0) //数组的下标
{
i--;
}
if (x > 60)
{
x -= 8;
}
outtextxy(x, y, L" ");
}
else
{
outtextxy(x, y, ch);
x += 8;
i++;
}
}
}
下面的话我把效果图发出来一下,可以加下群466572167(群内有各种项目学习资料)
基于时间有限,还有就是代码太多,小编暂时也没有特别的完善,那个游戏模式暂时还没写出来,只是先把常规模式写了一下,效果图也发了出来哈,可以加下小编的群466572167,群内有学习资料以及项目资源,可以一起交流提升。希望对接触了C语言的,还没尝试写过小程序的,能给一下思路,能帮助就尽量帮一下,还有这都是小编的见解哈,不喜勿喷哈,有建议可以在下面评论的。