找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3815|回复: 0
打印 上一主题 下一主题
收起左侧

一个C语言编写的贪吃蛇游戏

[复制链接]
跳转到指定楼层
楼主
在VC6.0平台上,通过C语言和EasyX图形库编写的贪吃蛇小游戏,为了使用图形库函数,建立的文件是.cpp文件,使用的是C语言编写,游戏具有背景音乐,代码长度500行左右,代码和算法,都是我自己源生的,分享给有兴趣的朋友看看。


  1. #include<stdio.h>
  2. #include<graphics.h>
  3. #include<time.h>
  4. #include<conio.h>
  5. #include<easyx.h>


  6. #define MAXLEN 30
  7. #define MAXFOD 6
  8. #define eror 1
  9. #define ok 0
  10. #pragma comment ( lib, "Winmm.lib" )


  11. enum direction
  12. {
  13. left,up,right,down
  14. };
  15. int pos[MAXLEN][2];
  16. int food[MAXFOD][2];
  17. int LENFOD=0;
  18. int LENGTH=0;
  19. int MARK=0;
  20. int HIGHESTM=0;
  21. direction DIT;
  22. int snake();
  23. int drawLine();
  24. int init();
  25. int controlfood();
  26. int saveMark();
  27. boolean isdead();
  28. boolean iswin();
  29. int countmark();


  30. void main()
  31. {
  32. int i=0,count=1;
  33. srand((unsigned)time(0));
  34. initgraph(600,900);
  35. setcolor(YELLOW);
  36. setfont( 30, 0,"楷体");
  37. mciSendString( "open ./source/skycity.mp3 alias skycity", 0, 0, 0 );
  38. mciSendString( "play skycity repeat ", 0, 0, 0 );
  39. start:
  40. cleardevice();
  41. init();
  42. /*for(i=0;i<LENGTH;i++)
  43. printf("\n%d %d",pos[i][0],pos[i][1]);
  44. printf("\n");
  45. pos[0][1] -= 1;
  46. for(i=LENGTH-1;i>0;i--)
  47. {
  48. pos[i][0]=pos[i-1][0];
  49. pos[i][1]=pos[i-1][1];
  50. }
  51. closegraph();
  52. for(i=0;i<LENGTH;i++)
  53. printf("\n%d %d",pos[i][0],pos[i][1]);
  54. Sleep(50000);*/
  55. BeginBatchDraw();
  56. drawLine();
  57.     snake();
  58. FlushBatchDraw();


  59. while(true)
  60. {
  61. if(kbhit())
  62. {
  63. switch(getch())
  64. {

  65. case 27:
  66. saveMark();
  67. closegraph();
  68. exit(ok);
  69. break;
  70. case 72:
  71. case 'w':
  72. case 'W':
  73. if(DIT!=down)
  74. {
  75. DIT=up;
  76. for(i=LENGTH-1;i>0;i--)
  77. {
  78. pos[i][0]=pos[i-1][0];
  79. pos[i][1]=pos[i-1][1];
  80. }
  81. pos[0][1] -= 1;
  82. }
  83. break;
  84. case 80:
  85. case 's':
  86. case 'S':
  87. if(DIT!=up)
  88. {
  89. DIT=down;
  90. for(i=LENGTH-1;i>0;i--)
  91. {
  92. pos[i][0]=pos[i-1][0];
  93. pos[i][1]=pos[i-1][1];
  94. }
  95. pos[0][1] += 1;
  96. }
  97. break;
  98. case 75:
  99. case 'a':
  100. case 'A':
  101. if(DIT!=right)
  102. {
  103. DIT=left;
  104. for(i=LENGTH-1;i>0;i--)
  105. {
  106. pos[i][0]=pos[i-1][0];
  107. pos[i][1]=pos[i-1][1];
  108. }
  109. pos[0][0] -= 1;
  110. }
  111. break;
  112. case 77:
  113. case 'd':
  114. case 'D':
  115. if(DIT!=left)
  116. {
  117. DIT=right;
  118. for(i=LENGTH-1;i>0;i--)
  119. {
  120. pos[i][0]=pos[i-1][0];
  121. pos[i][1]=pos[i-1][1];
  122. }
  123. pos[0][0] += 1;
  124. }
  125. break;
  126. }
  127. cleardevice();
  128. controlfood();
  129. drawLine();
  130. countmark();
  131. snake();
  132. count=1;
  133. FlushBatchDraw();
  134. }
  135. if(LENGTH<10)
  136. {
  137. if(count==20)
  138. {
  139. count=0;
  140. }
  141. }
  142. else if(LENGTH<15&&LENGTH>9)
  143. {
  144. if(count==15)
  145. count=0;
  146. }
  147. else if(LENGTH<20&&LENGTH>14)
  148. {
  149. if(count==10)
  150. count=0;
  151. }
  152. else
  153. {
  154. if(count==5)
  155. count=0;
  156. }
  157. if(count==0)
  158. {
  159. for(i=LENGTH-1;i>0;i--)
  160. {
  161. pos[i][0]=pos[i-1][0];
  162. pos[i][1]=pos[i-1][1];
  163. }
  164. switch(DIT)
  165. {
  166. case up:
  167. pos[0][1] -= 1;
  168. break;
  169. case down:
  170. pos[0][1] += 1;
  171. break;
  172. case left:
  173. pos[0][0] -= 1;
  174. break;
  175. case right:
  176. pos[0][0] += 1;
  177. break;
  178. }
  179. cleardevice();
  180. controlfood();
  181. drawLine();
  182. countmark();
  183. snake();
  184. FlushBatchDraw(
  185. );
  186. }
  187. if(isdead())
  188. {
  189. mciSendString( "play Lose ", 0, 0, 0 );
  190. outtextxy(240,275,"LOSSING!");
  191. FlushBatchDraw();
  192. while(true)
  193. {
  194. if(kbhit())
  195. {
  196. switch(getch())
  197. {
  198. case 13:
  199. mciSendString( "close Lose ", 0, 0, 0 );
  200. mciSendString( "close win ", 0, 0, 0 );
  201. goto start;
  202. case 27:
  203. mciSendString( "close skycity ", 0, 0, 0 );
  204. closegraph();
  205. exit(ok);
  206. }
  207. }
  208. }
  209. }
  210. if(iswin())
  211. {
  212. mciSendString( "play win ", 0, 0, 0 );
  213. outtextxy(240,275,"WINNING!");
  214. FlushBatchDraw();
  215. while(true)
  216. {
  217. if(kbhit())
  218. {
  219. switch(getch())
  220. {
  221. case 13:
  222. mciSendString( "close Lose ", 0, 0, 0 );
  223. mciSendString( "close win ", 0, 0, 0 );
  224. goto start;
  225. case 27:
  226. mciSendString( "close skycity ", 0, 0, 0 );
  227. closegraph();
  228. exit(ok);
  229. }
  230. }
  231. }
  232. }
  233. count++;
  234. Sleep(20);
  235. }
  236. }


  237. int snake()
  238. {
  239. int i=0,j=0;
  240. setfillcolor(YELLOW);
  241. for(i=0;i<LENGTH;i++)
  242. solidcircle(pos[i][0]*20+10,pos[i][1]*20+10,10);
  243. setfillcolor(RED);
  244. i=0;
  245. if(DIT==left)
  246. {
  247. solidcircle(pos[i][0]*20+5,pos[i][1]*20+5,3);
  248. solidcircle(pos[i][0]*20+5,pos[i][1]*20+15,3);
  249. }
  250. else if(DIT==right)
  251. {
  252. solidcircle(pos[i][0]*20+15,pos[i][1]*20+5,3);
  253. solidcircle(pos[i][0]*20+15,pos[i][1]*20+15,3);
  254. }
  255. else if(DIT==down)
  256. {
  257. solidcircle(pos[i][0]*20+5,pos[i][1]*20+15,3);
  258. solidcircle(pos[i][0]*20+15,pos[i][1]*20+15,3);
  259. }
  260. else
  261. {
  262. solidcircle(pos[i][0]*20+5,pos[i][1]*20+5,3);
  263. solidcircle(pos[i][0]*20+15,pos[i][1]*20+5,3);
  264. }
  265. setfillcolor(GREEN);
  266. //setfont( 18, 0,"楷体");
  267. for(i=0;i<LENFOD;i++)
  268. {
  269. solidcircle(food[i][0]*20+10,food[i][1]*20+10,7);
  270. /*j=rand()%2;
  271. if(j==0)
  272. {
  273. outtextxy(food[i][0]*20+1,food[i][1]*20+1,"");
  274. }
  275. else if(j==1)
  276. {
  277. outtextxy(food[i][0]*20+1,food[i][1]*20+1,"");
  278. }
  279. else
  280. {
  281. outtextxy(food[i][0]*20+1,food[i][1]*20+1,"");
  282. }*/
  283. }
  284. //setfont( 30, 0,"楷体");
  285. //solidcircle(food[i][0]*20+10,food[i][1]*20+10,7);
  286. setfillcolor(GREEN);
  287. return ok;
  288. }
  289. int drawLine()
  290. {
  291. int i;
  292. for(i=20;i<600;i+=20)
  293. {
  294. line(0,i,600,i);
  295. line(i,0,i,600);
  296. }
  297. line(0,i,600,i);
  298. line(0,i+5,600,i+5);
  299. return ok;
  300. }
  301. int init()
  302. {
  303. int i,j,k,l;
  304. FILE * fp;
  305. mciSendString( "open ./source/Lose.mp3 alias Lose", 0, 0, 0 );
  306. mciSendString( "open ./source/win.mp3 alias win", 0, 0, 0 );
  307. LENGTH=0;
  308. LENFOD=0;
  309. MARK=0;
  310. if((fp=fopen("highestscore.txt","r"))==NULL)
  311. {
  312. printf("File open eror!\n");
  313. exit(eror);
  314. }
  315. else
  316. {
  317. fscanf(fp,"%d",&HIGHESTM);
  318. if(fclose(fp))
  319. {
  320. printf("file close eror\n");
  321. exit(eror);
  322. }
  323. }
  324. setlinecolor(GREEN);
  325. setfillcolor(YELLOW);
  326. i=rand()%10+10;
  327. j=rand()%10+10;
  328. k=rand()%4;
  329.     pos[0][0] = i;
  330. pos[0][1] = j;
  331. if(k==0)
  332. {
  333. for(i=1;i<5;i++)
  334. {
  335. pos[i][1]=pos[i-1][1]+1;
  336. pos[i][0]=pos[i-1][0];
  337. DIT=up;
  338. }
  339. }
  340. else if(k==1)
  341. {
  342. for(i=1;i<5;i++)
  343. {
  344. pos[i][0]=pos[i-1][0]-1;
  345. pos[i][1]=pos[i-1][1];
  346. DIT=right;
  347. }
  348. }
  349. else if(k==2)
  350. {
  351. for(i=1;i<5;i++)
  352. {
  353. pos[i][1]=pos[i-1][1]-1;
  354. pos[i][0]=pos[i-1][0];
  355. DIT=down;
  356. }
  357. }
  358. else
  359. {
  360. for(i=1;i<5;i++)
  361. {
  362. pos[i][0]=pos[i-1][0]+1;
  363. pos[i][1]=pos[i-1][1];
  364. DIT=left;
  365. }
  366. }
  367. LENGTH=5;
  368. k=rand()%4+1;
  369. for(l=0;l<k;l++)

  370. {
  371. i=rand()%30;
  372.    j=rand()%30;
  373. food[LENFOD][0]=i;
  374. food[LENFOD++][1]=j;
  375. for(int m=0;m<LENGTH;m++)
  376. if(i==pos[m][0]&&j==pos[m][1])
  377. {
  378. l--;
  379. LENFOD--;
  380. break;
  381. }
  382. }
  383. return ok;
  384. }
  385. int controlfood()
  386. {
  387. int i=0,j,k,l;
  388. for(i=0;i<LENFOD;i++)
  389. {
  390. if(pos[0][0]==food[i][0]&&pos[0][1]==food[i][1])
  391. {
  392. if(LENGTH<10)
  393. {
  394. MARK+=5;
  395. }
  396. else if(LENGTH<15)
  397. {
  398. MARK+=10;
  399. }
  400. else if(LENGTH<20)
  401. {
  402. MARK+=15;
  403. }
  404. else if(LENGTH<25)
  405. {
  406. MARK+=20;
  407. }
  408. else
  409. {
  410. MARK+=25;
  411. }
  412. break;
  413. }
  414. }
  415. if(i<LENFOD)
  416. {
  417. for(j=i;j<LENFOD-1;j++)
  418. {
  419. food[j][0]=food[j+1][0];
  420. food[j][1]=food[j+1][1];
  421. }
  422. LENFOD--;
  423. LENGTH++;
  424. pos[LENGTH-1][0]=pos[LENGTH-2][0]*2-pos[LENGTH-3][0];
  425. pos[LENGTH-1][1]=pos[LENGTH-2][1]*2-pos[LENGTH-3][1];
  426. }
  427. if(LENFOD<2)
  428. {
  429. k=rand()%4+1;
  430. for(l=0;l<k;l++)

  431. {
  432. i=rand()%30;
  433. j=rand()%30;
  434. food[LENFOD][0]=i;
  435. food[LENFOD++][1]=j;
  436. for(int m=0;m<LENGTH;m++)
  437. if(i==pos[m][0]&&j==pos[m][1])
  438. {
  439. l--;
  440. LENFOD--;
  441. break;
  442. }
  443. }
  444. }
  445. return ok;
  446. }
  447. boolean isdead()
  448. {
  449. int i;
  450. if(pos[0][0]<0||pos[0][0]>30||pos[0][1]<0||pos[0][1]>30)
  451. {
  452. saveMark();
  453. return true;
  454. }
  455. for(i=3;i<LENGTH;i++)
  456. if(pos[0][0]==pos[i][0]&&pos[0][1]==pos[i][1])
  457. return true;
  458. return false;
  459. }
  460. boolean iswin()
  461. {
  462. if(LENGTH==MAXLEN&&!isdead())
  463. {
  464. saveMark();
  465. return true;
  466. }
  467. else
  468. return false;
  469. }
  470. int countmark()
  471. {
  472. char num[10];
  473. sprintf(num, "%d", HIGHESTM);
  474. outtextxy(60,610,"Highest:");
  475. outtextxy(200,610,num);
  476. outtextxy(350,610,"YouScore:");
  477. sprintf(num, "%d", MARK);
  478. outtextxy(490,610,num);
  479. return ok;
  480. }
  481. int saveMark()
  482. {
  483. FILE * fp;
  484. if(MARK>HIGHESTM)
  485. {
  486. if((fp=fopen("highestscore.txt","w"))==NULL)
  487. {
  488. printf("File open eror!\n");
  489. exit(eror);
  490. }
  491. else
  492. {
  493. fprintf(fp,"%d",MARK);
  494. if(fclose(fp))
  495. {
  496. printf("file close eror\n");
  497. exit(eror);
  498. }
  499. }
  500. }
  501. return ok;
  502. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表