c语言 中的 window编程

c语言 中的 window编程

小游戏 ----消消乐
在这里插入图片描述

#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<stdio.h>
#include<windows.h>

typedef struct postion
{	
	int x;
	int y;
}posType ;

#define KEY_DOWN(vk_c) (GetAsyncKeyState(vk_c)&0x8000)

void	init(void);//初始化界面
void	gamebegin(void);//游戏开始界面
void	gameplay(void);//玩游戏的具体过程
void	close(void);//释放资源
void	drawcursor(posType pos,COLORREF c1);//重绘光标
void	drawtime(int sec);//重绘时间
void	drawscore(int score);//重绘分数
void	getsamecolorballs(posType cur,COLORREF c1);//获取同色小球
int		isValid(posType cur,COLORREF c1);//小球下落
void	ballsfall();//小球下落


COLORREF colorArr[6]={RGB(200,0,0),RGB(0,200,0),RGB(0,0,200),RGB(200,200,0),RGB(200,0,200),RGB(0,200,200)};

posType cur;//当前光标
posType ballsArr[180];// 同色小球坐标
int index;//同色个数

void main()
{
	init();
	gamebegin();
	gameplay();
	close();

}

void init()
{
	initgraph(1000,700);
}

void gamebegin()
{
	//绘制边框
	setlinecolor(RGB(50,50,50));
	setlinestyle(PS_SOLID,10);//线宽影响坐标,要调整坐标
	rectangle(255,45,745,655);
	//绘制小球
	setlinestyle(PS_SOLID);
	srand((unsigned) time(NULL));
	for(int x=280;x<740;x+=40)
	{
		for(int y=70;y<650;y+=40)
		{	
			int j=rand()%6;
			COLORREF c1=colorArr[j];
			setlinecolor(c1);
			setfillcolor(c1);
			fillcircle(x,y,18);
		}
	}
	//绘制光标
	cur.x=480;
	cur.y=390;
	drawcursor(cur,RGB(255,255,255));
	//绘制时间
	/*
	settextcolor(RGB(255,255,0));
	settextstyle(25,0,_T("黑体"));
	char s[] ="剩余时间:30 s";
	outtextxy(20,50,s);
	*/
	//绘制分数
	drawtime(30);

	//绘制时间
	drawscore(0);
	
	//绘制提示语
	settextcolor(RGB(255,100,0));
	settextstyle(15,0,_T("黑体"));
	char v[] ="规则:↑↓←→建控制方向,按";
	outtextxy(20,90,v);
	char v1[] ="空格消除,3个小球每个2分,4";
	outtextxy(20,110,v1);
	char v2[] ="个每个3分,6个每个5分,7个每";
	outtextxy(20,130,v2);
	char v3[] ="个7分,更多每个10分";
	outtextxy(20,150,v3);
	
	
}


void gameplay()
{
	int score=0;
	for(int i=600;i>-1;i--)
	{
		if(i%10==0)
		{
			drawtime(i/10);
		}
		//回车键或空格键
		if(KEY_DOWN(VK_UP)&&cur.y>70)
		{	
			drawcursor(cur,RGB(0,0,0));
			cur.y-=40;
			drawcursor(cur,RGB(255,255,255));
		}
		else if(KEY_DOWN(VK_DOWN)&&cur.y<630)
		{
			drawcursor(cur,RGB(0,0,0));
			cur.y+=40;
			drawcursor(cur,RGB(255,255,255));
		}
		else if(KEY_DOWN(VK_LEFT)&&cur.x>280)
		{
			drawcursor(cur,RGB(0,0,0));
			cur.x-=40;
			drawcursor(cur,RGB(255,255,255));
		}
		else if(KEY_DOWN(VK_RIGHT)&&cur.x<720)
		{
			drawcursor(cur,RGB(0,0,0));
			cur.x+=40;
			drawcursor(cur,RGB(255,255,255));
		}
		if(KEY_DOWN(VK_RETURN) || KEY_DOWN(VK_SPACE))
		{
			
			//获得光标所在位置周围的同色小球坐标,存入数组,并记入同色个数
			getsamecolorballs(cur,getpixel(cur.x,cur.y));
			//将数组中的元素置黑一段时间
			if(index>1)
			{
				for(int k=0;k<index;k++)
				{	
					setlinecolor(RGB(0,0,0));
					setfillcolor(RGB(0,0,0));
					fillcircle(ballsArr[k].x,ballsArr[k].y,18);
				}
				//上方的小球下落
				Sleep(200);
				ballsfall();
				//分数梯度:小于3个小球每个2分,4个每个3分,6个每个5分,7个每个7分,更多每个10分
				if(index<=3)
				{
					score+=2*index;
				}
				else if(index<=4)
				{
					score+=3*index;
				}
				else if(index<=6)
				{
					score+=5*index;
				}
				else if(index<=7)
				{
					score+=7*index;
				}
				if(index>8)
				{	
					score+=10*index;
				}
				drawscore(score);	

			}
			
			index=0;
			Sleep(100);

		}
		Sleep(100);//延迟时间
	}	
	//游戏结束
	cleardevice();
	settextcolor(RGB(255,0,0));
	settextstyle(50 ,0,_T("黑体"));
	outtextxy(400,250,"Game over");
	char str[30];
	settextcolor(RGB(255,0,0));
	settextstyle(25,0,_T("黑体"));
	sprintf(str,"分数:%d",score);
	outtextxy(470,300,str);
	Sleep(1000000);
}

	
void close()
{
	getch();
	closegraph();
}

void drawcursor(posType cur,COLORREF c1)
{
	setlinecolor(c1);
	rectangle(cur.x-20,cur.y-20,cur.x+20,cur.y+20);
}

void drawtime(int sec)
{
	char str[30];
	settextcolor(RGB(255,255,0));
	settextstyle(25,0,_T("黑体"));
	sprintf(str,"剩余时间:%2d 秒",sec);
	outtextxy(20,50,str);

}

void drawscore(int score)
{
	char str[30];
	settextcolor(RGB(255,0,0));
	settextstyle(25,0,_T("黑体"));
	sprintf(str,"分数:%d",score);
	outtextxy(20,600,str);

}
void getsamecolorballs(posType cur,COLORREF c1)
{
	ballsArr[index].x=cur.x;
	ballsArr[index].y=cur.y;
	index++;

	posType tmpPos;
	for(int k=0;k<4;k++)
	{
		switch(k)
		{
			case 0:tmpPos.x=cur.x;tmpPos.y=cur.y-40;break;//上移
			case 1:tmpPos.x=cur.x;tmpPos.y=cur.y+40;break;//下移
			case 2:tmpPos.x=cur.x-40;tmpPos.y=cur.y;break;//左移
			case 3:tmpPos.x=cur.x+40;tmpPos.y=cur.y;break;//右移
		}
		if(isValid(tmpPos,c1))
		{	
			getsamecolorballs(tmpPos,c1);
		}
	}
}

int isValid(posType cur,COLORREF c1)
{	
	if(getpixel(cur.x,cur.y) != c1 || cur.y<70 || cur.y>650 || cur.x<280 || cur.x>740)
	{
		return 0;
	}
	else 
	{
		for(int i=0;i<index;i++)
		{
			if(cur.x==ballsArr[i].x&&cur.y==ballsArr[i].y)
			{
				return 0;
			}
		}
		return 1;
	}
}

void turn()
{
	int i,j;
	posType temp;
	for(j=0;j<index-1;j++)
	{
		for(i=0;i<index-1-j;i++)
		{
			if(ballsArr[i].x>ballsArr[i+1].x)
			{
				temp=ballsArr[i];
				ballsArr[i]=ballsArr[i+1];
				ballsArr[i+1]=temp;
			}
			if(ballsArr[i].y>ballsArr[i+1].y)
			{
				temp=ballsArr[i];
				ballsArr[i]=ballsArr[i+1];
				ballsArr[i+1]=temp;
			}
		}
	}
}
void ballsfall()
{
	turn();
	for(int i=0;i<index;i++)
	{
		for(int k=ballsArr[i].y;k>70;k-=40)
		{
			COLORREF c1=getpixel(ballsArr[i].x,k-40);
			setlinecolor(c1);
			setfillcolor(c1);
			fillcircle(ballsArr[i].x,k,18);
		}
		COLORREF c1=colorArr[rand()%6];
		setlinecolor(c1);
		setfillcolor(c1);
		fillcircle(ballsArr[i].x,70,18);
	}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值