Linux下C语言吃豆小游戏,使用WindowsAPI编写在控制台中吃豆游戏小程序

#include

#include

#include

#include

//2墙壁,1可以移动地方,3自己,4敌人,0是豆子

inta[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];//判定敌人方向

HDC hdc;

HWND hwnd;

HPENhpenblack,hpengreen,hpenpurple,hpenyellow,hpenred;

HBRUSHhbrushblack,hbrushpurple;

//敌人的移动方向

void movethem(struct play *them)

{

int i,loop;

srand((unsigned) time(NULL));

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].y][them[i].x]==2)//假如碰墙壁的话就回到原来的地方等待随机的方向

{

them[i].x++;

goto loop;

}

}

else if(xx[i][0]==2)

{

them[i].x++;

if(a[them[i].y][them[i].x]==2)

{

them[i].x--;

goto loop;

}

}

else if(xx[i][0]==3)

{

them[i].y++;

if(a[them[i].y][them[i].x]==2)

{

them[i].y--;

goto loop;

}

}

else if(xx[i][0]==4)

{

them[i].y--;

if(a[them[i].y][them[i].x]==2)

{

them[i].y++;

goto loop;

}

}

}

}

}

//敌人移动

void fun(struct play *them)

{

int i;

SelectObject(hdc,hpenblack);//把敌人的老位置删除

for(i=0;i<5;i++)

{

MoveToEx(hdc,them[i].x*20+100+9,them[i].y*20+100,NULL);

AngleArc(hdc,them[i].x*20+100,them[i].y*20+100,9,0,360);

}

movethem(them);//根据控制者的位置来决定敌人的移动方向

SelectObject(hdc,hpengreen);//新位置重画敌人

for(i=0;i<5;i++)

{

MoveToEx(hdc,them[i].x*20+100+9,them[i].y*20+100,NULL);

AngleArc(hdc,them[i].x*20+100,them[i].y*20+100,9,0,360);

}

}

//赢的画面

void win()

{

char ch[]={"YOU WIN!"};

system("cls");

SelectObject(hdc,hbrushblack);

SelectObject(hdc,hpengreen);

Rectangle(hdc,100, 100, 450, 350);//画框

SetBkColor(hdc,RGB(0,0,0));

SetTextColor(hdc,RGB(0,255,0));

TextOut(hdc,200,200,ch,strlen(ch)+1);

Sleep(2000);

// system("pause");

exit(0);

}

//输的画面

void lose()

{

char ch[]={"GAME OVER!"};

system("cls");

SelectObject(hdc,hbrushblack);

SelectObject(hdc,hpenred);

Rectangle(hdc,100, 100, 450, 350);//画框

SetBkColor(hdc,RGB(0,0,0));

SetTextColor(hdc,RGB(255,0,0));

TextOut(hdc,200,200,ch,strlen(ch)+1);

Sleep(2000);

// system("pause");

exit(0);

}

//判断是否失败

void loseyes()

{

int i;

for(i=0;i<5;i++)

if(them[i].x==you.x && them[i].y==you.y)

lose();

}

//吃豆子后删除

void drawblackdou(int x,int y)

{

SelectObject(hdc,hpenblack);

MoveToEx(hdc,100+x*20+3,100+y*20,NULL);

AngleArc(hdc,100+x*20,100+y*20,3,0,360);//删除豆子

sum++;//吃到豆子后就加一

a[y][x]=1;//1,代表平地,吃到后这里就成为普通平地

}

//游戏玩法:当任意按下键时,游戏启动,敌人随机移动,自己开始躲避敌人和墙壁,尽可能多的吃豆豆

void play()

{

int i;

while(1)

{

fun(them);//处理敌人

for(i=0;i<5;i++)

if(them[i].x==you.x && them[i].y==you.y);

loseyes();//判定是否失败,被抓

for(i=0;i<10;i++)

{

Sleep(100);//sleep()控制自己的移动速度,即按键的识别速度;i的最大值与sleep()的乘积控制敌人的最大移动速度

SelectObject(hdc,hpenblack);//把自己原来位置的人给删除掉

MoveToEx(hdc,100+you.x*20+9,100+you.y*20,NULL);

AngleArc(hdc,100+you.x*20,100+you.y*20,9,0,360);

if(GetKeyState(VK_ESCAPE)<0)

break;

if(GetKeyState(VK_LEFT)<0)//这里开始的判定主要是是否吃到豆子和碰到墙壁

{

you.x--;

if(a[you.y][you.x]==2)//2是代表墙壁

you.x++;

if(a[you.y][you.x]==0)//0是代表豆子

drawblackdou(you.x,you.y);

}

if(GetKeyState(VK_RIGHT)<0)

{

you.x++;

if(a[you.y][you.x]==2)

you.x--;

if(a[you.y][you.x]==0)

drawblackdou(you.x,you.y);

}

if(GetKeyState(VK_DOWN)<0)

{

you.y++;

if(a[you.y][you.x]==2)

you.y--;

if(a[you.y][you.x]==0)

drawblackdou(you.x,you.y);

}

if(GetKeyState(VK_UP)<0)

{

you.y--;

if(a[you.y][you.x]==2)

you.y++;

if(a[you.y][you.x]==0)

drawblackdou(you.x,you.y);

}

if(sum==50)

win();

SelectObject(hdc,hpenred);//执行了一次键盘后再画出自己的位置

MoveToEx(hdc,100+you.x*20+9,100+you.y*20,NULL);

AngleArc(hdc,100+you.x*20,100+you.y*20,9,0,360);

loseyes();//主动送人头

}

}

}

//初始化界面

void init()

{

char ch_start[]={"GAME START!"};

char ch_note[]={"ESC-exit/press any key to

continue"};

hwnd=GetConsoleWindow();

hdc=GetDC(hwnd);

hpenblack=CreatePen(PS_SOLID,1,RGB(0,0,0));

hpengreen=CreatePen(PS_SOLID,1,RGB(0,255,0));

hpenpurple=CreatePen(PS_SOLID,1,RGB(255,0,255));

hpenyellow=CreatePen(PS_SOLID,1,RGB(255,255,0));

hpenred=CreatePen(PS_SOLID,1,RGB(255,0,0));

hbrushpurple=CreateSolidBrush(RGB(255,0,255));

hbrushblack=CreateSolidBrush(RGB(0,0,0));

SelectObject(hdc,hbrushblack);

SelectObject(hdc,hpengreen);

Rectangle(hdc,100, 100, 450, 350);//画框

SetTextColor(hdc,RGB(0,255,0));

SetBkColor(hdc,RGB(0,0,0));

TextOut(hdc,200,200,ch_start,strlen(ch_start));

TextOut(hdc,130,300,ch_note,strlen(ch_note)+1);

system("pause");

system("cls");

}

//画图

void begin()

{

int i,j;

for(i=0;i<15;i++)

for(j=0;j<20;j++)

if(a[i][j]==2)//代表墙壁

{

SelectObject(hdc,hpenpurple);

SelectObject(hdc,hbrushpurple);

Rectangle(hdc,100+j*20-10,100+i*20+10,100+j*20+10,100+i*20-10);//20*20的实心正方块,x/y方向步进也是20

}

else if(a[i][j]==3)//代表自己

{

SelectObject(hdc,hpenred);

MoveToEx(hdc,100+j*20+9,100+i*20,NULL);

AngleArc(hdc,100+j*20,100+i*20,9,0,360);

}

else if(a[i][j]==4)//代表敌人

{

SelectObject(hdc,hpengreen);

MoveToEx(hdc,100+j*20+9,100+i*20,NULL);

AngleArc(hdc,100+j*20,100+i*20,9,0,360);

}

else if(a[i][j]==0)//代表豆子

{

SelectObject(hdc,hpenyellow);

MoveToEx(hdc,100+j*20+3,100+i*20,NULL);

AngleArc(hdc,100+j*20,100+i*20,3,0,360);

}

you.x=9;you.y=5;//自己和敌人在a[][]数组中的下标

them[0].x=15;them[0].y=2;

them[1].x=1;them[1].y=4;

them[2].x=16;them[2].y=8;

them[3].x=13;them[3].y=12;

them[4].x=7;them[4].y=13;

// system("pause");

}

main()

{

init();//示进入游戏初始界面

begin();//画图

play();

}

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值