最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++實(shí)現(xiàn)精靈游戲的示例代碼

 更新時(shí)間:2022年06月01日 10:39:32   作者:風(fēng)光無限,未必快樂  
這篇文章主要為大家介紹了如何利用C++實(shí)現(xiàn)簡(jiǎn)單的精靈游戲,文中的示例代碼講解詳細(xì),有一定的參考價(jià)值,感興趣的小伙伴可以了解一下

前言

采用面向過程的遍程思想,通過acllib圖形庫來實(shí)現(xiàn)。

acllib下載地址:acllib

tom,jerry,dog,heart以及開始圖片,結(jié)束圖片這些可以自己找,圖片的格式必須為BMP、JPEG、GIF這三種。

創(chuàng)建win32項(xiàng)目

通過visual studio(這里用的visual studio 2022)創(chuàng)建win32項(xiàng)目以及添加我們所需要的資源碼文件。

1、選擇Windows桌面向?qū)?/p>

2、修改項(xiàng)目名稱

3、選擇空項(xiàng)目

4、將我們所需要的圖片以及acllib.h,acllib.c復(fù)制到此文件夾中

5、添加新建項(xiàng),即.cpp程序

單擊添加即可。

6、根據(jù)第五步添加現(xiàn)有項(xiàng),即把資源文件夾里的acllib.c,acllib.h以及各種圖片添加到程序中來。添加后如下圖

至此win32項(xiàng)目創(chuàng)建完成。

游戲效果

核心代碼

#include"acllib.h"
#include<time.h>
#include<malloc.h>
#include<stdio.h>
const int winWidth = 960, winHeight = 660;
ACL_Image tomimg;
ACL_Image jerryimg;
ACL_Sound sound;
ACL_Image dogimg;
ACL_Image heartimg;
ACL_Image beginimg;
ACL_Image endimg;
const int maxNum = 2000;
const int maxJerryNum = 20;
const int maxDogNum = 20;
const int maxHeartNum = 20;
int jerryNum = 0;
int dogNum = 0;
int heartNum = 0;
int preJerryNum = 0;
int preDogNum = 0;
int preHeartNum = 0;
int flag = 0;
void timerEvent(int id);//定時(shí)器
void keyEvent(int key, int e);//鍵盤
void initgame();//初始化函數(shù)
int moveid = 0, movetimerInterval = 30;
int createid = 1, createtimerInterval = 1000;
int dogid1 = 2, dogtimerInterval1 = 5000;
int dogid2 = 3, dogtimerInterval2 = 30;
int heartid1 = 4, hearttimerInterval1 = 30;
int heartid2 = 5, hearttimerInterval2 = 8000;
int score1 = 0, score2 = 8;
void beginpaint();//開始界面
void Paint();//游戲界面
void endpaint();//結(jié)束界面
struct sprite//精靈
{
	int x, y;
	int width, height;
	int distx,disty;
};
typedef struct rect
{
	int x, y;
	int w, h;
}rect;
int collision(rect r1, rect r2);//檢測(cè)碰撞
void change(int score);//改變Tom貓的大小
struct sprite tomsprite, *jerrysprite[maxNum]={NULL},*dogsprite[maxNum]={NULL},*heartsprite[maxNum]={NULL};
int Setup()
{
	initWindow("My first game", DEFAULT, DEFAULT, winWidth, winHeight);
	loadImage("tom.bmp", &tomimg);
	loadImage("jerry.bmp", &jerryimg);
	loadSound("tada.wav", &sound);
	loadImage("dog.bmp", &dogimg);
	loadImage("heart.bmp", &heartimg);
	loadImage("begin.bmp", &beginimg);
	loadImage("end.bmp", &endimg);
	srand((unsigned)time(NULL));
	initgame();
	registerTimerEvent(timerEvent);
	registerKeyboardEvent(keyEvent);
	beginpaint();
	return 0;
}
void initgame()
{
	memset(jerrysprite, NULL, sizeof(jerrysprite));
	memset(dogsprite, NULL, sizeof(dogsprite));
	memset(heartsprite, NULL, sizeof(heartsprite));
	score1 = 0;
	score2 = 8;
	jerryNum = 0;
	dogNum = 0;
	heartNum = 0;
	preJerryNum = 0;
	preDogNum = 0;
	preHeartNum = 0;
	jerrysprite[jerryNum] = (struct sprite*)malloc(sizeof(struct sprite));
	jerrysprite[jerryNum]->distx = jerrysprite[jerryNum]->disty = 3;
	jerrysprite[jerryNum]->height = 50;
	jerrysprite[jerryNum]->width = 50;
	jerrysprite[jerryNum]->x = rand() % (winWidth - jerrysprite[jerryNum]->width + 1);
	jerrysprite[jerryNum]->y = rand() % (winHeight - jerrysprite[jerryNum]->height + 1);
	tomsprite.width = 100;
	tomsprite.height = 100;
	tomsprite.distx = tomsprite.disty = 5;
	tomsprite.x = rand() % (winWidth - tomsprite.width + 1);
	tomsprite.y = rand() % (winHeight - tomsprite.height + 1);
}
void keyEvent(int key, int e)
{
	if (e != KEY_DOWN)return;
	if (key == 0x52)
	{
		initgame();
		flag = 1;
		Paint();
		startTimer(moveid, movetimerInterval);
		startTimer(createid, createtimerInterval);
		startTimer(dogid1, dogtimerInterval1);
		startTimer(dogid2, dogtimerInterval2);
		startTimer(heartid1, hearttimerInterval1);
		startTimer(heartid2, hearttimerInterval2);
	}
	else if (flag == 1)
	{
		switch (key)
		{
		case VK_UP:
			tomsprite.y -= tomsprite.disty;
			if (tomsprite.y <= 0)tomsprite.y = 0;
			break;
		case VK_DOWN:
			tomsprite.y += tomsprite.disty;
			if (tomsprite.y >= winHeight - tomsprite.height)tomsprite.y = winHeight - tomsprite.height;
			break;
		case VK_RIGHT:
			tomsprite.x += tomsprite.distx;
			if (tomsprite.x >= winWidth - tomsprite.width)tomsprite.x = winWidth - tomsprite.width;
			break;
		case VK_LEFT:
			tomsprite.x -= tomsprite.distx;
			if (tomsprite.x <= 0)tomsprite.x = 0;
			break;
		default:break;
		}
		rect r1, r2, r3, r4;
		r1.x = tomsprite.x;
		r1.y = tomsprite.y;
		r1.w = tomsprite.width;
		r1.h = tomsprite.height;
		for (int i = 0; i <= jerryNum; ++i)
		{
			if (jerrysprite[i])
			{
				r2.x = jerrysprite[i]->x;
				r2.y = jerrysprite[i]->y;
				r2.w = jerrysprite[i]->width;
				r2.h = jerrysprite[i]->height;
				int c = collision(r1, r2);
				if (c)
				{
					playSound(sound, 0);
					score1++;
					change(score1);
					if (score1 >= 10)
					{
						flag = 0;
						endpaint();
						cancelTimer(moveid);
						cancelTimer(createid);
						cancelTimer(dogid1);
						cancelTimer(dogid2);
						cancelTimer(heartid1);
						cancelTimer(heartid2);
						return;
					}
					preJerryNum--;
					delete(jerrysprite[i]);
					jerrysprite[i] = NULL;
				}
			}
		}
		for (int i = 1; i <= dogNum; ++i)
		{
			if (dogsprite[i])
			{
				r3.x = dogsprite[i]->x;
				r3.y = dogsprite[i]->y;
				r3.w = dogsprite[i]->width;
				r3.h = dogsprite[i]->height;
				int c = collision(r1, r3);
				if (c)
				{
					playSound(sound, 0);
					score2--;
					if (score1 >= 3)
						score1 -= 3;
					else score1 = 0;
					change(score1);
					if (score2 <= 0)
					{
						flag = 0;
						endpaint();
						cancelTimer(moveid);
						cancelTimer(createid);
						cancelTimer(dogid1);
						cancelTimer(dogid2);
						cancelTimer(heartid1);
						cancelTimer(heartid2);
						return;

					}
					preDogNum--;
					delete(dogsprite[i]);
					dogsprite[i] = NULL;
				}
			}
		}
		for (int i = 1; i <= heartNum; ++i)
		{
			if (heartsprite[i])
			{
				r4.x = heartsprite[i]->x;
				r4.y = heartsprite[i]->y;
				r4.w = heartsprite[i]->width;
				r4.h = heartsprite[i]->height;
				int c = collision(r1, r4);
				if (c)
				{
					playSound(sound, 0);
					score2++;
					change(score1);
					preHeartNum--;
					delete(heartsprite[i]);
					heartsprite[i] = NULL;
				}
			}
		}
		Paint();
	}
}
void timerEvent(int id)
{
	int a;
	if (id == 0)
	{
		for (a = 0; a <= jerryNum; a++)
		{
			if (jerrysprite[a])
			{
				if (jerrysprite[a]->x >= winWidth - jerrysprite[a]->width || jerrysprite[a]->x <= 0) { jerrysprite[a]->distx *= -1; }
				if (jerrysprite[a]->y >= winHeight - jerrysprite[a]->height || jerrysprite[a]->y <= 0) { jerrysprite[a]->disty *= -1; }
				jerrysprite[a]->x += jerrysprite[a]->distx;
				jerrysprite[a]->y += jerrysprite[a]->disty;
			}
		}
		//Paint();
	}
	if (id == 1)
	{
		if (preJerryNum < maxJerryNum) { jerryNum++; preJerryNum++; }
		if (preJerryNum < maxJerryNum && jerrysprite[jerryNum] == NULL)
		{
			jerrysprite[jerryNum] = (struct sprite*)malloc(sizeof(struct sprite));
			jerrysprite[jerryNum]->width = 50;
			jerrysprite[jerryNum]->height = 50;
			jerrysprite[jerryNum]->distx = jerrysprite[jerryNum]->disty = 3;
			jerrysprite[jerryNum]->x = rand() % (winWidth - jerrysprite[jerryNum]->width+1);
			jerrysprite[jerryNum]->y = rand() % (winHeight - jerrysprite[jerryNum]->height+1);
		}
	}
	if (id == 2)
	{
		if (preDogNum < maxDogNum) { dogNum++; preDogNum++; }
		if (preDogNum < maxDogNum && dogsprite[dogNum] == NULL)
		{
			dogsprite[dogNum] = (struct sprite*)malloc(sizeof(struct sprite));
			dogsprite[dogNum]->width = 100;
			dogsprite[dogNum]->height = 100;
			dogsprite[dogNum]->distx = dogsprite[dogNum]->disty = 2;
			dogsprite[dogNum]->x = rand() % (winWidth - dogsprite[dogNum]->width+1);
			dogsprite[dogNum]->y = rand() % (winHeight - dogsprite[dogNum]->height+1);
		}
	}
	if (id == 3)
	{
		for (a = 1; a <= dogNum; a++)
		{
			if (dogsprite[a])
			{
				if (dogsprite[a]->x >= winWidth - dogsprite[a]->width || dogsprite[a]->x <= 0) { dogsprite[a]->distx *= -1; }
				if (dogsprite[a]->y >= winHeight - dogsprite[a]->height || dogsprite[a]->y <= 0) { dogsprite[a]->disty *= -1; }
				dogsprite[a]->x += dogsprite[a]->distx;
				dogsprite[a]->y += dogsprite[a]->disty;
			}
		}
		//Paint();
	}
	if (id == 4)
	{
		for (a = 1; a <= heartNum; a++)
		{
			if (heartsprite[a])
			{
				if (heartsprite[a]->x >= winWidth - heartsprite[a]->width || heartsprite[a]->x <= 0) { heartsprite[a]->distx *= -1; }
				if (heartsprite[a]->y >= winHeight - heartsprite[a]->height || heartsprite[a]->y <= 0) { heartsprite[a]->disty *= -1; }
				heartsprite[a]->x += heartsprite[a]->distx;
				heartsprite[a]->y += heartsprite[a]->disty;
			}
		}
		//Paint();
	}
	if (id == 5)
	{
		if (preHeartNum < maxHeartNum) {
			heartNum++; preHeartNum++;
		}
		if (preHeartNum < maxNum && heartsprite[heartNum] == NULL)
		{
			heartsprite[heartNum] = (struct sprite*)malloc(sizeof(struct sprite));
			heartsprite[heartNum]->width = 50;
			heartsprite[heartNum]->height = 50;
			heartsprite[heartNum]->distx = heartsprite[heartNum]->disty = 1;
			heartsprite[heartNum]->x = rand() % (winWidth - heartsprite[heartNum]->width + 1);
			heartsprite[heartNum]->y = rand() % (winHeight - heartsprite[heartNum]->height + 1);
		}
	}
	rect r1, r2,r3,r4;
	r1.x = tomsprite.x;
	r1.y = tomsprite.y;
	r1.w = tomsprite.width;
	r1.h = tomsprite.height;
	for (int i = 0; i <= jerryNum; ++i)
	{
		if (jerrysprite[i])
		{
			r2.x = jerrysprite[i]->x;
			r2.y = jerrysprite[i]->y;
			r2.w = jerrysprite[i]->width;
			r2.h = jerrysprite[i]->height;
			int c = collision(r1, r2);
			if (c)
			{
				playSound(sound, 0);
				score1++;
				change(score1);
				if (score1 >= 10)
				{
					flag = 0;
					endpaint();
					cancelTimer(moveid);
					cancelTimer(createid);
					cancelTimer(dogid1);
					cancelTimer(dogid2);
					cancelTimer(heartid1);
					cancelTimer(heartid2);
					return;
				}
				preJerryNum--;
				delete(jerrysprite[i]);
				jerrysprite[i] = NULL;
			}
		}
	}
	for (int i = 1; i <= dogNum; ++i)
	{
		if (dogsprite[i])
		{
			r3.x = dogsprite[i]->x;
			r3.y = dogsprite[i]->y;
			r3.w = dogsprite[i]->width;
			r3.h = dogsprite[i]->height;
			int c = collision(r1, r3);
			if (c)
			{
				playSound(sound, 0);
				score2--;
				if (score1 >= 3)
					score1 -= 3;
				else score1 = 0;
				change(score1);
				if (score2 <= 0)
				{
					flag = 0;
					endpaint();
					cancelTimer(moveid);
					cancelTimer(createid);
					cancelTimer(dogid1);
					cancelTimer(dogid2);
					cancelTimer(heartid1);
					cancelTimer(heartid2);
					return;

				}
				preDogNum--;
				delete(dogsprite[i]);
				dogsprite[i] = NULL;
			}
		}
	}
	for (int i = 1; i <= heartNum; ++i)
	{
		if (heartsprite[i])
		{
			r4.x = heartsprite[i]->x;
			r4.y = heartsprite[i]->y;
			r4.w = heartsprite[i]->width;
			r4.h = heartsprite[i]->height;
			int c = collision(r1, r4);
			if (c)
			{
				playSound(sound, 0);
				score2++;
				change(score1);
				preHeartNum--;
				delete(heartsprite[i]);
				heartsprite[i] = NULL;
			}
		}
	}
	Paint();
}
void beginpaint()
{
	beginPaint();
	clearDevice();
	putImageScale(&beginimg, 0, 0, winWidth, winHeight);
	setTextSize(60);
	setTextColor(BLUE);
	setTextBkColor(RGB(64,224,208));
	setTextFont("楷體");
	paintText(300, 10, "按R開始游戲");
	endPaint();
}
void Paint()
{
	beginPaint();
	//putImage(&img, 10, 10);
	clearDevice();
	putImageTransparent(&tomimg, tomsprite.x, tomsprite.y, tomsprite.width, tomsprite.height,ACL_Color WHITE);
	//putImageScale(&jerryimg, jerry_x, jerry_y, jerryWidth, jerryHeight);
	for (int a = 0; a <= jerryNum; a++)
	{
		if (jerrysprite[a])
		{
			putImageTransparent(&jerryimg, jerrysprite[a]->x, jerrysprite[a]->y, jerrysprite[a]->width, jerrysprite[a]->height,ACL_Color WHITE);
		}
	}
	for (int a = 1; a <= dogNum; a++)
	{
		if (dogsprite[a])
		{
			putImageTransparent(&dogimg, dogsprite[a]->x, dogsprite[a]->y, dogsprite[a]->width, dogsprite[a]->height,ACL_Color WHITE);
		}
	}
	for (int a = 1; a <= heartNum; a++)
	{
		if (heartsprite[a])
		{
			putImageTransparent(&heartimg, heartsprite[a]->x, heartsprite[a]->y, heartsprite[a]->width, heartsprite[a]->height,ACL_Color WHITE);
		}
	}
	char str1[50],str2[50];
	sprintf_s(str1, "score:%d", score1);
	sprintf_s(str2, "HP:%d", score2);
	setTextSize(30);
	setTextBkColor(RGB(255, 255, 255));
	paintText(10, 10, str1);
	paintText(200, 10, str2);
	endPaint();
}
void endpaint()
{
	beginPaint();
	clearDevice();
	putImageScale(&endimg, 0, 0, winWidth, winHeight);
	setTextBkColor(RGB(255, 255, 255));
	paintText(360, 10, "按R重新開始游戲");
	endPaint();
}
int collision(rect r1, rect r2) {
	int c = 1;
	if (r1.x < r2.x && r1.x + r1.w >r2.x) {
		if (r1.y > r2.y && r1.y < r2.y + r2.h)return c;
		if (r1.y <r2.y && r1.y + r1.h >r2.y)return c;
	}
	else {
		if (r1.x > r2.x && r2.x + r2.w > r1.x)
		{
			if (r1.y > r2.y && r1.y < r2.y + r2.h)return c;
			if (r1.y <r2.y && r1.y + r1.h >r2.y)return c;
		}
	}
	c = 0;
	return c;
}
void change(int score)
{
	int d = score / 8;
	tomsprite.height = 100 + d * 20;
	tomsprite.width = 100 + d * 20;
}

以上就是C/C++實(shí)現(xiàn)精靈游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++精靈游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言實(shí)現(xiàn)電子秒表

    C語言實(shí)現(xiàn)電子秒表

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)電子秒表,毫秒級(jí)秒表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法

    C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法

    這篇文章主要為大家詳細(xì)介紹了C++判斷一個(gè)點(diǎn)是否在圓內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法

    淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法

    這篇文章主要介紹了淺析C語言中strtol()函數(shù)與strtoul()函數(shù)的用法,注意其將字符串轉(zhuǎn)換成long型的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C++實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃過程詳解

    C++實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃過程詳解

    動(dòng)態(tài)規(guī)劃是解決一類最優(yōu)問題的常用方法,它是解決最優(yōu)化問題的一種途徑,在本文中,我們將討論如何使用C++實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃算法,并提供一些示例來幫助您更好地理解該算法
    2023-05-05
  • C++中vector的清理回收的方式

    C++中vector的清理回收的方式

    這篇文章主要介紹了C++中vector的清理回收的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用matlab繪制七夕表白玫瑰花束

    使用matlab繪制七夕表白玫瑰花束

    又是一年七夕節(jié)要到了,每年一次直男審美MATLAB繪圖大賽開始了,于是今年對(duì)我之前寫的老代碼進(jìn)行了點(diǎn)優(yōu)化組合,整了個(gè)花球變花束,感興趣的小伙伴可以動(dòng)手試一試
    2023-08-08
  • C語言中分支和循環(huán)的6種實(shí)現(xiàn)形式總結(jié)

    C語言中分支和循環(huán)的6種實(shí)現(xiàn)形式總結(jié)

    C語言時(shí)一門結(jié)構(gòu)化的程序設(shè)計(jì)語言,這篇文章主要介紹了C語言中的分支和循環(huán)的6種實(shí)現(xiàn)形式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • C++浮點(diǎn)數(shù)類型詳情

    C++浮點(diǎn)數(shù)類型詳情

    這篇文章主要介紹了C++浮點(diǎn)數(shù)類型,浮點(diǎn)數(shù)是C++的第二組基本類型,它能夠表示帶小數(shù)部分的數(shù)字。不僅如此,浮點(diǎn)數(shù)的范圍也比int更大,可以表示更大范圍的數(shù)字。下面來我們大家一起來學(xué)習(xí)學(xué)習(xí)內(nèi)容
    2021-11-11
  • 利用Matlab制作三子棋游戲的示例代碼

    利用Matlab制作三子棋游戲的示例代碼

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來,相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了。本文將用Matlab制作這一經(jīng)典游戲,感興趣的可以試一試
    2022-03-03
  • QT判斷兩個(gè)日期時(shí)間的大小

    QT判斷兩個(gè)日期時(shí)間的大小

    本文主要介紹了QT判斷兩個(gè)日期時(shí)間的大小,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

屏东市| 香河县| 来安县| 精河县| 吉安市| 五原县| 萨嘎县| 马鞍山市| 临沭县| 屏南县| 综艺| 龙胜| 乃东县| 得荣县| 米易县| 珲春市| 育儿| 马鞍山市| 台南市| 九龙坡区| 肥西县| 秀山| 如皋市| 呼图壁县| 乌拉特中旗| 沿河| 安新县| 始兴县| 丹东市| 江北区| 柞水县| 绩溪县| 许昌县| 吉木萨尔县| 肥东县| 云安县| 衡东县| 区。| 无锡市| 盖州市| 磐石市|