Discuz! Board

 找回密码
 立即注册
查看: 970|回复: 0

程序

[复制链接]

17

主题

17

帖子

637

积分

高级会员

Rank: 4

积分
637
发表于 2024-1-28 16:29:45 | 显示全部楼层 |阅读模式
#include <graphics.h>
#include <time.h>
#include<bits/stdc++.h>
using namespace std;

void loadImage();
void draw();

key_msg keyMsg;

//数据文件
//const char* recordFile = "game_m.txt";
//图片文件位置
PIMAGE pimg_man[7];
PIMAGE pimg_board[11];
PIMAGE pimg_back;
PIMAGE pimg_over;
int mvx=5;
int cnt;
int step;
int bvy=-2;

struct man
{
        int state;//状态
        int act;//动作 图片选择
        int score;//分数
        int blood;//血量
        float vx,vy;//x,y方向速度
        float vx1;//传送带加成的速度
        float g;//加速度
        float x,y;//位置坐标
}m;

struct boards
{
        int type;//障碍的类型 0-2小  3-5大   6-8 h鸟/m鸟/l鸟
        int act;
        int step;//踩板 0未踩中
        float x,y;//位置坐标
        float vy;//上升速度
}board[9];

const char* imgFiles[20] =
{
        "resource\\SonicFall1.png",//0
        "resource\\SonicFall2.png",
        "resource\\SonicLeft1.png",
        "resource\\SonicLeft2.png",
        "resource\\SonicRight1.png",
        "resource\\SonicRight2.png",
        "resource\\SonicStand.png",//6
       
        "resource\\Stone.png",//0
        "resource\\TanHuang.png",//1
        "resource\\TanHuang2.png",
        "resource\\TanHuang3.png",
        "resource\\ChiPingTai.png",//4
        "resource\\ChuanSongDaiLeft1.png",//5
        "resource\\ChuanSongDaiLeft2.png",
        "resource\\ChuanSongDaiRight1.png",//7
        "resource\\ChuanSongDaiRight2.png",
        "resource\\Float1.png",//9
        "resource\\Float2.png",
        "resource\\zhongli.png"

};

int topScore, score, maxNum;//最高分 ,当前分,最大合成数


void loadImage()//图片载入
{
        //图 初始化
        for (int i = 0; i < 7; i++)
        {
                pimg_man[i] = newimage();
                getimage(pimg_man[i], imgFiles[i]);
        }
        for (int i = 0; i < 12; i++)
        {
                pimg_board[i] = newimage();
                getimage(pimg_board[i], imgFiles[i+7]);
        }
       
        pimg_back = newimage();
        getimage(pimg_back, "resource\\1000.png");
       
        pimg_over = newimage();
        getimage(pimg_over, "resource\\gameover2.png");
}

void start()//初始化
{
//关闭窗口不强制退出程序,以便进行游戏保存工作
//        setinitmode(INIT_RENDERMANUAL | INIT_NOFORCEEXIT, 100, 50);
       
        m.state=0;
        m.g=0.3;
        m.vx=0;
        m.vy=0;
        m.x=90;
        m.y=0;
        m.score=0;
        m.blood=50;
               
        initgraph(400,600);//图形初始化
        setbkcolor(WHITE);
        srand(time(0));//随机数初始化
        loadImage();//图片载入
       
        setcolor(DARKGRAY);
        setfont(20,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
        setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
        setcaption("是男人就下100层");//设置标题
       
        for (int i = 0; i < 9; i++)
        {
                if(i==0)
                {
                        board[i].x = 100;
                        board[i].type = 0;
                }       
                else
                {
                        board[i].x = rand()%300;
                        board[i].type = rand()%6;
                }
               
                board[i].y = 100*i+200;
                board[i].step = 0;
                //board[i].vy = -2;
               
        }
}

void draw()//图形绘制
{
        int temp=0;
       
        putimage_withalpha(NULL, pimg_back, 0, 0);//绘制背景
       
        for(int i=0;i<9;i++)//障碍物
        {
                if(board[i].act==2)        temp=4;
                else if(board[i].act==3)        temp=-6;
                else if(board[i].act==10)        temp=-10;
                else temp=0;
                putimage_withalpha(NULL, pimg_board[board[i].act], board[i].x, board[i].y+temp);
        }
        //putimage_withalpha(NULL, pimg_board[0], 200, 200);
        putimage_withalpha(NULL, pimg_man[m.act], m.x, m.y);//绘制,最后绘制防遮挡
        //游戏分数
        xyprintf(300,5,"血量:%d",m.blood);
        xyprintf(300,20,"分数:%d",m.score);

}


void man_kb_check()//按键检测
{
        while(kbmsg())
        {
                keyMsg = getkey();
                if(keyMsg.key == 's')        m.vy=5;
                if(keyMsg.key == 'w')        m.vy=-10;
                if(keyMsg.key == 'd')        m.vx=mvx;
                if(keyMsg.key == 'a')        m.vx=-mvx;
                if((keyMsg.key == key_left)&&(keyMsg.msg == key_msg_down))        m.vx=-mvx;
                else if((keyMsg.key == key_right)&&(keyMsg.msg == key_msg_down))        m.vx=mvx;
                else if(keyMsg.msg == key_msg_up) m.vx=0;                       
        }
}

void man_update()//数据更新
{
        //动作
        m.x+=(m.vx+m.vx1);
        m.y+=m.vy;
        m.vy+=m.g;
       
        if(cnt%10==0) m.score++;
        //if((cnt%20==0)&&(m.blood<100)) m.blood++;

       
        for (int i = 0; i < 9; i++)
        {
                if (m.x>board[i].x-32 && m.x<board[i].x+96 && //在板的上方
                        m.y>=board[i].y-32 && m.y < board[i].y)
                {
                        board[i].step=1;//踩中
                        step=1;
                        if(board[i].type == 0) //普通板
                        {
                                m.y = board[i].y-32;
                                m.vy = 0;
                        }
                        else if(board[i].type == 1) //弹簧板
                        {
                                m.vy = -10;
                        }
                        else if(board[i].type == 2) //尖刺板
                        {
                                m.y = board[i].y-32;
                                m.vy = 0;
                                if(cnt%5==0) m.blood--; //受伤
                        }
                        else if(board[i].type == 3) //左传送
                        {
                                m.y = board[i].y-32;
                                m.vy = 0;
                                m.vx1 = -2;
                        }       
                        else if(board[i].type == 4) //右传送
                        {
                                m.y = board[i].y-32;
                                m.vy = 0;
                                m.vx1 = 2;
                        }
                        else if(board[i].type == 5) //翻板
                        {
                                m.y = board[i].y-32;
                                m.vy = 0;
                        }        
                        else if(board[i].type == 7)
                        {
                                m.y = board[i].y-32;
                                m.vy = 0;
                                mvx=1;
                        }        
                        break;
                }
                else
                {
                        board[i].step=0;//未踩中
                        m.vx1=0;
                        step=0;
                        mvx=5;
                }
        }
       
        switch(m.state)
        {
                case 0://站立
                        m.act=6;        //动作       
                               
                        if(step==0) m.state=3;
                        else if(m.vx<0)        m.state=1;//状态
                        else if(m.vx>0) m.state=2;
                        break;
                case 1://向左
                        if(cnt%10<5) m.act=2;
                        else m.act=3;
                       
                        if(step==0) m.state=3;
                        else if(m.vx==0)        m.state=0;//状态
                        else if(m.vx>0) m.state=2;
                        break;
                case 2://向右
                        if(cnt%10<5)        m.act=4;
                        else m.act=5;
                       
                        if(step==0) m.state=3;
                        else if(m.vx==0)        m.state=0;//状态
                        else if(m.vx<0) m.state=1;
                        break;
                case 3://空中
                        if(cnt%10<5)        m.act=0;
                        else m.act=1;
                       
                        if(step==1) m.state=0;
                        break;
       
                default:break;
        }
}

void boardmove()
{
        for (int i = 0; i < 9; i++)
        {
                board[i].y += bvy;
                //如果已经超过边界,重新从屁股后面来
                if (board[i].y < 0)
                {
                        board[i].x = rand() %300;
                        board[i].y = 9*100;
                        //board[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
                        int y=rand()%100;
                        board[i].type=6;
        /*        if(y<80) board[i].type=1;
                else if(y<84) board[i].type=0;
                else if(y<88) board[i].type=5;
                else if(y<92) board[i].type=3;
                else if(y<96) board[i].type=4;
                else if(y<100) board[i].type=2;*/
                        board[i].step = 0;
                        bvy = -2-m.score/100;
                }
        }
}

void board_update()//挡板数据更新
{
        boardmove();
        for (int i = 0; i < 9; i++)
        {
                switch(board[i].type)
                {
                        case 0://普通板
                                board[i].act=0;        //动作
                        break;
                        case 1://弹簧板
                                if(board[i].step==1)
                                {
                                        if(cnt%10<5) board[i].act=2;
                                        else board[i].act=3;
                                }
                                else board[i].act=1;
                        break;
                        case 2://尖刺板
                                board[i].act=4;        //动作
                        break;
                        case 3://左传送带
                                if(cnt%10<5) board[i].act=5;
                                else board[i].act=6;
                        break;
                        case 4://右传送带
                                if(cnt%10<5) board[i].act=7;
                                else board[i].act=8;
                        break;
                        case 5://翻板 1
                                board[i].act=9;
                                if(board[i].step==1)
                                {
                                        board[i].type=7;
                                }
                        break;
                        case 7://翻板 2
                                board[i].act=10;
                        break;
                       
                       
                        case 6:
                                board[i].act=11;
                                break;
                        default:break;
                }
                //board[i].step=0;//踩中
        }
       
}

//坐标范围 与 障碍物坐标范围 重叠
bool gameover()//失败判定
{
        if(m.blood<=0 || m.y>700) return true;
        return false;
}
void loadRecord()
{
//        FILE* fp = fopen(recordFile, "r");
//
//        fscanf(fp, "topScore:%d",&topScore);
//        fclose(fp);
}

void gameSave()
{
//        //数据写入
//        FILE* fp = fopen(recordFile, "w");
//        if (fp == NULL)
//                return;
//        fprintf(fp, "topScore:%d",topScore);
//        fclose(fp);
}


int main()
{
        start();//初始化
        while(1)
        {
                man_kb_check();       
                man_update();
                board_update();
                cleardevice();
                draw();
                delay_fps(60);
                cnt++;
                if(gameover()) break;
        }
       
        Sleep(500);
//        setcolor(RED);
//        setfont(50,0,"幼圆");
//        xyprintf(100,200,"GAME OVER");
        putimage_withalpha(NULL, pimg_over, 75, 200);
        getch();

        return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-2-13 02:05 , Processed in 0.050349 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表