天天看點

2021-10-21今天給大家分享一個“奔跑吧,火柴人”的遊戲項目,希望大家喜歡,謝謝大家的支援!!!

今天給大家分享一個“奔跑吧,火柴人”的遊戲項目,希望大家喜歡,謝謝大家的支援!!!

    廢話不多說,直接進代碼

首先我們先要先進行一個全局變量

/******全局變量******/
#define STEPDISTANCE	6		// 一步的距離。數值越大,移動速度越快
#define JUMPSPEED		10		// 數值越小,跳得越遠
#define ROLLDISTANCE	30		// 滾動的總步數。數值越大,滾得越遠

/******全局變量******/
int s_v		= STEPDISTANCE;		//障礙物和人物移動速度
int p_v		= JUMPSPEED;		//人物跳躍速度
int score	= 0;				//分數
int	max_s	= 0;
char keydown;					//按鍵值
           

然後對障礙物進行設定

// 障礙物類型
void zhangai::style()
{
	int a;
	srand((unsigned int) time(NULL));
	a = rand() % 5 + 1;
	switch(a)
	{
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
			top = 330;
			bottom = 361;
			break;
		case 5:
			top = 260;
			bottom = 291;
			break;
	}
}

//障礙物初始化
void zhangai::draw(int l,int t,int ri,int b)
{
	left=l;
	top=t;
	right=ri;
	bottom=b;
	solidrectangle(l, t, ri, b);
}
           

人物類以及初始化

/**************************************人物類***********************************/
class people
{
public:
	int i;					// 控制人物移動幀數
	int b;					// 控制人物滾動幀數
	int b1;					// 控制人物滾動時間
	int j;					// 人物跳躍上升的速度
	int k;					// 人物下降的速度
	int left;
	int top;
	int right;
	int bottom;

private:
	IMAGE img1[8];			// 人物圖像
	IMAGE img2[8];			// 滾動圖像
	IMAGE img3;				// 跳躍圖像

public:
	people();				// 構造函數
	void jump();			// 人物跳躍
	void move();			// 人物移動
	void roll();			// 人物滾動
	bool impact(zhangai *ps);			// 碰撞
} p;

// 構造函數
people::people()
{
	// 加載跑動圖像
	loadimage(&img1[0], _T("rc\\picture\\move8_1.jpg"), 70, 100);
	loadimage(&img1[1], _T("rc\\picture\\move8_2.jpg"), 70, 100);
	loadimage(&img1[2], _T("rc\\picture\\move8_3.jpg"), 70, 100);
	loadimage(&img1[3], _T("rc\\picture\\move8_4.jpg"), 70, 100);
	loadimage(&img1[4], _T("rc\\picture\\move8_5.jpg"), 70, 100);
	loadimage(&img1[5], _T("rc\\picture\\move8_6.jpg"), 70, 100);
	loadimage(&img1[6], _T("rc\\picture\\move8_7.jpg"), 70, 100);
	loadimage(&img1[7], _T("rc\\picture\\move8_8.jpg"), 70, 100);

	// 加載滾動圖像
	loadimage(&img2[0], _T("rc\\picture\\gun8_1.jpg"), 50, 50);
	loadimage(&img2[1], _T("rc\\picture\\gun8_2.jpg"), 50, 50);
	loadimage(&img2[2], _T("rc\\picture\\gun8_3.jpg"), 50, 50);
	loadimage(&img2[3], _T("rc\\picture\\gun8_4.jpg"), 50, 50);
	loadimage(&img2[4], _T("rc\\picture\\gun8_5.jpg"), 50, 50);
	loadimage(&img2[5], _T("rc\\picture\\gun8_6.jpg"), 50, 50);
	loadimage(&img2[6], _T("rc\\picture\\gun8_7.jpg"), 50, 50);
	loadimage(&img2[7], _T("rc\\picture\\gun8_8.jpg"), 50, 50);

	// 加載跳躍圖像
	loadimage(&img3, _T("rc\\picture\\move8_5.jpg"), 70, 100);
}
           

//人物跳躍

void people::jump()

{

    if(j >= 70)            //上升

    {

        putimage(left,j, &img3);

        clearrectangle(40,j+100,120,j+120);

        p.top = j;

        p.bottom = p.top  + 120;

        j=j-p_v;

        k=j;

    }

    else if(k <= 240)        //下降

    {

        putimage(left,k+20, &img3);

        clearrectangle(40,70,120,k+20);

        p.top = k;

        p.bottom = p.top  + 120;

        k=k+p_v;

    }

}

//人物移動

void people::move()

{

    putimage(50, 260, &img1[p.i]);

    p.left    = 50;

    p.top    = 240;

    p.right    = p.left + 65;

    p.bottom= p.top  + 120;

    p.i++;                // 改變人物幀數

    if(p.i == 8)        // 人物循環移動

    {

        p.i = 0;

    }

}

//人物滾動

void people::roll()

{

    putimage(50, 300, &img2[p.b]);

    p.left=50;

    p.top =300;

    p.right = p.left + 50;

    p.bottom = p.top + 50;

    p.b1++;

    p.b++;                // 改變人物滾動幀數

    if(p.b==8)            // 人物循環滾動

    {

        p.b=0;

    }

}

分數以及碰撞檢測

// 讀取最高分
void max_score()
{
	int value;
	ifstream infile("score.txt", ios::in);
	
	if(!infile)
	{
		cerr << "open error!" << endl;
		exit(1);
	}
	infile>>value;
	infile.close();
	max_s = value;
}

// 改變最高分
void change_score()
{
	int value;
	ifstream infile("score.txt", ios::in);
	
	if(!infile)
	{
		cerr << "open error!" << endl;
		exit(1);
	}
	infile>>value;
	infile.close();
	if(score>value)
	{
		gave_score();
	}
}

// 遊戲結束
void game_over()
{
	FlushMouseMsgBuffer();		//清空滑鼠緩存區
	change_score();
	Sleep(1000);
	p.i = 0;
	cleardevice();

	Login();
}

// 碰撞
void pengzhuang()
{
	// 指向目前障礙的指針
	zhangai *ps;

	// 擷取目前障礙
	ps = &s1;
	if (s2.left < ps->left)	ps = &s2;
	if (s3.left < ps->left)	ps = &s3;

	// 檢測碰撞
	if (p.impact(ps))
	{
		p_v = 0;
		s_v = 0;
		game_over();
	}
}
           

人物的移動

// 移動
void move()
{
	keydown=' ';				// 清空鍵盤緩存區
	setfillstyle(BS_SOLID);		// 設定繪圖樣式
	cleardevice();	
	solidrectangle(0, 360, 640, 400);
	char s[10];
	char max[10];
	char ss[] = "分數:0";
	char sss[] = "最高分:";
	max_score();				// 最高分
	settextcolor(BLUE);
	sprintf(max, "%d", max_s);	// 數值格式化
	outtextxy(490, 40, max);		// 輸出最高分
	outtextxy(58, 40, ss);
	outtextxy(400, 40, sss);
	p.i  = 0;
	p.b  = 0;
	p.b1 = 0;
	p.j  = p.k = p.top = 240;
	p.left = 50;
	zhangai_rnd();
	chushi();
	IMAGE img1;
	loadimage(&img1, _T("rc\\picture\\move8_1.jpg"),70,100);
	putimage(50,260, &img1);
	while(true)
	{
		keydown=getch();
		
		while(!kbhit())
		{
			sprintf(s,"%d",score);
			
			outtextxy(120,40,s);
			
			show_zhangai();
			
			if(keydown == 'w')
			{
				p.i = 0;
				p.b1 = 0;
				p.jump();
				if(p.k > 240)
				{
					keydown = ' ';
					p.j = 240;
				}
			}
			else if(keydown == 's')
			{
				if(p.b1 == 0)
					clearrectangle(50, 240, 120, 361);

				if(p.k >= 240)
					p.roll();
				else
					keydown='w';
			}
			else
			{
				if(p.k >= 240)
					p.move();
				else
					keydown = 'w';

				if(p.b1 == 0)
					p.move();
				else
					keydown = 's';
			}
			
			if(p.b1 >= ROLLDISTANCE)
			{
				p.b1 = 0;
				keydown = ' ';
				p.b = 0;
			}
			
			Sleep(20);
			
			pengzhuang();
			
			delete_zhangai();
			
			set_speed();
			
			score++;		// 分數
			
			xunhuan();		// 障礙物循環移動 
		}
	}
}
           

登入界面

// 登入界面

void Login()

{

    setfillstyle(BS_SOLID);

    setbkcolor(LIGHTBLUE);

    char s[]    = "開始遊戲";

    char ss[]    = "退出遊戲";

    char sss[]    = "遊戲說明: W 鍵 = 跳躍   S 鍵 = 滾動";

    MOUSEMSG m;

    solidrectangle(240, 100, 380, 150);

    solidrectangle(240, 160, 380, 210);

    settextcolor(BLUE);                    // 設定字型顔色

    outtextxy(260, 113, s);

    outtextxy(260, 173, ss);

    setbkcolor(WHITE);

    outtextxy(110, 250, sss);

    setfillcolor(LIGHTBLUE);

    solidrectangle(0, 360, 640, 400);

    while(true)

    {

        m = GetMouseMsg();                // 判斷是否按下滑鼠

        if(m.x >= 240 && m.x <= 380 && m.y >= 100 && m.y <= 150)

        {

            setlinecolor(RED);            // 選中框框線條顔色

            rectangle(235, 95, 385, 155);

            if(m.uMsg==WM_LBUTTONDOWN )

            {

                clearrectangle(240, 100, 380, 150);

                clearrectangle(240, 160, 380, 210);

                setbkcolor(WHITE);

                cleardevice();

                game_again();

            }

        }

        else if(m.x >= 240 && m.x <= 380 && m.y >= 160 && m.y <= 210)

        {

            setlinecolor(RED);            // 選中框框線條顔色

            rectangle(235, 155, 385, 215);

            if(m.uMsg==WM_LBUTTONDOWN)

            {

                exit(1);

            }

        }

        else

        {

            setlinecolor(WHITE);

            rectangle(235, 95,  385, 155);

            rectangle(235, 155, 385, 215);

        }

    }

}

這樣一來一個簡單的小遊戲就做完了,大家有什麼問題可以加群【1083227756】了解

UP在首頁上傳了一些學習C/C++程式設計的視訊教程,有興趣或者正在學習的小夥伴一定要去看一看哦!會對你有幫助的~ 

  加群1083227756!!!

分享(源碼、項目實戰視訊、項目筆記,基礎入門教程)