当前位置:   article > 正文

Easyx | 游戏实例:打字游戏_c语言打字游戏代码

c语言打字游戏代码

目录

目录

游戏简介

准备素材

开始编写

1 预编译

2 字母结构体

3 初始化字母

4 字母下落

不断下落

掉到底下

MoveLetter() 函数

5 绘制屏幕

字母

分数

Draw() 函数

6 判断按键

7 音乐、背景

音乐

背景

Main函数

效果截图

完整代码


游戏简介

屏幕中不断下落字母判断按下这个字母的按键,得分;字母掉下去扣分

上面这句话中,我们要给蓝色背景的字定义一个结构体,然后一步步实现红色字的内容。

代码思路

1. 字母结构体

2. 初始化字母

3. 字母下落(到底失分)

4. 绘制屏幕

5. 判断按键(得分)

6. 音乐、背景(可加可不加)

准备素材

背景图:

(偷偷说一件事:我的这些背景图,都是在 Scratch 上截的) 

音效也是在 Scratch 上导出的……

开始编写

1 预编译

  1. #include <stdio.h>
  2. #include <graphics.h>
  3. #include <conio.h>
  4. #include <time.h>
  5. #include <mmsystem.h>
  6. #pragma comment(lib, "winmm.lib") // 音乐
  7. #define WIDTH 640
  8. #define HEIGHT 480
  9. #define MAX_LETTER 10
  10. #define SPEED 2

2 字母结构体

x x坐标

y y坐标

speed 下落速度

ch 字母

  1. struct Letter
  2. {
  3. int x;
  4. int y;
  5. char ch;
  6. };

3 初始化字母

定义宏 MAX_LETTER 表示字母的数量。

定义 letter[MAX_LETTER] 表示所有字母的一维数组。

Letter letter[MAX_LETTER];

x坐标:25 ~ 615 的随机数

y坐标:-480 ~ 0 的随机数

字母:利用 ASCII码 取 A ~ Z 的随机数

  1. // 初始化字母
  2. void SetLetter()
  3. {
  4. for (int i = 0; i < MAX_LETTER; i++)
  5. {
  6. letter[i].x = rand() % (WIDTH - 50) + 25;
  7. letter[i].y = rand() % HEIGHT - HEIGHT;
  8. letter[i].ch = rand() % 26 + 'A';
  9. }
  10. }

4 字母下落

不断下落

只要增加每个字母的y坐标就行了。

  1. for (int i = 0; i < MAX_LETTER; i++)
  2. {
  3. letter[i].y += SPEED;
  4. }

掉到底下

判断字母的y坐标,如果大于屏幕高度,扣分,并且重新初始化这个字母。

  1. if (letter[i].y >= HEIGHT)
  2. {
  3. score--;
  4. letter[i].x = rand() % (WIDTH - 50) + 25;
  5. letter[i].y = rand() % HEIGHT - HEIGHT;
  6. letter[i].ch = rand() % 26 + 'A';
  7. }

MoveLetter() 函数

  1. // 移动字母
  2. void MoveLetter()
  3. {
  4.     for (int i = 0; i < MAX_LETTER; i++)
  5.     {
  6.         letter[i].y += SPEED;
  7.         if (letter[i].y >= HEIGHT)
  8.         {
  9.             score--;
  10.             letter[i].x = rand() % (WIDTH - 50) + 25;
  11.             letter[i].y = rand() % HEIGHT - HEIGHT;
  12.             letter[i].ch = rand() % 26 + 'A';
  13.         }
  14.     }
  15. }

5 绘制屏幕

字母

setbkmode 函数设置字母背景的样子,这里用 TRANSPARENT 设为透明。

  1. for (int i = 0; i < MAX_LETTER; i++)
  2. {
  3. settextstyle(50, 20, "HandelGothic BT");
  4. setbkmode(TRANSPARENT);
  5. outtextxy(letter[i].x, letter[i].y, letter[i].ch);
  6. }

分数

sprintf_s 函数:格式化输出到一个字符数组里。

  1. char text[20];
  2. sprintf_s(text, "Score: %d", score);
  3. settextstyle(50, 20, "Arial");
  4. outtextxy(20, 20, text);

Draw() 函数

  1. // 绘制屏幕
  2. void Draw()
  3. {
  4. putimage(0, 0, &bk_img);
  5. for (int i = 0; i < MAX_LETTER; i++)
  6. {
  7. settextstyle(50, 20, "HandelGothic BT");
  8. setbkmode(TRANSPARENT);
  9. outtextxy(letter[i].x, letter[i].y, letter[i].ch);
  10. }
  11. char text[20];
  12. sprintf_s(text, "Score: %d", score);
  13. settextstyle(50, 20, "Arial");
  14. outtextxy(20, 20, text);
  15. }

6 判断按键

  1. // 用户输入
  2. void GetKey()
  3. {
  4. if (_kbhit())
  5. {
  6. char input = _getch();
  7. input = input - 'a' + 'A';
  8. for (int i = 0; i < MAX_LETTER; i++)
  9. {
  10. if (input == letter[i].ch)
  11. {
  12. score++;
  13. letter[i].x = rand() % (WIDTH - 50) + 25;
  14. letter[i].y = rand() % HEIGHT - HEIGHT;
  15. letter[i].ch = rand() % 26 + 'A';
  16. }
  17. }
  18. }
  19. }

7 音乐、背景

音乐

Playsound 函数:

BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);

pszSound : 音乐文件路径,只能是 .wav 类型

hmod : 一般直接写 NULL ,不用管

fdwSound : 声音播放模式 ,常用:

        SND_ASYNC 异步播放

        SND_LOOP 循环播放

        SND_NOSTOP 不打断原来的声音

在开始时 :PlaySound(".\\Bgm.wav", NULL, SND_ASYNC | SND_LOOP);

得分时:PlaySound(".\\Get.wav", NULL, SND_ASYNC | SND_NOSTOP);

按下空格 关闭 / 打开 音乐

  1. if (input == ' ')
  2. {
  3. if (isMusic)
  4. {
  5. PlaySound(NULL, NULL, NULL);
  6. isMusic = false;
  7. }
  8. else
  9. {
  10. PlaySound(".\\Bgm.wav", NULL, SND_ASYNC | SND_LOOP);
  11. isMusic = true;
  12. }
  13. }

背景

主函数:loadimage(&bk_img, ".\\Background.png", WIDTH, HEIGHT, true);

Draw函数:putimage(0, 0, &bk_img);

Main函数

  1. int main()
  2. {
  3. initgraph(WIDTH, HEIGHT);
  4. srand(time(NULL));
  5. loadimage(&bk_img, ".\\Background.png", WIDTH, HEIGHT, true);
  6. PlaySound(".\\Bgm.wav", NULL, SND_ASYNC | SND_LOOP);
  7. SetLetter();
  8. BeginBatchDraw();
  9. while (true)
  10. {
  11. Draw();
  12. MoveLetter();
  13. GetKey();
  14. FlushBatchDraw();
  15. Sleep(10);
  16. }
  17. EndBatchDraw();
  18. closegraph();
  19. return 0;
  20. }

效果截图

完整代码

  1. /*
  2. * 项目名称:打字游戏
  3. * 开发环境:vs2022 + easyx
  4. * 作者:轩
  5. * 代码长度:131 行
  6. * 完成时间:2023.1.1
  7. * 用时:1 小时
  8. */
  9. #include <stdio.h>
  10. #include <graphics.h>
  11. #include <conio.h>
  12. #include <time.h>
  13. #include <mmsystem.h>
  14. #pragma comment(lib, "winmm.lib")
  15. #define WIDTH 640
  16. #define HEIGHT 480
  17. #define MAX_LETTER 10
  18. #define SPEED 2
  19. struct Letter
  20. {
  21. int x;
  22. int y;
  23. char ch;
  24. };
  25. IMAGE bk_img;
  26. Letter letter[MAX_LETTER];
  27. int score = 0; // 感谢 @ m0_74294396 提出的问题
  28. bool isMusic = true;
  29. // 初始化字母
  30. void SetLetter()
  31. {
  32. for (int i = 0; i < MAX_LETTER; i++)
  33. {
  34. letter[i].x = rand() % (WIDTH - 50) + 25;
  35. letter[i].y = rand() % HEIGHT - HEIGHT;
  36. letter[i].ch = rand() % 26 + 'A';
  37. }
  38. }
  39. // 绘制屏幕
  40. void Draw()
  41. {
  42. putimage(0, 0, &bk_img);
  43. for (int i = 0; i < MAX_LETTER; i++)
  44. {
  45. settextstyle(50, 20, "HandelGothic BT");
  46. setbkmode(TRANSPARENT);
  47. outtextxy(letter[i].x, letter[i].y, letter[i].ch);
  48. }
  49. char text[20];
  50. sprintf_s(text, "Score: %d", score);
  51. settextstyle(50, 20, "Arial");
  52. outtextxy(20, 20, text);
  53. }
  54. // 移动字母
  55. void MoveLetter()
  56. {
  57. for (int i = 0; i < MAX_LETTER; i++)
  58. {
  59. letter[i].y += SPEED;
  60. if (letter[i].y >= HEIGHT)
  61. {
  62. score--;
  63. letter[i].x = rand() % (WIDTH - 50) + 25;
  64. letter[i].y = rand() % HEIGHT - HEIGHT;
  65. letter[i].ch = rand() % 26 + 'A';
  66. }
  67. }
  68. }
  69. // 用户输入
  70. void GetKey()
  71. {
  72. if (_kbhit())
  73. {
  74. char input = _getch();
  75. if (input == ' ')
  76. {
  77. if (isMusic)
  78. {
  79. PlaySound(NULL, NULL, NULL);
  80. isMusic = false;
  81. }
  82. else
  83. {
  84. PlaySound(".\\Bgm.wav", NULL, SND_ASYNC | SND_LOOP);
  85. isMusic = true;
  86. }
  87. }
  88. input = input - 'a' + 'A';
  89. for (int i = 0; i < MAX_LETTER; i++)
  90. {
  91. if (input == letter[i].ch)
  92. {
  93. score++;
  94. PlaySound(".\\Get.wav", NULL, SND_ASYNC | SND_NOSTOP);
  95. letter[i].x = rand() % (WIDTH - 50) + 25;
  96. letter[i].y = rand() % HEIGHT - HEIGHT;
  97. letter[i].ch = rand() % 26 + 'A';
  98. }
  99. }
  100. }
  101. }
  102. int main()
  103. {
  104. initgraph(WIDTH, HEIGHT);
  105. srand(time(NULL));
  106. loadimage(&bk_img, ".\\Background.png", WIDTH, HEIGHT, true);
  107. PlaySound(".\\Bgm.wav", NULL, SND_ASYNC | SND_LOOP);
  108. SetLetter();
  109. BeginBatchDraw();
  110. while (true)
  111. {
  112. Draw();
  113. MoveLetter();
  114. GetKey();
  115. FlushBatchDraw();
  116. Sleep(10);
  117. }
  118. EndBatchDraw();
  119. closegraph();
  120. return 0;
  121. }

感谢 @ m0_74294396 提出的问题,已修改!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号