Funcode桌球游戏源代码(可直接复制运行)

一、实验要求

玩家通过移动球杆到单一的桌球处碰撞桌球运动,当桌球于一定速度通过桌面右方的同样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。要求如下:

1 游戏的初始界面如图,其中左边有一个体积较小的桌球,其x方向位置固定,y方向位置随机。右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边的桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新球。

2 球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。桌球的前进方向有一段指示球运动方向的虚线。

3 右侧的球洞以移动的频率不断更换位置。球洞的x左边不变,更换的是y坐标的位置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到第一个球洞位置。所以的这些动作都要在一个频率的时间里面完成。因此当游戏一某一个频率进行的时候,右侧的球洞就能实现循环变化的效果。

4 球碰撞到桌面边沿的时候以发射角的角度弹走。

5 球进洞的判断是球以一定的速度通过同样颜色的球洞时,桌球消失,表明球进洞了,此时左侧随机生成新球。球运动到球洞的速度不能太大,太大则球直接运动过球洞,速度太小,则球同样不进洞。

二、代码

LessonX.h:

/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>

/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class    CGameMain
{
private:
    int                m_iGameState;
    int m_iPlayState;// 操作状态,0 -- 可以点击鼠标打球;1 -- 球在运动中,等待下次打球机会
    int m_iBallNumber;    // 每局从0-7随机一个颜色图片,作为本局的球
    float            m_fOldRotation;        // 球杆的初始朝向,用于球杆复位
    CSprite*        m_spBall[8];            // 8个球的精灵
    CSprite*        m_spBallCue;                //球杆精灵
    int m_iHoleNumber[8];
    CSprite*        m_spBallHole[8];        // 8个球洞的精灵
    float            m_fHoleRollTime;    

    float    m_fRotateTime;// 球杆拍下时,做个角度旋转,持续一小段时间,模拟拍下的动作

    CSprite*        m_spVerSide[2];        //桌球台上下边沿精灵
    CSprite*        m_spHorSide[2];        //桌球台左右边沿精灵
public:
    CGameMain();            //构造函数
    ~CGameMain();           //析构函数  

    // Get方法
    int                GetGameState()                                            { return m_iGameState; }
    
    // Set方法
    void            SetGameState( const int iState )                { m_iGameState    =    iState; }
    
    // 游戏主循环等
    void            GameMainLoop( float    fDeltaTime );
    void            GameInit();
    void            GameRun( float fDeltaTime );
    void            GameEnd();
    void    OnMouseMove( const float fMouseX, const float fMouseY );//参数即为鼠标X,Y坐标的值
    void    OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );

    void    OnSpriteColSprite( const char szSrcName[], const char szTarName[] );
};

/
// 
extern CGameMain    g_GameMain;

#endif // _LESSON_X_H_

LessonX.cpp:

/
//
//
//
//
/
#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>

/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class    CGameMain
{
private:
    int                m_iGameState;
    int m_iPlayState;// 操作状态,0 -- 可以点击鼠标打球;1 -- 球在运动中,等待下次打球机会
    int m_iBallNumber;    // 每局从0-7随机一个颜色图片,作为本局的球
    float            m_fOldRotation;        // 球杆的初始朝向,用于球杆复位
    CSprite*        m_spBall[8];            // 8个球的精灵
    CSprite*        m_spBallCue;                //球杆精灵
    int m_iHoleNumber[8];
    CSprite*        m_spBallHole[8];        // 8个球洞的精灵
    float            m_fHoleRollTime;    

    float    m_fRotateTime;// 球杆拍下时,做个角度旋转,持续一小段时间,模拟拍下的动作

    CSprite*        m_spVerSide[2];        //桌球台上下边沿精灵
    CSprite*        m_spHorSide[2];        //桌球台左右边沿精灵
public:
    CGameMain();            //构造函数
    ~CGameMain();           //析构函数  

    // Get方法
    int                GetGameState()                                            { return m_iGameState; }
    
    // Set方法
    void            SetGameState( const int iState )                { m_iGameState    =    iState; }
    
    // 游戏主循环等
    void            GameMainLoop( float    fDeltaTime );
    void            GameInit();
    void            GameRun( float fDeltaTime );
    void            GameEnd();
    void    OnMouseMove( const float fMouseX, const float fMouseY );//参数即为鼠标X,Y坐标的值
    void    OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY );

    void    OnSpriteColSprite( const char szSrcName[], const char szTarName[] );
};

/
// 
extern CGameMain    g_GameMain;

#endif // _LESSON_X_H_

Main.cpp

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
#include "CommonClass.h"
#include "LessonX.h"

///
//
// 主函数入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    // 初始化游戏引擎
    if( !CSystem::InitGameEngine( hInstance, lpCmdLine ) )
        return 0;

    // To do : 在此使用API更改窗口标题
    CSystem::SetWindowTitle("LessonX");

    // 引擎主循环,处理屏幕图像刷新等工作
    while( CSystem::EngineMainLoop() )
    {
        // 获取两次调用之间的时间差,传递给游戏逻辑处理
        float    fTimeDelta    =    CSystem::GetTimeDelta();

        // 执行游戏主循环
        g_GameMain.GameMainLoop( fTimeDelta );
    };

    // 关闭游戏引擎
    CSystem::ShutdownGameEngine();
    return 0;
}

//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
void CSystem::OnMouseMove( const float fMouseX, const float fMouseY )
{
    // 可以在此添加游戏需要的响应函数
    g_GameMain.OnMouseMove(fMouseX,fMouseY);

}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
void CSystem::OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
    // 可以在此添加游戏需要的响应函数
    g_GameMain.OnMouseClick(iMouseType,fMouseX,fMouseY );

}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
void CSystem::OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{
    // 可以在此添加游戏需要的响应函数

}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// bAltPress bShiftPress bCtrlPress 分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键
void CSystem::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{
    // 可以在此添加游戏需要的响应函数
    
}
//==========================================================================
//
// 引擎捕捉键盘弹起消息后,将调用到本函数
void CSystem::OnKeyUp( const int iKey )
{
    // 可以在此添加游戏需要的响应函数

}

//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
void CSystem::OnSpriteColSprite( const char *szSrcName, const char *szTarName )
{
    g_GameMain.OnSpriteColSprite(szSrcName,szTarName);
}

//===========================================================================
//
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// iColSide : 0 左边,1 右边,2 上边,3 下边
void CSystem::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{
    
}

源文件下载地址:https://pan.xunlei.com/s/VMiuDZoaYO1UnDucR0VpLH4EA1

提取码:ba59

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,以下是一个简单的用 C 语言编写的台游戏代码。请您在 Dev-C++ 编辑器中打开一个新的源文件,将以下代码复制进去,然后保存并运行即可。 ``` #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define PI 3.1415926 #define WIDTH 480 #define HEIGHT 640 #define BALL_RADIUS 20 #define BALL_DIAMETER 40 #define BALL_SPEED 10 int ball_x = WIDTH / 2 - BALL_RADIUS; // 的初始位置 int ball_y = HEIGHT / 2 - BALL_RADIUS; int ball_dir = 0; // 的初始运动方向 int ball_speed = BALL_SPEED; // 的初始速度 int ball_color = 4; // 的初始颜色 int score = 0; // 得分 int left, right, top, bottom; // 子的边界 void draw_ball() { setcolor(ball_color); setfillstyle(1, ball_color); fillellipse(ball_x, ball_y, BALL_RADIUS, BALL_RADIUS); } void erase_ball() { setcolor(0); setfillstyle(1, 0); fillellipse(ball_x, ball_y, BALL_RADIUS, BALL_RADIUS); } void move_ball() { erase_ball(); double rad = ball_dir * PI / 180.0; ball_x += ball_speed * cos(rad); ball_y += ball_speed * sin(rad); if (ball_x <= left + BALL_RADIUS || ball_x >= right - BALL_RADIUS) { ball_dir = 180 - ball_dir; ball_x += ball_speed * cos(rad); ball_y += ball_speed * sin(rad); } if (ball_y <= top + BALL_RADIUS || ball_y >= bottom - BALL_RADIUS) { ball_dir = -ball_dir; ball_x += ball_speed * cos(rad); ball_y += ball_speed * sin(rad); } draw_ball(); } int main() { initgraph(WIDTH, HEIGHT); srand((unsigned)time(NULL)); left = WIDTH / 4; right = WIDTH * 3 / 4; top = HEIGHT / 4; bottom = HEIGHT * 3 / 4; draw_ball(); while (1) { if (kbhit()) { char ch = getch(); if (ch == 'q') break; } move_ball(); delay(50); } closegraph(); return 0; } ``` 这是一个简单的模拟台运动的游戏,您可以根据自己的需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值