C语言游戏程序及综合实例Word文件下载.docx
- 文档编号:22011313
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:186
- 大小:94.69KB
C语言游戏程序及综合实例Word文件下载.docx
《C语言游戏程序及综合实例Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言游戏程序及综合实例Word文件下载.docx(186页珍藏版)》请在冰豆网上搜索。
#defineMAX_JOINTS200
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineMV_RIGHT1
#defineMV_LEFT2
#defineMV_UP3
#defineMV_DOWN4
voidInitGraph(void);
/*图形驱动初始化函数*/
voidDrawFence(void);
/*绘制游戏场景*/
voidGameOver(intscore);
/*结束游戏*/
voidGamePlay(void);
/*玩游戏具体过程*/
voidPrScore(intscore);
/*输出成绩*/
structFood/*食物的结构体定义*/
{
intx;
/*食物的横坐标*/
inty;
/*食物的纵坐标*/
intaddFood;
/*判断是否要出现食物的变量*/
};
structSnake/*蛇的结构体定义*/
intx[MAX_JOINTS];
/*保存蛇身每一节位于屏幕上的列坐标*/
inty[MAX_JOINTS];
/*保存蛇身每一节位于屏幕上的行坐标*/
intjoint;
/*蛇的节数*/
intdirection;
/*蛇移动方向*/
intlife;
/*蛇的生命,0活着,1死亡*/
/*主函数*/
voidmain(void)
InitGraph();
/*图形驱动*/
DrawFence();
/*游戏场景*/
GamePlay();
/*玩游戏具体过程*/
closegraph();
/*图形结束*/
}
/*图形驱动初始化函数*/
voidInitGraph(void)
intgd=DETECT,gm;
initgraph(&
gd,&
gm,"
"
);
cleardevice();
setbkcolor(BLUE);
setcolor(WHITE);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
outtextxy(170,150,"
GreedySnake"
outtextxy(219,254,"
Ready?
setcolor(BLUE);
/*游戏开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawFence(void)
inti;
setbkcolor(LIGHTGREEN);
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
/*画围墙*/
for(i=50;
i<
=600;
i+=10)
{
rectangle(i,40,i+10,49);
/*上边*/
rectangle(i,451,i+10,460);
/*下边*/
}
for(i=40;
=450;
rectangle(50,i,59,i+10);
/*左边*/
rectangle(601,i,610,i+10);
/*右边*/
/*控制贪吃蛇吃食物*/
voidGamePlay(void)
inti,key;
intgamespeed=22000;
/*控制游戏速度*/
intscore=0;
/*记录游戏得分*/
structFoodfood;
/*食物结构体变量*/
structSnakesnake;
/*蛇结构体变量*/
food.addFood=1;
/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;
/*置蛇的生命状态为活着*/
snake.direction=MV_RIGHT;
/*置蛇头方向往右*/
snake.x[0]=100;
snake.y[0]=100;
/*置蛇头初始位置*/
snake.x[1]=110;
snake.y[1]=100;
snake.joint=2;
/*置蛇的初始节数为2*/
PrScore(score);
/*显示游戏得分*/
/*重复玩游戏,直到按Esc键结束*/
srand(time(NULL));
while
(1)
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.addFood==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
/*食物出现后必须在整格内才能让蛇吃到*/
while(food.x%10!
=0)
{
food.x++;
}
while(food.y%10!
food.y++;
food.addFood=0;
/*画面上有食物*/
}
if(food.addFood==0)/*画面上有食物,则显示*/
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
for(i=snake.joint-1;
i>
0;
i--)/*蛇的每个节往前移动*/
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
/*1,2,3,4表示右,左,上,下四个方向,来决定蛇头的移动*/
switch(snake.direction)
caseMV_RIGHT:
snake.x[0]+=10;
break;
caseMV_LEFT:
snake.x[0]-=10;
caseMV_UP:
snake.y[0]-=10;
caseMV_DOWN:
snake.y[0]+=10;
/*从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来*/
for(i=3;
snake.joint;
i++)
if(snake.x[i]==snake.x[0]&
&
snake.y[i]==snake.y[0])
GameOver(score);
/*显示失败*/
snake.life=1;
/*蛇死*/
break;
/*判断蛇是否撞到墙壁*/
if(snake.x[0]<
55||snake.x[0]>
595
||snake.y[0]<
55||snake.y[0]>
455)
/*本次游戏结束*/
/*蛇死*/
/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
if(snake.life==1)break;
if(snake.x[0]==food.x&
snake.y[0]==food.y)/*吃到食物后*/
/*把画面上的食物清除*/
setcolor(0);
rectangle(food.x,food.y,food.x+10,food.y-10);
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.x[snake.joint]=-20;
snake.y[snake.joint]=-20;
snake.joint++;
/*蛇的身体长一节*/
food.addFood=1;
/*画面上需要出现新食物*/
score+=10;
PrScore(score);
/*输出新得分*/
/*画蛇*/
setcolor(4);
for(i=0;
rectangle(snake.x[i],snake.y[i],
snake.x[i]+10,snake.y[i]-10);
delay(gamespeed);
/*延时控制蛇的速度*/
/*去除蛇的最后一节*/
rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1],
snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10);
}/*endofwhile(!
kbhit)*/
/*如果蛇死,则跳出循环*/
key=bioskey(0);
/*接收按键*/
/*判断按键,是否往相反方向移动,按Esc键则退出*/
if(key==ESC)break;
elseif(key==UP&
snake.direction!
=4)
snake.direction=MV_UP;
elseif(key==RIGHT&
=MV_LEFT)
snake.direction=MV_RIGHT;
elseif(key==LEFT&
=MV_RIGHT)
snake.direction=MV_LEFT;
elseif(key==DOWN&
=MV_UP)
snake.direction=MV_DOWN;
}/*endofwhile
(1)*/
/*结束游戏*/
voidGameOver(intscore)
cleardevice();
PrScore(score);
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"
GAMEOVER"
getch();
/*输出成绩*/
voidPrScore(intscore)
charstr[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"
score:
%d"
score);
outtextxy(55,20,str);
#include"
graphics.h"
/*图形系统头文件*/
#defineLEFT0x4b00/*光标左键值*/
#defineRIGHT0x4d00/*光标右键值*/
#defineDOWN0x5000/*光标下键值*/
#defineUP0x4800/*光标上键值*/
#defineESC0x011b/*Esc键值*/
#defineENTER0x1c0d/*Enter键值*/
intMap[8][8]={0};
/*用8×
8的数组来描绘棋盘*/
intscore1,score2;
/*两位棋手各自的得分,占1格得1分*/
voidPtoPGame(void);
/*人人对战函数*/
voidDrawChessboard(void);
/*画棋盘函数*/
voidSetChessColor(intx);
/*设置棋子第一次的颜色*/
voidRestoreChessColor(intx,inty);
/*恢复原来棋盘状态*/
intChessboardChange(intx,inty,intz);
/*判断棋盘的变化*/
voidCountScore(void);
/*统计分数*/
voidPrintScore(intn);
/*输出成绩*/
voidPrintWinner(void);
/*输出胜利者信息*/
/******主函数*********/
intgd=DETECT,gr;
initgraph(&
gr,"
/*初始化图形系统*/
DrawChessboard();
/*画棋盘*/
PtoPGame();
/*人人对战*/
closegraph();
/*关闭图形系统*/
voidDrawChessboard()/*画棋盘*/
inti,j;
score1=score2=0;
/*棋手一开始得分都为0*/
setbkcolor(RED);
for(i=100;
=420;
i+=40)
line(100,i,420,i);
/*画水平线*/
line(i,100,i,420);
/*画垂直线*/
setcolor(0);
/*取消圆周围的一圈东西*/
setfillstyle(SOLID_FILL,14);
/*黄色实体填充模式*/
fillellipse(500,200,15,15);
/*在显示得分的位置画棋*/
setfillstyle(SOLID_FILL,1);
/*蓝色实体填充模式*/
fillellipse(500,300,15,15);
Map[3][3]=Map[4][4]=1;
/*初始两个蓝棋棋子*/
Map[3][4]=Map[4][3]=2;
/*初始两个黄棋棋子*/
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(120+3*40,120+3*40,15,15);
fillellipse(120+4*40,120+4*40,15,15);
fillellipse(120+3*40,120+4*40,15,15);
fillellipse(120+4*40,120+3*40,15,15);
score1=score2=2;
/*有棋后改变分数*/
CountScore();
/*输出开始分数*/
voidPtoPGame()/*人人对战*/
intx,y,t=2;
/*t==2初始总是蓝方先下棋*/
inti,j,cc=0;
intkey;
while
(1)/*换棋手走棋*/
x=120;
/*设置游戏开始棋子的初始x坐标*/
y=80;
/*设置游戏开始棋子的初始y坐标*/
while
(1)/*具体一个棋手走棋的过程*/
PrintScore
(1);
/*输出棋手1的成绩*/
PrintScore
(2);
/*输出棋手2的成绩*/
SetChessColor(t);
/*变量t用来判断棋手所执棋子颜色*/
fillellipse(x,y,15,15);
/*接收按键*/
if(key==ESC)/*按Esc后打印当前胜负信息并结束游戏*/
PrintWinner();
exit(0);
elseif(key==ENTER)/*按Enter键,表示确定要落子*/
/*如果落子位置没有棋子*/
if(y!
=80&
Map[(x-120)/40][(y-120)/40]!
=1
&
=2)
if(t%2==1)/*如果是棋手1移动*/
Map[(x-120)/40][(y-120)/40]=1;
else/*否则棋手2移动*/
Map[(x-120)/40][(y-120)/40]=2;
/*落子后判断棋盘变化*/
if(!
ChessboardChange(x,y,t))
{
Map[(x-120)/40][(y-120)/40]=0;
/*恢复空格状态*/
cc++;
/*统计尝试次数*/
/*如果尝试超过空格数则恢复棋盘状态并停步*/
if(cc>
=64-score1-score2)
{
RestoreChessColor(x,y);
fillellipse(x,y,15,15);
break;
}
elsecontinue;
/*按键无效*/
}
CountScore();
/*输出分数的改变*/
/*棋盘变化,则轮对方走棋*/
elsecontinue;
/*已经有棋子则继续按键*/
elseif(key==LEFT&
x>
120)/*左方向键的处理*/
RestoreChessColor(x,y);
fillellipse(x,y,15,15);
SetChessColor(t);
x-=40;
elseif(key==RIGHT&
x<
400&
y>
80)/*右方向键*/
x+=40;
fillellips
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 游戏 程序 综合 实例