#define _CRT_SECURE_NO_WARNINGS
#include
#include //图形库 需要额外安装
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"WinMM.Lib")
#define _CRT_SECURE_NO_WARNINGS
MOUSEMSG m;
IMAGE background;
IMAGE star[2];
int right = 0;
int wrong = 0;
char target;
int x, y;
struct letter//第一关字母结构体
{
int x;
int y;
TCHAR target;//字符
};
struct letter array[5];//每次出现五个字母
struct TARGET//第二关单词结构体
{
int x;
int y;
TCHAR str[20];
};
struct USERKEY//第二关保存用户输入得字母
{
int x;
int y;
TCHAR str[20];
}userkey = { 100, 370, L" " };
void outtextxy_int(int x, int y, const char* format, int num)//输出整数
{
char str[20] = " ";
sprintf_s(str, format, num);
outtextxy(x, y, TCHAR(str));
}
void outtextxy_double(int x, int y, const char* format, double num)//输出浮点数
{
char str[20] = " ";
sprintf_s(str, format, num);
outtextxy(x, y, TCHAR(str));
}
void loadResource()//加载资源,把文字给图片
{
loadimage(&background, L"键盘背景4.jpg", 1000, 650);
loadimage(star + 0, L"星星掩码图.jpg", 80, 80);
loadimage(star + 1, L"星星背景图.jpg", 80, 80);
}
//输出带星星的字母
void outtextimage(int x, int y, char target)
{
setbkmode(TRANSPARENT);
putimage(x, y, star + 0, SRCAND);
putimage(x, y, star + 1, SRCPAINT);
settextstyle(25, 0, _T("宋体"));
outtextxy(x + 35, y + 32, target);
}
//初始化五个坐标
void initArraychar(struct letter array[], int curPos)
{
//srand((unsigned int)time(NULL));
while (array[curPos].target == NULL || array[curPos].target == array[(curPos + 1) % 5].target ||
array[curPos].target == array[(curPos + 2) % 5].target ||
array[curPos].target == array[(curPos + 3) % 5].target ||
array[curPos].target == array[(curPos + 4) % 5].target)
{
array[curPos].target = rand() % 26 + 65;
}
while (array[curPos].x == array[(curPos + 1)].x ||
array[curPos].x == array[(curPos + 2)].x ||
array[curPos].x == array[(curPos + 3)].x ||
array[curPos].x == array[(curPos + 4)].x)
{
array[curPos].x = rand() % 800;
}
array[curPos].y = rand() % 80 - 100;
}
void Pause()//按空格键暂停
{
IMAGE img; //准备图片
loadimage(&img, L"f.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径,也可以使用绝对路径
putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片
setfillcolor(COLORREF RGB(240, 230, 140));
fillrectangle(750, 130, 950, 190);
fillrectangle(750, 210, 950, 270);
TCHAR ch[] = _T("SNAP____");
settextstyle(35, 0, ch);
settextcolor(COLORREF RGB(30, 144, 255));
TCHAR begin[] = _T("继续游戏");
TCHAR go[] = _T("返回主菜单");
setbkmode(TRANSPARENT);
outtextxy(750 + 10, 130 + 10, begin);
outtextxy(750 + 10, 210 + 10, go);
MOUSEMSG m;
while (1)
{
m = GetMouseMsg();
if (m.x >= 750 && m.x <= 930 && m.y >= 130 && m.y <= 190)//开始游戏
{
setlinecolor(RED);
rectangle(750, 130, 930, 190);
if (m.uMsg == WM_LBUTTONDOWN)
{
break;
}
}
else if (m.x >= 750 && m.x <= 930 && m.y >= 210 && m.y <= 270)//退出游戏
{
setlinecolor(RED);
rectangle(750, 210, 930, 270);
if (m.uMsg == WM_LBUTTONDOWN)
{
exit(0);
}
}
else
{
setlinecolor(WHITE);
rectangle(750, 130, 930, 190);
rectangle(750, 210, 930, 270);
}
}
}
//开始画键盘
void keyboard()
{
IMAGE img; //准备图片
loadimage(&img, L"键盘背景4.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径,也可以使用绝对路径
setbkmode(TRANSPARENT);
putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片
int i, j, k, m, n;
char one[] = { 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P' };//第一行
char two[] = { 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L' };//第二行
char three[] = { 'Z', 'X', 'C', 'V', 'B', 'N', 'M' };
char four[] = { '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+' };
char five[] = { '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=' };
char oneend[] = { '{', '}', '|' };
char oneend1[] = { '[', ']', '\\' };
char three1[] = { ':', '"' };
char three2[] = { ';', '\'' };
char h1[] = { '<', '>', '?' };
char h2[] = { ',', '.', '/' };
setcolor(WHITE);
rectangle(220 - 100, 600 - 50 - 100, 290 - 100, 640 - 50 - 100); //Tab(220,550),(290,590)
line(220 - 100, 600 - 150, 220 - 3 - 100, 603 - 150);
line(220 - 3 - 100, 603 - 150, 220 - 100 - 3, 643 - 150);
line(220 - 100, 640 - 150, 220 - 3 - 100, 643 - 150);
line(290 - 100, 640 - 150, 293 - 100, 643 - 150);
line(220 - 3 - 100, 643 - 150, 293 - 100, 643 - 150);
line(290 - 100, 600 - 150, 293 - 100, 603 - 150);
line(293 - 100, 603 - 150, 293 - 100, 643 - 150);
TCHAR ch[] = _T("Arial");
settextstyle(20, 0, ch);
TCHAR tab[] = _T("Tab");
outtextxy(230 - 100, 610 - 150, tab);
rectangle(220 - 100, 650 - 150, 300 - 100, 690 - 150); //CapsLock (220,600),(300,640)
line(220 - 100, 650 - 150, 220 - 3 - 100, 653 - 150);
line(220 - 3 - 100, 653 - 150, 220 - 3 - 100, 693 - 150);
line(220 - 100, 690 - 150, 220 - 3 - 100, 693 - 150);
line(300 - 100, 690 - 150, 303 - 100, 693 - 150);
line(220 - 3 - 100, 693 - 150, 303 - 100, 693 - 150);
line(300 - 100, 650 - 150, 303 - 100, 653 - 150);
line(303 - 100, 653 - 150, 303 - 100, 693 - 150);
settextstyle(17, 0, ch);
TCHAR CapsLock[] = _T("CapsLock");
outtextxy(230 - 100, 660 - 150, CapsLock);
rectangle(870 - 100, 550 - 150, 940 - 100, 590 - 150); //Backspace (870,500),(940,540)
line(870 - 100, 550 - 150, 870 - 3 - 100, 553 - 150);
line(870 - 3 - 100, 553 - 150, 870 - 3 - 100, 593 - 150);
line(870 - 100, 590 - 150, 870 - 3 - 100, 593 - 150);
line(940 - 100, 590 - 150, 943 - 100, 593 - 150);
line(870 - 3 - 100, 593 - 150, 943 - 100, 593 - 150);
line(940 - 100, 550 - 150, 943 - 100, 553 - 150);
line(943 - 100, 553 - 150, 943 - 100, 593 - 150);
settextstyle(16, 0, ch);
TCHAR Backspace[] = _T("Backspace");
outtextxy(875 - 100, 560 - 150, Backspace);
rectangle(220 - 100, 700 - 150, 330 - 100, 740 - 150); //Shift (220,650),(330,690)
line(220 - 100, 700 - 150, 220 - 100 - 3, 703 - 150);
line(220 - 3 - 100, 703 - 150, 220 - 3 - 100, 743 - 150);
line(220 - 100, 740 - 150, 220 - 3 - 100, 743 - 150);
line(330 - 100, 740 - 150, 333 - 100, 743 - 150);
line(220 - 3 - 100, 743 - 150, 333 - 100, 743 - 150);
line(330 - 100, 700 - 150, 333 - 100, 703 - 150);
line(333 - 100, 703 - 150, 333 - 100, 743 - 150);
settextstyle(20, 0, ch);
TCHAR Shift[] = _T("Shift");
outtextxy(230 - 100, 710 - 150, Shift);
for (i = 220 - 100; i < 860 - 100; i = i + 50) // 键盘第零行13个键
{
rectangle(i, 550 - 150, i + 40, 590 - 150); //键盘第一个字母坐标(220,500),(260,540)
line(i, 550 - 150, i - 3, 553 - 150);
line(i - 3, 553 - 150, i - 3, 593 - 150);
line(i, 590 - 150, i - 3, 593 - 150);
line(i + 40, 590 - 150, i + 43, 593 - 150);
line(i - 3, 593 - 150, i + 43, 593 - 150);
line(i + 40, 550 - 150, i + 43, 553 - 150);
line(i + 43, 553 - 150, i + 43, 593 - 150);
settextstyle(10, 0, ch);
k = (i - 220 + 100) / 50;
outtextxy(i + 5, 555 - 150, four[k]);
settextstyle(16, 0, ch);
outtextxy(i + 20, 570 - 150, five[k]);
}
for (i = 300 - 100; i < 800 - 100; i = i + 50) // 键盘第一行10个键
{
rectangle(i, 600 - 150, i + 40, 640 - 150); //键盘第一个字母坐标(300,550),(340,590)
line(i, 600 - 150, i - 3, 603 - 150);
line(i - 3, 603 - 150, i - 3, 643 - 150);
line(i, 640 - 150, i - 3, 643 - 150);
line(i + 40, 640 - 150, i + 43, 643 - 150);
line(i - 3, 643 - 150, i + 43, 643 - 150);
line(i + 40, 600 - 150, i + 43, 603 - 150);
line(i + 43, 603 - 150, i + 43, 643 - 150);
TCHAR ch[] = _T("Arial");
settextstyle(20, 0, ch);
k = (i - 300 + 100) / 50;
outtextxy(i + 10, 610 - 150, one[k]);
}
for (i = 800 - 100; i < 940 - 100; i = i + 50)
{
rectangle(i, 600 - 150, i + 40, 640 - 150); //键盘第一个字母坐标(800,550),(850,590)
line(i, 600 - 150, i - 3, 603 - 150);
line(i - 3, 603 - 150, i - 3, 643 - 150);
line(i, 640 - 150, i - 3, 643 - 150);
line(i + 40, 640 - 150, i + 43, 643 - 150);
line(i - 3, 643 - 150, i + 43, 643 - 150);
line(i + 40, 600 - 150, i + 43, 603 - 150);
line(i + 43, 603 - 150, i + 43, 643 - 150);
settextstyle(15, 0, ch);
k = (i - 800 + 100) / 50;
outtextxy(i + 5, 605 - 150, oneend[k]);
outtextxy(i + 20, 620 - 150, oneend1[k]);
}
for (j = 310 - 100; j < 760 - 100; j = j + 50)
{
rectangle(j, 650 - 150, j + 40, 690 - 150); //键盘第一个字母坐标(310,600),(350,640)
line(j, 650 - 150, j - 3, 653 - 150);
line(j - 3, 653 - 150, j - 3, 693 - 150);
line(j, 690 - 150, j - 3, 693 - 150);
line(j + 40, 690 - 150, j + 43, 693 - 150);
line(j - 3, 693 - 150, j + 43, 693 - 150);
line(j + 40, 650 - 150, j + 43, 653 - 150);
line(j + 43, 653 - 150, j + 43, 693 - 150);
TCHAR ch[] = _T("Arial");
settextstyle(20, 0, ch);
k = (j - 310 + 100) / 50;
outtextxy(j + 10, 660 - 150, two[k]);
}
for (j = 760 - 100; j < 850 - 100; j = j + 50)
{ // 310,600 350,640
rectangle(j, 650 - 150, j + 40, 690 - 150); //键盘第一个字母坐标(760,600),(800,640)
line(j, 650 - 150, j - 3, 653 - 150);
line(j - 3, 653 - 150, j - 3, 693 - 150);
line(j, 690 - 150, j - 3, 693 - 150);
line(j + 40, 690 - 150, j + 43, 693 - 150);
line(j - 3, 693 - 150, j + 43, 693 - 150);
line(j + 40, 650 - 150, j + 43, 653 - 150);
line(j + 43, 653 - 150, j + 43, 693 - 150);
settextstyle(20, 0, ch);
k = (j - 760 + 100) / 50;
outtextxy(j + 7, 655 - 150, three1[k]);
outtextxy(j + 20, 669 - 150, three2[k]);
}
rectangle(860 - 100, 650 - 150, 940 - 100, 690 - 150); //Enter(860,600),(940,640)
line(860 - 100, 650 - 150, 860 - 3 - 100, 653 - 150);
line(860 - 3 - 100, 653 - 150, 860 - 3 - 100, 693 - 150);
line(860 - 100, 690 - 150, 860 - 3 - 100, 693 - 150);
line(940 - 100, 690 - 150, 943 - 100, 693 - 150);
line(860 - 3 - 100, 693 - 150, 943 - 100, 693 - 150);
line(940 - 100, 650 - 150, 943 - 100, 653 - 150);
line(943 - 100, 653 - 150, 943 - 100, 693 - 150);
settextstyle(20, 0, ch);
TCHAR Enter[] = _T("Enter");
settextstyle(20, 0, ch);
outtextxy(870 - 100, 660 - 150, Enter);
for (m = 340 - 100; m < 690 - 100; m = m + 50)
{
rectangle(m, 700 - 150, m + 40, 740 - 150); //键盘第一个字母坐标(340,650),(380,690)
line(m, 700 - 150, m - 3, 703 - 150);
line(m - 3, 703 - 150, m - 3, 743 - 150);
line(m, 740 - 150, m - 3, 743 - 150);
line(m + 40, 740 - 150, m + 43, 743 - 150);
line(m - 3, 743 - 150, m + 43, 743 - 150);
line(m + 40, 700 - 150, m + 43, 703 - 150);
line(m + 43, 703 - 150, m + 43, 743 - 150);
TCHAR ch[] = _T("Arial");
settextstyle(20, 0, ch);
k = (m - 310 + 100) / 50;
outtextxy(m + 10, 710 - 150, three[k]);
}
for (m = 690 - 100; m < 830 - 100; m = m + 50)
{
rectangle(m, 700 - 150, m + 40, 740 - 150); //(690,650),(830,690)
line(m, 700 - 150, m - 3, 703 - 150);
line(m - 3, 703 - 150, m - 3, 743 - 150);
line(m, 740 - 150, m - 3, 743 - 150);
line(m + 40, 740 - 150, m + 43, 743 - 150);
line(m - 3, 743 - 150, m + 43, 743 - 150);
line(m + 40, 700 - 150, m + 43, 703 - 150);
line(m + 43, 703 - 150, m + 43, 743 - 150);
settextstyle(20, 0, ch);
k = (m - 690 + 100) / 50;
outtextxy(m + 5, 706 - 150, h1[k]);
outtextxy(m + 23, 717 - 150, h2[k]);
}
rectangle(840 - 100, 700 - 150, 940 - 100, 740 - 150); // Shift(840,650),(940,690)
line(840 - 100, 700 - 150, 840 - 3 - 100, 703 - 150);
line(840 - 3 - 100, 703 - 150, 840 - 3 - 100, 743 - 150);
line(840 - 100, 740 - 150, 840 - 3 - 100, 743 - 150);
line(940 - 100, 740 - 150, 943 - 100, 743 - 150);
line(840 - 3 - 100, 743 - 150, 943 - 100, 743 - 150);
line(940 - 100, 700 - 150, 943 - 100, 703 - 150);
line(943 - 100, 703 - 150, 943 - 100, 743 - 150);
settextstyle(20, 0, ch);
outtextxy(850 - 100, 710 - 150, Shift);
rectangle(420 - 100, 700 - 100, 690 - 100, 740 - 100);//空格键
line(420 - 100, 700 - 100, 420 - 3 - 100, 700 + 3 - 100);
line(420 - 3 - 100, 700 + 3 - 100, 420 - 3 - 100, 740 + 3 - 100);
line(420 - 3 - 100, 740 + 3 - 100, 420 - 100, 740 - 100);
line(420 - 3 - 100, 740 + 3 - 100, 690 + 3 - 100, 740 + 3 - 100);
line(690 + 3 - 100, 740 + 3 - 100, 690 - 100, 740 - 100);
line(690 - 100, 700 - 100, 690 + 3 - 100, 700 + 3 - 100);
line(690 + 3 - 100, 700 + 3 - 100, 690 + 3 - 100, 740 + 3 - 100);
for (m = 220 - 100; m < 420 - 100; m = m + 50)//空格键左边
{
rectangle(m, 700 - 100, m + 40, 740 - 100);//ctrl
line(m, 700 - 100, m - 3, 700 + 3 - 100);
line(m - 3, 700 + 3 - 100, m - 3, 740 + 3 - 100);
line(m - 3, 740 + 3 - 100, m, 740 - 100);
line(m - 3, 740 + 3 - 100, m + 40 + 3, 740 + 3 - 100);
line(m + 40, 740 - 100, m + 40 + 3, 743 - 100);
line(m + 40, 700 - 100, m + 40 + 3, 703 - 100);
line(m + 40 + 3, 703 - 100, m + 40 + 3, 743 - 100);
}
for (n = 700 - 100; n < 950 - 100; n = n + 50)
{
rectangle(n, 740 - 100, n + 40, 700 - 100);//右箭头键
line(n, 700 - 100, n - 3, 703 - 100);
line(n - 3, 703 - 100, n - 3, 743 - 100);
line(n - 3, 743 - 100, n + 40 + 3, 743 - 100);
line(n - 3, 743 - 100, n, 740 - 100);
line(n + 40, 700 - 100, n + 43, 703 - 100);
line(n + 43, 703 - 100, n + 43, 743 - 100);
line(n + 40, 740 - 100, n + 43, 743 - 100);
}
settextstyle(17, 0, ch);
TCHAR Ctrl[] = _T("Ctrl");
TCHAR Fn[] = _T("Fn");
TCHAR Win[] = _T("Win");
TCHAR Alt[] = _T("Alt");
TCHAR Home[] = _T("Hom");
TCHAR End[] = _T("End");
TCHAR Up[] = _T("Up");
outtextxy(130, 610, Ctrl);
outtextxy(180, 610, Fn);
outtextxy(230, 610, Win);
outtextxy(280, 610, Alt);
outtextxy(810, 610, End);
outtextxy(760, 610, Up);
outtextxy(705, 610, Home);
outtextxy(660, 610, Ctrl);
outtextxy(610, 610, Alt);
setfillcolor(COLORREF RGB(240, 230, 140));
fillrectangle(30, 30, 240, 80);
TCHAR pause[] = _T("退出游戏请按Ese");
settextstyle(25, 0, _T("宋体"));
setbkmode(TRANSPARENT);
outtextxy(30,45, pause);
//暂停判断
}
//开始菜单
void beginning()
{
IMAGE img; //准备图片
loadimage(&img, L"欢迎界面3.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径,也可以使用绝对路径
putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片
//cleardevice();
setfillcolor(COLORREF RGB(240, 230, 140));
fillrectangle(750, 130, 930, 190);
fillrectangle(750, 210, 930, 270);
TCHAR ch[] = _T("SNAP____");
settextstyle(40, 0, ch);
settextcolor(COLORREF RGB(30, 144, 255));
TCHAR begin[] = _T("开始游戏");
TCHAR go[] = _T("退出游戏");
setbkmode(TRANSPARENT);
outtextxy(750 + 10, 130 + 10, begin);
outtextxy(750 + 10, 210 + 10, go);
}
//开始菜单鼠标交互
void mouse()
{
initgraph(1000, 650);
beginning();
MOUSEMSG m;
while (1)
{
m = GetMouseMsg();
if (m.x >= 750 && m.x <= 930 && m.y >= 130 && m.y <= 190)//开始游戏
{
setlinecolor(RED);
rectangle(750, 130, 930, 190);
if (m.uMsg == WM_LBUTTONDOWN)
{
break;
}
}
else if (m.x >= 750 && m.x <= 930 && m.y >= 210 && m.y <= 270)//退出游戏
{
setlinecolor(RED);
rectangle(750, 210, 930, 270);
if (m.uMsg == WM_LBUTTONDOWN)
{
exit(0);
}
}
else
{
setlinecolor(WHITE);
rectangle(750, 130, 930, 190);
rectangle(750, 210, 930, 270);
}
}
closegraph();
}
//关卡设置
void level1()
{
mouse();//鼠标交会函数关闭了窗口
initgraph(1000, 650);
IMAGE img; //准备图片
loadimage(&img, L"关卡选择.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径
putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片
setfillcolor(COLORREF RGB(255, 192, 203));
fillrectangle(365, 230, 675, 280);
fillrectangle(365, 300, 675, 350);
fillrectangle(365, 370, 675, 420);
TCHAR ch[] = T("SNAP___");
settextstyle(30, 0, ch);
settextcolor(COLORREF RGB(30, 144, 255));
TCHAR first[] = _T("模式一:轻轻松松");
TCHAR second[] = _T("模式二:小菜一碟");
TCHAR go[] = _T("退出游戏");
setbkmode(TRANSPARENT);
outtextxy(415 - 50 + 30, 230 + 10, first);
outtextxy(415 - 50 + 30, 300 + 10, second);
outtextxy(415 - 50 + 10 + 30 + 50, 370 + 10, go);
MOUSEMSG m;
while (1)
{
m = GetMouseMsg();
if (m.x >= 365 && m.x <= 675 && m.y >= 230 && m.y <= 280)//开始游戏
{
setlinecolor(RED);
rectangle(365, 230, 675, 280);
if (m.uMsg == WM_LBUTTONDOWN)
{
break;
}
}
else if (m.x >= 365 && m.x <= 675 && m.y >= 300 && m.y <= 350)//退出游戏
{
setlinecolor(RED);
rectangle(365, 300, 675, 350);
if (m.uMsg == WM_LBUTTONDOWN)
{
break;
}
}
else if (m.x >= 365 && m.x <= 675 && m.y >= 370 && m.y <= 420)//退出游戏
{
setlinecolor(RED);
rectangle(365, 370, 675, 420);
if (m.uMsg == WM_LBUTTONDOWN)
{
exit(0);
}
}
else
{
setlinecolor(WHITE);
rectangle(365, 230, 675, 280);
rectangle(365, 300, 675, 350);
rectangle(365, 370, 675, 420);
}
}
closegraph();
}
//第一关游戏界面
void gamefirst()
{
char s[10] = { 0 };
char f[10] = { 0 };
int score = 0;
int wrong = 0;
//level();//也关闭了屏幕
initgraph(1000, 650);
keyboard();
loadResource();
//outtextimage(200, 200, 'S');
for (int i = 0; i < 5; i++)
{
initArraychar(array, i);
}
initgraph(1000, 650);//要去掉吗?
while (1)//文字下降
{
BeginBatchDraw();
keyboard();
for (int i = 0; i < 5; i++)
{
array[i].y += 10;
if (array[i].y >= 400)
{
initArraychar(array, i);
score -= 10;
wrong++;
}
}
for (int i = 0; i < 5; i++)
{
outtextimage(array[i].x, array[i].y, array[i].target);
}
if (_kbhit())
{
char userkey = _getch();//接收用户输入
for (int i = 0; i < 5; i++)
{
if (array[i].target == userkey || array[i].target == userkey - ('a' - 'A'))
{
score += 10;
initArraychar(array, i);
break;
}
}
if (userkey == 27)
{
break;
}
}
Sleep(100);
EndBatchDraw();
}
//closegraph();
//initgraph(1000, 650);
beginning();
Sleep(100);
}
void highlight(char c)//高亮
{
keyboard();
if (_kbhit())
{
char c = _getch();//接收用户输入
fillrectangle(x, y, x + 40, y + 40);
Sleep(20);
clearrectangle(x, y, x + 40, y + 40);
}
if (c >= 'A' && c <= 'Z')
{
c = c + 32;
if (c >= 'a' && c <= 'z') //若为小写
switch (c)
{
case 'q':
{
fillrectangle(200, 450, 200 + 40, 450 + 40);
Sleep(20);
clearrectangle(200, 450, 200 + 40, 450 + 40);
break;
}
case 'w':
{
fillrectangle(250, 450, 250 + 40, 450 + 40);
Sleep(20);
clearrectangle(250, 450, 250 + 40, 450 + 40);
break;
}
case 'e':
{
fillrectangle(300, 450, 300 + 40, 450 + 40);
Sleep(20);
clearrectangle(300, 450, 300 + 40, 450 + 40);
break;
}
case 'r':
{
fillrectangle(350, 450, 350 + 40, 450 + 40);
Sleep(20);
clearrectangle(350, 450, 350 + 40, 450 + 40);
break;
}//x = 350; y = 450; break;
case 't':
{
fillrectangle(400, 450, 400 + 40, 450 + 40);
Sleep(20);
clearrectangle(400, 450, 400 + 40, 450 + 40);
break;
}//x = 400; y = 450; break;
case 'y':
{
fillrectangle(450, 450, 450 + 40, 450 + 40);
Sleep(20);
clearrectangle(450, 450, 450 + 40, 450 + 40);
break;
}//x = 450; y = 450; break;
case 'u':
{
fillrectangle(500, 450, 500 + 40, 450 + 40);
Sleep(20);
clearrectangle(500, 450, 500 + 40, 450 + 40);
break;
}//x = 500; y = 450; break;
case 'i':
{
fillrectangle(550, 450, 550 + 40, 450 + 40);
Sleep(20);
clearrectangle(550, 450, 550 + 40, 450 + 40);
break;
}//x = 550; y = 450; break;
case 'o':
{
fillrectangle(600, 450, 600 + 40, 450 + 40);
Sleep(20);
clearrectangle(600, 450, 600 + 40, 450 + 40);
break;
}//x = 600; y = 450; break;
case 'p':
{
fillrectangle(650, 450, 650 + 40, 450 + 40);
Sleep(20);
clearrectangle(650, 450, 650 + 40, 450 + 40);
break;
}//x = 650; y = 450; break;
//case '[':x = 700; y = 450; break;
//case '{':x = 700; y = 450; break;
//case ']':x = 750; y = 450; break;
//case '}':x = 750; y = 450; break;
//case '|':x = 800; y = 450; break;
//case 'Cap':x = 120; y = 500; break;
case 'a':
{
fillrectangle(210, 500, 210 + 40, 500 + 40);
Sleep(20);
clearrectangle(210, 500, 210 + 40, 500 + 40);
break;
}//x = 210; y = 500; break;
case 's':
{
fillrectangle(260, 500, 260 + 40, 500 + 40);
Sleep(20);
clearrectangle(260, 500, 260 + 40, 500 + 40);
break;
}//x = 260; y = 500; break;
case 'd':
{
fillrectangle(310, 500, 310 + 40, 500 + 40);
Sleep(20);
clearrectangle(310, 500, 310 + 40, 500 + 40);
break;
}//x = 310; y = 500; break;
case 'f':
{
fillrectangle(360, 500, 360 + 40, 500 + 40);
Sleep(20);
clearrectangle(360, 500, 360 + 40, 500 + 40);
break;
}//x = 360; y = 500; break;
case 'g':
{
fillrectangle(410, 500, 410 + 40, 500 + 40);
Sleep(20);
clearrectangle(410, 500, 410 + 40, 500 + 40);
break;
}//x = 410; y = 500; break;
case 'h':
{
fillrectangle(460, 500, 460 + 40, 500 + 40);
Sleep(20);
clearrectangle(460, 500, 460 + 40, 500 + 40);
break;
}//x = 460; y = 500; break;
case 'j':
{
fillrectangle(510, 500, 510 + 40, 500 + 40);
Sleep(20);
clearrectangle(510, 500, 510 + 40, 500 + 40);
break;
}//x = 510; y = 500; break;
case 'k':
{
fillrectangle(560, 500, 560 + 40, 500 + 40);
Sleep(20);
clearrectangle(560, 500, 560 + 40, 500 + 40);
break;
}//x = 560; y = 500; break;
case 'l':
{
fillrectangle(610, 500, 610 + 40, 500 + 40);
Sleep(20);
clearrectangle(610, 500, 610 + 40, 500 + 40);
break;
}//x = 610; y = 500; break;
case 'z':
{
fillrectangle(240, 550, 240 + 40, 550 + 40);
Sleep(20);
clearrectangle(240, 550, 240 + 40, 550 + 40);
break;
}//x = 240; y = 550; break;
case 'x':
{
fillrectangle(290, 550, 290 + 40, 550 + 40);
Sleep(20);
clearrectangle(290, 550, 290 + 40, 550 + 40);
break;
}//x = 290; y = 550; break;
case 'c':
{
fillrectangle(340, 550, 340 + 40, 550 + 40);
Sleep(20);
clearrectangle(340, 550, 340 + 40, 550 + 40);
break;
}//x = 340; y = 550; break;
case 'v':
{
fillrectangle(390, 550, 390 + 40, 550 + 40);
Sleep(20);
clearrectangle(390, 550, 390 + 40, 550 + 40);
break;
}//x = 390; y = 550; break;
case 'b':
{
fillrectangle(440, 550, 440 + 40, 550 + 40);
Sleep(20);
clearrectangle(440, 550, 440 + 40, 550 + 40);
break;
}//x = 440; y = 550; break;
case 'n':
{
fillrectangle(490, 550, 490 + 40, 550 + 40);
Sleep(20);
clearrectangle(490, 550, 490 + 40, 550 + 40);
break;
}//x = 490; y = 550; break;
case 'm': {
fillrectangle(540, 550, 540 + 40, 550 + 40);
Sleep(20);
clearrectangle(540, 550, 540 + 40, 550 + 40);
break;
}
}
}
}
void InitTarget(TARGET words[], int n)//随机产生三个单词
{
settextstyle(20, 0, L"宋体");
TCHAR str[30][30] = { L"main", L"include", L"if", L"switch", L"break", L"char", L"void", L"continue",
L"for", L"while", L"do", L"int", L"unsigned", L"struct", L"static", L"malloc", L"free",
L"else", L"float", L"double", L"short", L"return", L"getchar", L"gets", L"include", L"realloc", L"pointer", L"default", L"long" };
//随机产生
wcscpy(words[n].str, str[rand() % 29]);
//判断重复
while (words[n].str == words[(n + 1) % 3].str || words[n].str == words[(n + 2) % 3].str)
{
wcscpy(words[n].str, str[rand() % 29]);
}
words[n].x = rand() % (900);
words[n].y = -20;
}
//设置分数
void drawscore()
{
settextcolor(RED);
settextstyle(30, 0, L"宋体");
outtextxy(800, 50,L"正确数:");
outtextxy_int(900, 50, "%d", right);
outtextxy(800, 100, L"失误数:");
outtextxy_int(900, 150, "%d", wrong);
outtextxy(800, 150, L"正确率:");
if (right + wrong == 0)
{
outtextxy_double(900, 250, "%.2lf%%", 0.00);
}
else
{
double sum = (right +wrong);
outtextxy_double(900, 250, "%.2lf%%", right/sum*100);
}
}
void gamesecond()//第二关天降单词
{
initgraph(1000, 650);
keyboard();
drawscore();
struct TARGET words[3];
for (int n = 0; n < 3; n++)
{
InitTarget(words, n);
words[n].y = -15 - n * 30;
}
int i=0;
while (1)
{
//cleardevice();
BeginBatchDraw();
keyboard();
drawscore();
int flagerror = 0;
for (int n = 0; n < 3; n++)
{
words[n].y += 2;
if (words[n].y > 400-30)//碰线处理
{
InitTarget(words, n);
}
}
for (int n = 0; n < 3; n++)//字母下落
{
settextcolor(RED);
settextstyle(30, 0, _T("宋体"));
outtextxy(words[n].x, words[n].y, LPCTSTR(words[n].str));
words[n].y += 2;
}
if (_kbhit())
{
//字符串变成字符处理
char target;//接受用户按键
if (target = _getch() != '\r')
{
userkey.str[i++] = target;
highlight(target);
}
else
{
for (i = 0; i < 3; i++)
{
if (wcscmp(userkey.str, words[i].str) == 0)
{
InitTarget(words, i);
right++;
flagerror = 1;
}
}
if (flagerror == 0)
{
wrong++;
}
i = 0;//易错,要重新初始化
userkey.x = 100;
memset(userkey.str, 0, 20);//防止覆盖
}
}
outtextxy(userkey.x, userkey.y, userkey.str);
Sleep(50);
EndBatchDraw();
}
}
void level()
{
mouse();//鼠标交会函数关闭了窗口
initgraph(1000, 650);
IMAGE img; //准备图片
loadimage(&img, L"关卡选择.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径
putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片
setfillcolor(COLORREF RGB(255, 192, 203));
fillrectangle(365, 230, 675, 280);
fillrectangle(365, 300, 675, 350);
fillrectangle(365, 370, 675, 420);
TCHAR ch[] = T("SNAP___");
settextstyle(30, 0, ch);
settextcolor(COLORREF RGB(30, 144, 255));
TCHAR first[] = _T("模式一:轻轻松松");
TCHAR second[] = _T("模式二:小菜一碟");
TCHAR go[] = _T("退出游戏");
setbkmode(TRANSPARENT);
outtextxy(415 - 50 + 30, 230 + 10, first);
outtextxy(415 - 50 + 30, 300 + 10, second);
outtextxy(415 - 50 + 10 + 30 + 50, 370 + 10, go);
MOUSEMSG m;
while (1)
{
m = GetMouseMsg();
if (m.x >= 365 && m.x <= 675 && m.y >= 230 && m.y <= 280)//模式一
{
setlinecolor(RED);
rectangle(365, 230, 675, 280);
if (m.uMsg == WM_LBUTTONDOWN)
{
gamefirst();
}
}
else if (m.x >= 365 && m.x <= 675 && m.y >= 300 && m.y <= 350)//模式二
{
setlinecolor(RED);
rectangle(365, 300, 675, 350);
if (m.uMsg == WM_LBUTTONDOWN)
{
//break;
gamesecond();
}
}
else if (m.x >= 365 && m.x <= 675 && m.y >= 370 && m.y <= 420)//退出游戏
{
setlinecolor(RED);
rectangle(365, 370, 675, 420);
if (m.uMsg == WM_LBUTTONDOWN)
{
exit(0);
}
}
else
{
setlinecolor(WHITE);
rectangle(365, 230, 675, 280);
rectangle(365, 300, 675, 350);
rectangle(365, 370, 675, 420);
}
}
closegraph();
}
//退出界面
void goodbye(time_t end, time_t start, int flag)
{
time_t timep;
int i = end - start;
char a[10] = { '\0' };
TCHAR s[100] = { 0 };
char ff[10] = { 0 };
TCHAR fff[100] = { 0 };
cleardevice();
setcolor(RED);
IMAGE img;
loadimage(&img, L"结束.jpg", 1000, 650);
putimage(0, 0, &img);
TCHAR style[] = _T("黑体");
settextstyle(40, 0, style);
TCHAR ch[] = _T("游戏时间:");
outtextxy(104, 180, ch);
TCHAR chf[] = _T("失败次数:");
outtextxy(654, 180, chf);
sprintf_s(a, "%d", i);
sprintf_s(ff, "%d", flag);
#ifdef UNICODE
MultiByteToWideChar(CP_ACP, 0, a, -1, s, 100);
#else
strcpy(a, s);
#endif
#ifdef UNICODE
MultiByteToWideChar(CP_ACP, 0, ff, -1, fff, 100);
#else
strcpy(ff, fff);
#endif
outtextxy(200, 220, s);
outtextxy(950, 220, fff);
_getch();
}
int main()
{
srand((unsigned)time(NULL));
initgraph(1000, 650);//新建窗口
setbkcolor(COLORREF RGB(255, 192, 203));
//cleardevice();
beginning();
level();
//gamefirst();
//keyboard();
//gamesecond();
drawscore();
_getch(); // 按任意键继续,千万不要删!!!!!!!
closegraph(); // 关闭绘图窗口
return 0;
}