前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c语言吃逗游戏源码

c语言吃逗游戏源码

原创
作者头像
C语言与CPP编程
修改2021-01-04 10:39:41
3.8K0
修改2021-01-04 10:39:41
举报
文章被收录于专栏:c语言与cpp编程c语言与cpp编程
代码语言:javascript
复制
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>

#define LEFT 0x4b00
#define RIGHT 0x4d00
#define UP 0x4800
#define DOWN 0x5000
#define ESC 0x011b
#define ENTER 0x1c0b

// 来自公众号:c语言与cpp编程

/*2墙壁,1可以移动地方,3自己,4敌人*/
int a[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
	       2,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,1,0,2,
               2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2,
               2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2,
               2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2,
               2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2,
               2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,
               2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2,
               2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2,
               2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2,
               2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2,
               2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2,
               2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2,
               2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,
               2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图*/
struct play /*游戏中人物的结构体*/
{
 int x;
 int y;
};
struct play you,them[5];
int sum=0;/*统计吃的豆子个数,吃满50颗就算胜利*/
int xx[5][2];/*判定敌人方向用的结构体*/
int false=0;

void init();
void begin();
void play();
void win();
void fun(struct play *them);
void movethem(struct play *them);
void loseyes();
void drawblackdou(int x,int y);
void lose();
/*游戏玩法:当任意按下键时,游戏启动,敌人随机移动,自己开始躲避敌人和墙壁,尽可能多的吃豆豆*/
void play()
{
	int key,i;
	while(1)
	{       key=bioskey(2);
		while(!kbhit())				/*当无按键时敌人自己移动 */
		{
			setcolor(GREEN);/*重画敌人*/
			for(i=0;i<5;i++)
				circle(them[i].y*20+100,them[i].x*20+100,9);
				sleep(1);
				fun(them);/*处理敌人*/

			for(i=0;i<5;i++)
				if(them[i].x==you.x&&them[i].y==you.y)
					false=1;/*假如失败的话*/
		loseyes();/*判定是否失败*/
			if(false)
				break;
		}/*跳出while(!kbhit())*/
	if(false)
		break;
	key=bioskey(0);
	setcolor(0);/*把自己原来位置的人给删除掉*/
	circle(100+you.y*20,100+you.x*20,9);
	if(key==ESC)
		break;
	else if(key==UP)/*这里开始的判定主要是是否吃到豆子和碰到墙壁*/
	{
		you.x--;
		if(a[you.x][you.y]==2)
			you.x++;
		else if(a[you.x][you.y]==0)
			drawblackdou(you.x,you.y);
	}
	else if(key==DOWN)
	{
		you.x++;
		if(a[you.x][you.y]==2)
			you.x--;
		else if(a[you.x][you.y]==0)
			drawblackdou(you.x,you.y);
	}
   else if(key==RIGHT)
    {
	   you.y++;
	   if(a[you.x][you.y]==2)
		   you.y--;
     else if(a[you.x][you.y]==0)
		drawblackdou(you.x,you.y);
   }
   else if(key==LEFT)
    {
	   you.y--;
	   if(a[you.x][you.y]==2)
		   you.y++;
     else if(a[you.x][you.y]==0)
		drawblackdou(you.x,you.y);
   }
   if(sum==50)
      break;
  setcolor(RED);/*执行了一次键盘后再画出自己的位置*/
  circle(100+you.y*20,100+you.x*20,9);
  loseyes();/*自己走上去碰到敌人的可能*/
   if(false)
    break;
 }

}
void fun(struct play *them)/*移动中的判定*/
{
 int i;
 setcolor(0);/*把敌人的老位置删除*/
   for(i=0;i<5;i++)
    circle(them[i].y*20+100,them[i].x*20+100,9);
  movethem(them);/*根据控制者的位置来决定敌人的移动方向*/
}


void lose()/*输的画面*/
{
	cleardevice();
	settextstyle(0,0,4);
	while(!kbhit())
	{
		setcolor(rand()%13+1);
		outtextxy(180,200,"GAME OVER!");
		delay(3);
	}

}
void win()/*赢的画面*/
{
	cleardevice();
	settextstyle(0,0,4);
	while(!kbhit())
	{
		setcolor(rand()%13+1);
		outtextxy(200,200,"YOU WIN!");
		delay(3);
	}

}
void drawblackdou(int x,int y)/*吃豆子*/
{
	setcolor(0);
	circle(100+y*20,100+x*20,3);/*画圆x,y,半径*/
	sum++;/*吃到豆子后就加一*/
	a[x][y]=1;/*吃到后这里就成为普通平地*/
}
void loseyes()/*判断是否失败*/
{
	int i;
	for(i=0;i<5;i++)
    if(them[i].x==you.x&&them[i].y==you.y)
		false=1;/*假如失败的话*/


}
void movethem(struct play *them)/*them的移动过程*/
{
	int i,loop;
	randomize();/*随机排列,任意打乱*/
	for(i=0;i<5;i++)
	{
		/*只要控制者在身边就立即靠上去*/
		if(you.x==them[i].x&&(them[i].y+1)==you.y)
			them[i].y++;
		else if(you.x==them[i].x&&(them[i].y-1)==you.y)
			them[i].y--;
		else if(you.y==them[i].y&&(them[i].x+1)==you.x)
			them[i].x++;
		else if(you.y==them[i].y&&(them[i].x-1)==you.x)
			them[i].x--;
		else
		{
		loop:
			xx[i][0]=rand()%4+1;/*这里的方向采取随机赋值,原则是新的方向不可以和原来的方向相反*/
			if(xx[i][0]==1&&xx[i][1]==2||xx[i][0]==2&&xx[i][1]==1)
				goto loop;
			if(xx[i][0]==3&&xx[i][1]==4||xx[i][0]==4&&xx[i][1]==3)
				goto loop;
			xx[i][1]=xx[i][0];
			if(xx[i][0]==1)/*四个方向*/
			{
				them[i].x--;
				if(a[them[i].x][them[i].y]==2)/*假如碰墙壁的话就回到原来的地方等待随机的方向*/
				{
					them[i].x++;
					goto loop;
				}
			}
			else if(xx[i][0]==2)
			{
				them[i].x++;
				if(a[them[i].x][them[i].y]==2)
				{
					them[i].x--;
					goto loop;
				}
			}
			else if(xx[i][0]==3)
			{
				them[i].y++;
				if(a[them[i].x][them[i].y]==2)
				{
					them[i].y--;
					goto loop;
				}
			}
			else if(xx[i][0]==4)
			{
				them[i].y--;
				if(a[them[i].x][them[i].y]==2)
				{
					them[i].y++;
					goto loop;
				}
			}
		}
	}
}



void begin()
{
	/*setbkcolor(WHITE);*/
	int i,j;
	sleep(1);
	for(i=0;i<15;i++)
		for(j=0;j<20;j++)
			if(a[i][j]==2)/*代表墙壁*/
			{
				setfillstyle(SOLID_FILL,9);
				bar(100+j*20-10,100+i*20+10,100+j*20+10,100+i*20-10);
			}
			else if(a[i][j]==3)/*代表自己*/
			{
				setcolor(RED);
				circle(100+j*20,100+i*20,9);
			}
			else if(a[i][j]==4)/*代表敌人*/
			{
				setcolor(GREEN);
				circle(100+j*20,100+i*20,9);

			}
			else if(a[i][j]==0)/*代表豆子*/
			{
				setcolor(YELLOW);
				setlinestyle(0,0,1);
				circle(100+j*20,100+i*20,3);
			}
	you.x=5;you.y=9;/*自己和敌人的初始坐标*/
	them[0].x=2;them[0].y=15;
	them[1].x=4;them[1].y=1;
	them[2].x=8;them[2].y=16;
	them[3].x=12;them[3].y=13;
	them[4].x=13;them[4].y=7;


}
void init()/*是否开始游戏*/
{
	setcolor(3);
	setlinestyle(DASHED_LINE, 0, 3);							/*设置线的宽度和形式*/
	rectangle(100, 100, 550, 350);								/*画矩形*/


	settextstyle(3,0,3);
	outtextxy(200,200,"GAME START!");
	settextstyle(3,0,3);
	outtextxy(110,300,"ESC-exit/press any key to continue");
	 getch();
}

main()
{
	int gd=DETECT,gm;
	int key;
	initgraph(&gd,&gm,"");/*图形界面初始化*/
	init();/*调用初始化函数显示进入游戏初始界面*/
	key=bioskey(0);/*接收键盘按键*/
	if(key==ESC)
		exit(0);
	else
	{
		cleardevice();
		begin();

		play();/*编写游戏实现过程*/


		if(sum==50)/*吃满豆子了*/
		{
			win();
			getch();
		}
		if(false)
		{
			lose();
			getch();

		}

	}
closegraph();
	

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档