StarFight

这是一个使用C++实现的简单星战游戏模拟程序,其中包括了玩家控制、自动AI控制、碰撞检测等核心功能。游戏通过OpenGL进行图形渲染,并利用Windows API进行窗口管理和键盘事件处理。
#include <windows.h>
#include <gl/gl.h>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>

long double t,ti=0.00005,shotI=0.24,shotV=6,st1=0,st2=0,initr=0.016,
              bt=0.12,bt2=1.08,bombI=3.6,shotr=0.004,ac=2,AIv=2;
bool s1=0,s2=0,b1=0,b2=0;
double starsize=0.016,szsq2=starsize*sqrt(0.5),PId16=3.14159/16;
const int Player1=0,Player2=1,Star=16,Shot=32,Bomb=33,dead=-1;
typedef long double ldouble;
int move1=5,move2=5;

#define AdP2(a,b) ((a)*(a)+(b)*(b))

int p1id=0,p2id=1,l1=10,l2=10;

#define Rand_ld (((long double) (rand()&0x1ffff)-0x10000)/0x20000)

double* makexf() {
    double *Xf=new double[32];
    for(int i=0; i<32; Xf[i]=cos(PId16*i),++i);
    return Xf;
}
double* makeyf() {
    double *Xf=new double[32];
    for(int i=0; i<32; Xf[i]=sin(PId16*i),++i);
    return Xf;
}

double *xf=makexf(),*yf=makeyf();

typedef struct {
    double red,green,blue;
    long double m,x,y,vx,vy,r,I;
    int type,l;
} star;

void move(star &s) {
    s.x+=s.vx*ti;
    s.y+=s.vy*ti;
    bool gg=0;
    if(s.x<-1&&s.vx<0) {
        s.vx=-s.vx;
        gg=1;
    }
    if(s.y<-1&&s.vy<0) {
        s.vy=-s.vy;
        gg=1;
    }
    if(s.x>1&&s.vx>0) {
        s.vx=-s.vx;
        gg=1;
    }
    if(s.y>1&&s.vy>0) {
        s.vy=-s.vy;
        gg=1;
    }
    if(gg) {
        s.l--;
        if(s.type==Shot) s.x+=2333+Rand_ld*233;
    }
}


void attract(star &a,star &b) {
    long double d=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    if(d<=(a.r+b.r)*(a.r+b.r)) {
        ldouble x=b.x-a.x,y=b.y-a.y,I;
        if(a.type==Shot||b.type==Shot) {
            I=(a.I+b.I)/(sqrt(x*x+y*y)*a.m*b.m);
            if(I<=0) return;
            a.vx-=I*x*b.m;
            a.vy-=I*y*b.m;
            b.vx+=I*x*a.m;
            b.vy+=I*y*a.m;
            if(a.type&32) a.x+=2333;
            if(b.type&32) b.x+=2333;
            return;
        }
        I=(x*(a.vx-b.vx)+y*(a.vy-b.vy))*2/((x*x+y*y)*(a.m+b.m));
        if(I<0) return;
        a.vx-=I*x*b.m;
        a.vy-=I*y*b.m;
        b.vx+=I*x*a.m;
        b.vy+=I*y*a.m;
    } else {
        d*=sqrt(d);
        d=ti*0.02/d;
        a.vx+=b.m*(b.x-a.x)*d;
        b.vx+=a.m*(a.x-b.x)*d;
        a.vy+=b.m*(b.y-a.y)*d;
        b.vy+=a.m*(a.y-b.y)*d;
    }
}

void randstar(star& s,int i) {
    s.red=s.green=s.blue=0.0;
    if(i==p1id) {
        s.red=s.blue=1.0;
        s.m=0.5;
    } else if(i==p2id) {
        s.blue=s.green=1.0;
        s.m=0.5;
    } else {
        if(rand()%3==0) s.red=1.0;
        else if(rand()&1) s.green=1.0;
        else s.blue=1.0;
        s.m=Rand_ld+0.5;
    }
    s.x=Rand_ld*4;
    s.y=Rand_ld*4;
    s.vx=Rand_ld;
    s.vy=Rand_ld;
    s.r=initr;
    s.type=s.l=s.I=0;
}

class cosmos {
public:
    void set(int star_amount) {
        if(star_amount<1||star_amount>256) {
            return;
        }
        amount=star_amount;
        random_get();
    }

    void random_get() {
        for(int i=0; i<amount; ++i) {
            randstar(s[i],i);
        }
        set_mid();
        s2=true;
        s[3].m=5;
        s[3].r=initr*5;
        //s[2].blue=s[2].green=s[2].red=0.2;
        //s[2].m=100;
        s[2].r=initr/4;
        s[4].m=6;
        s[4].r=initr*7;
    }
    void set_mid() {
        long double sx=0.0,sy=0.0,svx=0.0,svy=0.0,sm=0.0;
        for(int i=0; i<amount; ++i) {
            sx+=s[i].x*s[i].m;
            sy+=s[i].y*s[i].m;
            svx+=s[i].vx*s[i].m;
            svy+=s[i].vy*s[i].m;
            sm+=s[i].m;
        }
        sx/=sm;
        sy/=sm;
        svx/=sm;
        svy/=sm;
        for(int i=0; i<amount; ++i) {
            s[i].x-=sx;
            s[i].y-=sy;
            s[i].vx-=svx;
            s[i].vy-=svy;
        }
    }

    void process(long double time) {
        for(; time>0; time-=ti) {
#if !TWOPLAYER
            if(s[1].vx<0&&s[1].x<0||s[1].x<-0.64||s[1].vx<-sqrt(AIv))
                s[1].vx+=ti*AIv;
            else if(s[1].vx>0&&s[1].x>0||s[1].x>.64||s[1].vx>sqrt(AIv))
                s[1].vx-=ti*AIv;
            if(s[1].y<0&&s[1].vy<0||s[1].y<-0.64||s[1].vy<-sqrt(AIv))
                s[1].vy+=ti*AIv;
            else if(s[1].y>0&&s[1].vy>0||s[1].y>0.64||s[1].vy>sqrt(AIv))
                s[1].vy-=ti*AIv;
            /*long double d=sqrt(s[1].x*s[1].x+s[1].y*s[1].y),v;
            v=sqrt(s[1].vx*s[1].vx+s[1].vy*s[1].vy);
            s[1].vx-=s[1].x/d*ti*AIv+s[1].vx/v*AIv;
            s[1].vy-=s[1].y/d*ti*AIv+s[1].vy/v*AIv;*/
#else
            switch(move2) {
            case 0:
                s[1].vy+=ti*ac;
                break;
            case 1:
                s[1].vy-=ti*ac;
                break;
            case 2:
                s[1].vx-=ti*ac;
                break;
            case 3:
                s[1].vx+=ti*ac;
                break;
            }
#endif
            switch(move1) {
            case 0:
                s[0].vy+=ti*ac;
                break;
            case 1:
                s[0].vy-=ti*ac;
                break;
            case 2:
                s[0].vx-=ti*ac;
                break;
            case 3:
                s[0].vx+=ti*ac;
                break;
            }
            t+=ti;
            if(s1&&t>st1+bt) {
                st1=t;
                if(b1) {
                    st1+=bt2;
                    b1=0;
                    shot(p1id,p2id,bombI);
                } else shot(p1id,p2id,shotI);
            }
            if(s2&&t>st2+bt) {
                st2=t;
                if(b2) {
                    b2=0;
                    st2+=bt2;
                    shot(p2id,p1id,bombI);
                } else shot(p2id,p1id,shotI);
            }
            for(int i=0; i<amount; ++i) {
                for(int j=i+1; j<amount; ++j) {
                    attract(s[i],s[j]);
                }
            }
            for(int i=0; i<amount; ++i) {
                if(s[i].x>233) {
                    amount--;
                    s[i].red=s[amount].red;
                    s[i].green=s[amount].green;
                    s[i].blue=s[amount].blue;
                    s[i].m=s[amount].m;
                    s[i].x=s[amount].x;
                    s[i].vx=s[amount].vx;
                    s[i].y=s[amount].y;
                    s[i].vy=s[amount].vy;
                    s[i].r=s[amount].r;
                }
                move(s[i]);
            }
        }
    }
    void output(HDC &hDC) {
        glClearColor (0.0, 0.0, 0.0, 0.0);
        glClear (GL_COLOR_BUFFER_BIT);
        double x,y,r;
        for(int i=0; i<amount; ++i) {
            glPushMatrix();

            glColor3d(s[i].red,s[i].green,s[i].blue);
            glBegin(GL_TRIANGLE_FAN);
            x=s[i].x;
            y=s[i].y;
            r=s[i].r;
            glVertex2d(x, y);
            for(int i=0; i<32; ++i) {
                glVertex2d(x+r*xf[i], y+r*yf[i]);
            }
            glVertex2d(x+r*xf[0], y+r*yf[0]);
            glEnd();
            glPopMatrix ();
        }
        SwapBuffers (hDC);
    }
    void shot(int i1,int i2,long double I) {
        s[amount].blue = s[amount].green = s[amount].red = 1.0;
        long double x=s[i2].x-s[i1].x,y=s[i2].y-s[i1].y,d;
        long double dt=(x*s[i2].vx+y*s[i2].vy);
dt+=sqrt(dt*dt+(x*x+y*y)*(shotV*shotV-s[i2].vx*s[i2].vx-s[i2].vy*s[i2].vy))
dt/=(shotV*shotV-s[i2].vx*s[i2].vx-s[i2].vy*s[i2].vy);
        x+=s[i2].vx*dt;
y+=s[i2].vy*dt;
d=sqrt(x*x+y*y);
        s[amount].x=s[i1].x+s[i1].r*x/d*1.9;
        s[amount].y=s[i1].y+s[i1].r*y/d*1.9;
        s[amount].vx=shotV*x/d;
        s[amount].vy=shotV*y/d;
        s[amount].m=0.00001;
        s[amount].I=I;
        s[amount].type=Shot;
        s[amount].r=I==shotI?shotr:shotr*2;
        s[amount].l=0;
        amount++;
    }
    star s[256];
    int amount;
};
#define TWOPLAYER 1
#include "starfight.h"

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

cosmos MyUniv;

#define p1 (MyUniv.s[0])
#define p2 (MyUniv.s[1])

const ldouble playera=0.05;

long double process_time=0.01;
/**************************
 * WinMain
 *
 **************************/

int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int iCmdShow) {
    srand(GetTickCount());
    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;
    MSG msg;
    BOOL bQuit = FALSE;

    /* register window class */
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "Star";
    RegisterClass (&wc);

    /* create main window */
    hWnd = CreateWindow (
              "Star", "Star",
              WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
              0, 0, 768, 768,
              NULL, NULL, hInstance, NULL);

    /* enable OpenGL for the window */
    EnableOpenGL (hWnd, &hDC, &hRC);
    MyUniv.set(3);
    /* program main loop */
    while (!bQuit) {
        /* check for messages */
        if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {
            /* handle or dispatch messages */
            if (msg.message == WM_QUIT) {
                bQuit = TRUE;
            } else {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        } else {
            /* OpenGL animation code goes here */
            if(process_time>0) {
                MyUniv.process(process_time);
                MyUniv.output(hDC);
                if(p1.l<-10) {
                    MyUniv.random_get();
                    process_time = 0.0001;
                    MessageBox(NULL,"","P2 WIN!",0);
                }
                if(p2.l<-10) {
                    MyUniv.random_get();
                    process_time = 0.0001;
                    MessageBox(NULL,"","P1 WIN!",0);
                }
            }
            Sleep (3);
        }
    }

    /* shutdown OpenGL */
    DisableOpenGL (hWnd, hDC, hRC);

    /* destroy the window explicitly */
    DestroyWindow (hWnd);

    return msg.wParam;
}


/********************
 * Window Procedure
 *
 ********************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam) {
    
    switch (message) {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage (0);
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN:
        switch (wParam) {
        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;
        case ' ':
            MyUniv.random_get();
            process_time = 0.0001;
            return 0;
        case VK_UP:
            process_time += 0.001;
            return 0;
        case VK_DOWN:
            if((process_time -= 0.001)<0.0) process_time=0.0;
            return 0;
        case 'Z':
            process_time += 0.0001;
            return 0;
        case 'X':
            if((process_time -= 0.0001)<0.0) process_time=0.0;
            return 0;
        case 'C':
            process_time= 0.0;
            return 0;
        case 'W':
            move1=0;
            return 0;
        case 'S':
            move1=1;
            return 0;
        case 'A':
            move1=2;
            return 0;
        case 'D':
            move1=3;
            return 0;
        case 'E':
            s1=!s1;
            return 0;
        case 'Q':
            b1=1;
            return 0;
#if TWOPLAYER
        case 'I':
            move2=0;
            return 0;
        case 'K':
            move2=1;
            return 0;
        case 'J':
            move2=2;
            return 0;
        case 'L':
            move2=3;
            return 0;
        case 'O':
            s2=!s2;
            return 0;
        case 'U':
            b2=1;
            return 0;
#endif
        case VK_LEFT:
            MyUniv.set(MyUniv.amount-1);
            return 0;
        case VK_RIGHT:
            MyUniv.set(MyUniv.amount+1);
            return 0;
        }
        return 0;

    default:
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
}


/*******************
 * Enable OpenGL
 *
 *******************/

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) {
    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;

    /* get the device context (DC) */
    *hDC = GetDC (hWnd);

    /* set the pixel format for the DC */
    ZeroMemory (&pfd, sizeof (pfd));
    pfd.nSize = sizeof (pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW |
                  PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 8;
    pfd.iLayerType = PFD_MAIN_PLANE;
    iFormat = ChoosePixelFormat (*hDC, &pfd);
    SetPixelFormat (*hDC, iFormat, &pfd);

    /* create and enable the render context (RC) */
    *hRC = wglCreateContext( *hDC );
    wglMakeCurrent( *hDC, *hRC );

}


/******************
 * Disable OpenGL
 *
 ******************/

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) {
    wglMakeCurrent (NULL, NULL);
    wglDeleteContext (hRC);
    ReleaseDC (hWnd, hDC);
}

 

转载于:https://www.cnblogs.com/TheName/p/6661570.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
Foodpanda 的全面记录,包含 6000 条精心整理的记录,涵盖了从客户人口统计信息到订单、支付、评价和配送细节的各个方面。它为数据分析师和研究人员提供了一个丰富的资源,可用于深入分析和洞察 Foodpanda 的业务运营和客户行为。 数据集内容客户人口统计信息:数据集详细记录了客户的年龄、性别、收入水平、地理位置等基本信息。这些信息有助于了解不同客户群体的特征,为精准营销和客户细分提供数据支持。 订单信息:每条记录都包含了订单的日期、时间、金额以及购买的商品或服务。通过分析这些数据,可以发现客户的购买习惯和偏好,例如哪些时间段是订单高峰期,哪些菜品最受欢迎。 支付信息:数据集中还包含了支付方式、支付状态和支付金额等信息。这些数据可以帮助分析不同支付方式的使用频率,以及支付成功率等关键指标。 评价信息:客户对订单、服务或产品的评分和评论也被记录在数据集中。这些评价数据对于情感分析和客户满意度研究至关重要,能够帮助 Foodpanda 了解客户的真实反馈,从而改进服务质量。 配送细节:数据集还详细记录了配送时间、配送地址和配送状态等信息。通过分析这些数据,可以优化配送路线和时间,提高客户满意度。 数据集的应用场景:客户行为分析:通过分析客户的购买习惯、偏好和评价,可以更好地了解客户需求,从而提供更个性化的服务。 客户流失预测:利用数据集中的客户行为和评价数据,可以构建模型预测哪些客户可能会流失,以便提前采取措施挽留。 客户细分:根据客户的人口统计信息和购买行为,可以将客户划分为不同的群体,为每个群体提供定制化的服务和营销策略。 销售趋势分析:通过分析订单数据,可以发现销售的增长或下降趋势,为业务决策提供依据。 情感洞察:通过分析客户的评价和评论,可以了解客户对产品或服务的情感倾向,及时发现潜在问题并加以改进。
极速 PDF 阅读器是一款轻量级且快捷的 PDF 阅读软件: 体积小巧快速:安装包体积仅有 5.4M,十分轻巧,占用内存极少。经过全面框架优化,启动速度快,能瞬间启动,渲染也更快速,可带来极速的阅读体验。 阅读模式多样:提供单页模式和书本模式两种个性化阅读模式,同时还具备全屏、幻灯片等功能,用户可随心切换,满足不同阅读场景和习惯。 目录提取便捷:能够自动提取文档目录并显示,方便用户通过查看目录快速定位自己需要的内容,提高阅读效率。 精准文本搜索:采用经过速度优化的文本搜索技术,可快速精准地搜索 PDF 文件中的内容,让用户能够轻松找到所需信息。 丰富注释功能:支持多种注释工具,如写字、高亮、下划线、箭头、画线、矩形、椭圆、删除线、波浪线等,方便用户在阅读过程中对重点内容进行标记和批注。 其他实用功能:通过双击页面产生十字箭头,调整其位置可使页面上下自动滚动阅读;支持多窗口 / 文档对比,便于真题内容与答案对比等;具备截图功能,可将重点内容以图片形式分享;还支持添加书签,且书签跟随 PDF 文档,发送给他人打开也依然存在。此外,软件还提供夜间模式、羊皮卷、柔和、护眼、书香、默认等 6 套背景模式,以及多皮肤模式,可满足用户不同的视觉需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值