关山月明 发表于 2020-7-23 11:59

C和easyx实现的弹球,请大佬指教

本帖最后由 关山月明 于 2020-7-23 12:06 编辑

#include<graphics.h>
#include<conio.h>
#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<tchar.h>
#include"mmsystem.h"//导入声音头文件
#pragma comment(lib,"winmm.lib")
#define High 480
#define Width 640

short int circle_x, circle_y;//移动圆的坐标位置
short int circle_vx, circle_vy;//移动圆移动速度
short int radius = 15;//移动半径

short int rectangle_left, rectangle_top, rectangle_right, rectangle_bottom;//矩形坐标
short int rectangle_left_v, rectangle_top_v,rectangle_right_v, rectangle_bottom_v;//矩形移动速度

short int static_circle_x, static_circle_y;//目标圆的坐标位置
short int static_circle_radius;

short int scores_t;//击中目标圆后的得分
TCHAR scores;
char         input;//用户操作AD


int main()
{

      PlaySound(L"D:\\FFOutput\\阿南亮子 - Refrain.wav", NULL, SND_FILENAME | SND_ASYNC);//B播放音乐文件
      initgraph(Width, High, NULL);//初始化图形
      IMAGE Background;//背景图形
      IMAGE img;//填充图形
      IMAGE Endimg;//结束画面

      srand((unsigned)time(NULL));//时间随机数

      circle_x = Width / 2;
      circle_y = High / 2;

      circle_vx = 1;
      circle_vy = 1;

      rectangle_left = 450;
      rectangle_top = 440;
      rectangle_right = 550;
      rectangle_bottom = 460;

      rectangle_left_v = 30;
      rectangle_right_v = 30;
      rectangle_top_v = 30;
      rectangle_bottom_v = 30;

      static_circle_x = 100;
      static_circle_radius = 15;
      static_circle_y = rand() % 350;//随机生成目标圆的y坐标来控制圆

      while (true)
      {
                BeginBatchDraw();
                setcolor(YELLOW);
                setfillcolor(GREEN);
                fillcircle(circle_x, circle_y, radius);
                //画第一个圆


                setcolor(YELLOW);
                setfillcolor(CYAN);
                fillcircle(static_circle_x, static_circle_y, static_circle_radius);
                //生成目标圆

                setcolor(RED);
                setfillcolor(RED);
                fillrectangle(rectangle_left, rectangle_top, rectangle_right, rectangle_bottom);
                //生成移动矩形

                settextcolor(LIGHTMAGENTA);
                outtextxy(0, 460, L"您的得分:");
                _stprintf_s(scores, _T("%d"), scores_t);
                outtextxy(100, 460, scores);
                settextcolor(LIGHTBLUE);
                outtextxy(0, 0, L"著作权拥有者:小唐");
                EndBatchDraw();
                //基本文字信息输出

                setcolor(BLACK);
                setfillcolor(BLACK);
                fillcircle(circle_x, circle_y, radius);
                //用背景色擦除画出的圆


                setcolor(BLACK);
                setfillcolor(BLACK);
                fillrectangle(rectangle_left, rectangle_top, rectangle_right, rectangle_bottom);
                //用背景色擦除画出的矩形

                //loadimage(&Background, _T("E:\\开发程序\\小小弹球\\2.jpg"), Width, High);
                putimage(0, 0, &Background);
                //用背景图不断填充

                circle_x = circle_x + circle_vx;
                circle_y = circle_y + circle_vy;
                //移动圆
                Sleep(5);

                if (_kbhit())
                {
                        input = _getch();
                        if (input == 'd')
                        {
                              rectangle_left += rectangle_left_v;
                              rectangle_right += rectangle_right_v;
                        }
                        else if (input == 'a')
                        {
                              rectangle_left -= rectangle_left_v;
                              rectangle_right -= rectangle_right_v;
                        }

                }//移动矩形

                if (circle_x<radius || circle_x>Width - radius)
                {
                        circle_vx = -circle_vx;
                }
                if ((circle_y > High - 40 - radius) && ((circle_x + radius) > rectangle_left && (circle_x + radius < rectangle_right)) || circle_y < radius)
                {
                        circle_vy = -circle_vy;
                }
                //边界碰撞检查


                if (circle_y + radius >= High)
                {
                        loadimage(&Endimg, _T("E:\\C和C++开发程序\\小小弹球\\1.jpg"), Width, High);
                        putimage(0, 0, &Endimg);
                        settextcolor(LIGHTMAGENTA);
                        outtextxy(Width / 2 - 80, High / 2, L"GAME OVER得分:");
                        outtextxy(Width / 2 + 50, High / 2, scores);
                        break;

                }
                //结束游戏并输出得分
                else if ((circle_x > (static_circle_x - static_circle_radius)) && (circle_x < (static_circle_x + static_circle_radius)) && ((circle_y - radius == static_circle_y
                        + static_circle_radius) || circle_y + radius == static_circle_y - static_circle_radius))
                {
                        printf("\a");
                        static_circle_y = rand() % 200;//随机生成目标圆的y坐标来控制圆
                        scores_t += 1;
                        setcolor(BLACK);
                        setfillcolor(BLACK);
                        fillcircle(static_circle_x, static_circle_y, static_circle_radius);
                }

      }


      _getch();
      closegraph();
      return 0;
}

因为这是之间写的了,有些图片和声音文件被清理了,所以就没有背景图和音乐了。第二个问题就是图像刷新太快了,这个我不清楚应该怎么解决,大佬知道的可以指点一二。:Dweeqw

由于写得很拙劣,中间实现还不是很完美,所以希望大家指点指点。
页: [1]
查看完整版本: C和easyx实现的弹球,请大佬指教