C语言贪吃蛇,浅AI

Cplusplus
happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

C语言贪吃蛇,浅AI

帖子 #1 happy886rr » 2016年09月28日 19:32

C语言写的贪吃蛇,只给它添加了10多行浅AI,智能度居中,还未添加行走策略,不过它已经有了一定的智商。
Code: [全选] [展开/收缩] [Download] (Untitled.c)
  1. #include   <conio.h>
  2. #include   <stdio.h>
  3. #include  <stdlib.h>
  4. #include    <time.h>
  5. #include <Windows.h>
  6.  
  7. /**********按键定义**************/
  8. #define U 8
  9. #define D 6
  10. #define L 9
  11. #define R 7
  12.  
  13. /**********初始化参数************/
  14. int Level=1,Score=0,ST;
  15. int POINT_V[31][31],SS=8,S=8;
  16. int Xe=15,Ye=30,X=15,Y=26,Xf,Yf,Xo=7,Yo=2;
  17.  
  18. /**********光标位置函数**********/
  19. void Pos(int x,int y)
  20. {
  21.     COORD pos;
  22.     HANDLE hOutput;
  23.     pos.X=x;
  24.     pos.Y=y;
  25.     hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
  26.     SetConsoleCursorPosition(hOutput,pos);
  27. }
  28.  
  29. /***********标数转换器***********/
  30. int Dx(int N)
  31. {
  32.     return (8-(N|1))*(N&1);
  33. }
  34. int Dy(int N)
  35. {
  36.     return (8-(N|1))*((N^1)&1);
  37. }
  38.  
  39. /***********判断自己的肉*********/
  40. int Sme(int N)
  41. {
  42.     if(N>5 && N<10){return 1;}
  43.     return 0;
  44. }
  45.  
  46. /**********初始化地图************/
  47. void CreatMap()
  48. {
  49.     int i,j;
  50.     printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
  51.     for(j=1;j<=30;j++) {printf("┃                              ┃\n");}
  52.     printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
  53.  
  54.     for(j=1;j<=30;j++){
  55.         for(i=1; i<=30;i++){
  56.             POINT_V[i][j]=0;       
  57.         }
  58.     }
  59.     for(j=27;j<=30;j++){
  60.         Pos(2*15,j);printf("■");
  61.         POINT_V[15][j]=8;
  62.     }
  63.     Pos(2*15,26);printf("⊙");
  64.     Pos(2*7,2);printf("△");
  65.     POINT_V[15][26]=3,POINT_V[7][2]=10;
  66. }
  67.  
  68. /**********按键获取**************/
  69. int Getkey(int N,int T)
  70. {
  71.     int i,KEY_V,start=clock();
  72.     do{
  73.         if(kbhit()){
  74.             KEY_V=(int)(getch());
  75.             if(KEY_V<97){KEY_V+=32;}
  76.             return KEY_V;
  77.         }
  78.         for(i=0;i<=N;i++);
  79.     }while((clock()-start)<T);
  80.     return -1;
  81. }
  82.  
  83. /***********游戏主程序***********/
  84. int GameCycle(int N, int T, int F1)
  85. {
  86.     int KEY_V;
  87.     while(1) {
  88.         KEY_V=Getkey(N,T);
  89.         if     (KEY_V==119 && SS!=D){SS=8;}
  90.         else if(KEY_V==115 && SS!=U){SS=6;}
  91.         else if(KEY_V==97  && SS!=R){SS=9;}
  92.         else if(KEY_V==100 && SS!=L){SS=7;}
  93.         else if(KEY_V==112){getch();}
  94.         else if(KEY_V==113){return 0;}
  95.         Pos(2,31);          
  96.         S=POINT_V[Xe][Ye],Xf=X+Dx(SS),Yf=Y+Dy(SS);                         //数据处理
  97.         if(Sme(POINT_V[Xf][Yf])){
  98.             if(F1==1 && (KEY_V<0)){
  99.                 if(Dy(SS)==0){
  100.                     ST=POINT_V[Xf][Yf],SS=(ST==6)?8:6,Xf=X,Yf=Y+Dy(SS);
  101.                 }
  102.                 else if(Dx(SS)==0){
  103.                     ST=POINT_V[Xf][Yf],SS=(ST==7)?9:7,Xf=X+Dx(SS),Yf=Y;
  104.                 }                  
  105.             }else{
  106.                 if(KEY_V<0){
  107.                     printf("蛇太贪了,连自己的肉也不放过!");
  108.                 }else{
  109.                     printf("蛇被你害死了!");
  110.                 }
  111.                 getch();
  112.                 return 0;
  113.             }
  114.         }
  115.         if(F1==1 && (KEY_V<0)){
  116.             if(Xf==0 || Xf==31 || Yf==0 || Yf==31){
  117.                 if(!Dy(SS)){
  118.                     SS=6+2*(rand()%2),Xf=X,Yf=Y+Dy(SS);
  119.                     if(Yf==0 || Yf==31){
  120.                         SS=(SS==6)?8:6,Yf=Y+Dy(SS);
  121.                     }
  122.                 }else{
  123.                     SS=7+2*(rand()%2),Xf=X+Dx(SS),Yf=Y;
  124.                     if(Xf==0 || Xf==31){
  125.                         SS=(SS==7)?9:7,Xf=X+Dx(SS);
  126.                     }
  127.                 }
  128.             }
  129.             if(Dy(SS)==0 && X==Xo){
  130.                 ST=SS,SS=(Y-Yo)>0?8:6,Xf=X,Yf=Y+Dy(SS);
  131.                 if(Sme(POINT_V[Xf][Yf])){SS=ST,Xf=X+Dx(SS),Yf=Y+Dy(SS);}
  132.             }
  133.             else if(Dx(SS)==0 && Y==Yo){
  134.                 ST=SS,SS=(X-Xo)>0?9:7,Xf=X+Dx(SS),Yf=Y;
  135.                 if(Sme(POINT_V[Xf][Yf])){SS=ST,Xf=X+Dx(SS),Yf=Y+Dy(SS);}
  136.             }
  137.         }
  138.         else if(Xf==0 || Xf==31 || Yf==0 || Yf==31){
  139.             printf("蛇死了,游戏结束!");
  140.             getch();
  141.             return 0;  
  142.         }
  143.         if(Sme(POINT_V[Xf][Yf])){
  144.             printf("蛇已被困住了!!!");
  145.             getch();
  146.             return 0;
  147.         }  
  148.         Pos(2*Xf,Yf);printf("⊙");                                         //动态显示
  149.         Pos(2*X,Y);printf("■");
  150.         POINT_V[X][Y]=SS;
  151.         if(POINT_V[Xf][Yf]<10){
  152.             Pos(2*Xe,Ye);printf(" ");
  153.             POINT_V[X][Y]=SS,POINT_V[Xe][Ye]=0;
  154.             Xe+=Dx(S),Ye+=Dy(S);
  155.         }else{
  156.             do{
  157.                 Xo=1+rand()%30,Yo=1+rand()%30;                     //随机食物
  158.                 if(POINT_V[Xo][Yo]==0){break;}
  159.             }while(POINT_V[Xo][Yo]!=0);
  160.             Pos(2*Xo,Yo);printf("△");
  161.             POINT_V[Xo][Yo]=10,Score++;
  162.             if(Score>Level*5){
  163.                 Level++,T-=1;
  164.             }
  165.         }
  166.         X=Xf,Y=Yf;
  167.         Pos(2,0);printf("[LEVEL %d]  Score:%d\n",Level,Score);
  168.     }
  169. }
  170.  
  171. /**********Main主函数***********/
  172. int main()
  173. {
  174.     srand((unsigned)time(NULL));
  175.     int N=50,T=20,F=1;
  176.     CreatMap();
  177.     GameCycle(N,T,F);
  178.     return 0;
  179. }
上次由 happy886rr 在 2016年09月28日 22:58,总共编辑 1 次。

头像
523066680
Administrator
Administrator
帖子: 333
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 29 times
Been thanked: 22 times
联系:

Re: C语言贪吃蛇,浅AI

帖子 #2 523066680 » 2016年09月28日 22:29

你试试将所有花括号都换行,过一阵子,就会有不同感受。
个人经历:
批处理的括号从来没有换行的说法,到了Perl,差不多一两年的时间都是写的短小的脚本,不需要换行。
很多人吐槽过,不予理会。直到用写那个终端wiki工具,上了千行,开始转行,也没觉得多特别,但是一两个月过去后,竟然无法
直视自己以前的代码……

happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

Re: C语言贪吃蛇,浅AI

帖子 #3 happy886rr » 2016年09月28日 23:13

523066680 写了:你试试将所有花括号都换行,过一阵子,就会有不同感受。…

:) 主要是使用大众风格,我只对函数体的花括号换行,其他一律连行,因为我一直都是记事本写C代码。记事本下都一个颜色,换了行会搞不清。代码编辑器很少用的,我90%的代码都用记事本搞得。当然现在正在学习使用编辑器调试,在编辑器下,我会换行的。

头像
523066680
Administrator
Administrator
帖子: 333
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 29 times
Been thanked: 22 times
联系:

Re: C语言贪吃蛇,浅AI

帖子 #4 523066680 » 2016年10月08日 08:35

batcher好像在那边python区转载过一个自动贪吃蛇直到填满屏幕的,一直没去看,希望有天能自己搞定 :shy


回到 “C/C++”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客