批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

C 语言贪吃蛇

本帖最后由 Gin_Q 于 2020-8-27 20:33 编辑

# 思路来自(知乎 id = int)int
# 还有些功能没有写!
  1. /*
  2. @ BY COOL_BREEZE
  3. @ 2020-08-27
  4. */
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<time.h>
  8. #include<conio.h>
  9. #include<windows.h>
  10. #define HIGHT 30
  11. #define WIDTH 100
  12. // dos窗口显示模式
  13. #define MODE(X, Y) "MODE CON COLS="#X" LINES="#Y
  14. #define HAD (GetStdHandle(STD_OUTPUT_HANDLE))
  15. // 蛇的结构体开辟内存空间
  16. #define CALLSNAKE ((SNAKEP)malloc(sizeof(SNAKEV)))
  17. void hidecursor(void); // 改变光标的显示方式
  18. void gotoxy_print(int x, int y, char icon); // 移动光标到指定位置打印图标
  19. void __init__(void); // 初始化边框
  20. void create_snake(void); // 生成蛇
  21. void move_snake(void); // 移动蛇
  22. void create_food(void); // 生成食物
  23. void get_keyborad_input(void); // 获取键盘值
  24. int hit_the_wall(void); // 蛇撞墙
  25. void game_method(void);
  26. typedef struct SNAKE
  27. {
  28. int x;  
  29. int y;
  30. struct SNAKE* next;
  31. } SNAKEV, *SNAKEP;
  32. SNAKEP SNAKE_HEAD; //蛇头
  33. SNAKEP SNAKE_FOOD; //食物
  34. //蛇前进的方向
  35. #define U 0X48 // 上
  36. #define D 0X50 // 下
  37. #define L 0X4B // 左
  38. #define R 0X4D // 右
  39. #define S 0X7F // 空格 暂停
  40. char DIRECTION = L; // 默认蛇往左边移动
  41. char HEAD_ICON = 0XF;
  42. char BODY_ICON = 0XB;
  43. char FOOD_ICON = 0X24;
  44. char NULL_ICON = 0X20;
  45. int main(void)
  46. {
  47. system(MODE(130, 30));
  48. system("title 贪吃蛇游戏");
  49. game_method();
  50. hidecursor();
  51. __init__();
  52. SNAKE_FOOD = CALLSNAKE;
  53. create_snake();
  54. create_food();
  55. int ser; // 延迟
  56. while(1)
  57. {
  58. ser = 0;
  59. move_snake();
  60. if (kbhit()) // 检查键盘是否被按下,非阻塞的 (相当于多线程)
  61. {
  62. get_keyborad_input();
  63. Sleep(20);
  64. ser = 1;
  65. }
  66. if (hit_the_wall())
  67. {
  68. gotoxy_print((WIDTH-8) / 2, HIGHT / 2, NULL_ICON);
  69. printf("游戏结束");
  70. system("pause >nul");
  71. break;
  72. }
  73. if (ser)
  74. Sleep(10);
  75. else Sleep(200);
  76. }
  77. return 0;
  78. }
  79. void hidecursor(void)
  80. {
  81. CONSOLE_CURSOR_INFO show = {1, 0};
  82. SetConsoleCursorInfo(HAD, &show);
  83. }
  84. void gotoxy_print(int x, int y, char icon)
  85. {
  86. COORD poin = {x, y}; // 结构体
  87. SetConsoleCursorPosition(HAD, poin); // 跳转到窗口指定位置
  88. printf("%c", icon);
  89. }
  90. void game_method(void)
  91. {
  92. gotoxy_print(WIDTH + 5, HIGHT/2-7, NULL_ICON);
  93. printf("DATE 2020-08-27");
  94. gotoxy_print(WIDTH + 5, HIGHT/2-6, NULL_ICON);
  95. printf("BY COOL_BREEZE");
  96. gotoxy_print(WIDTH + 5, HIGHT/2-4, NULL_ICON);
  97. printf("空格 暂停");
  98. gotoxy_print(WIDTH + 5, HIGHT/2-3, NULL_ICON);
  99. printf("向上 ↑");
  100. gotoxy_print(WIDTH + 5, HIGHT/2-2, NULL_ICON);
  101. printf("向下 ↓");
  102. gotoxy_print(WIDTH + 5, HIGHT/2-1, NULL_ICON);
  103. printf("向左 ←");
  104. gotoxy_print(WIDTH + 5, HIGHT/2, NULL_ICON);
  105. printf("向右 →");
  106. }
  107. void __init__(void)
  108. {
  109. int i = 0;
  110. gotoxy_print(0, 0, 0X1); // 角落  1
  111. gotoxy_print(WIDTH-1, 0, 0X2); // 角落  2
  112. for (i=1; i<WIDTH-1; i++) // 上下边框
  113. {
  114. gotoxy_print(i, 0, 0X6);
  115. gotoxy_print(i, HIGHT-1, 0X6);
  116. }
  117. for (i=1;i<HIGHT-1; i++) // 左右边框
  118. {
  119. gotoxy_print(0, i, 0X5);
  120. gotoxy_print(WIDTH-1, i, 0X5);
  121. }
  122. gotoxy_print(0, HIGHT-1, 0X3); // 角落  3
  123. gotoxy_print(WIDTH-1, HIGHT-1, 0X4); // 角落  4
  124. }
  125. void create_snake(void)
  126. {
  127. int i = 0,x = (WIDTH-6) / 2, y = HIGHT / 2; //在中心创建蛇
  128. SNAKEP phead, pend;
  129. for (; i<6; i++) // 蛇默认长度为6
  130. {
  131. pend = CALLSNAKE;
  132. if (!i)
  133. {
  134. SNAKE_HEAD = phead = pend;
  135. pend->x = x;
  136. pend->y = y;
  137. gotoxy_print(SNAKE_HEAD->x, SNAKE_HEAD->y, HEAD_ICON);
  138. }
  139. else
  140. {
  141. phead->next = pend;
  142. pend->x = x + i; // 蛇身体在头右方
  143. pend->y = y;
  144. gotoxy_print(pend->x, pend->y, BODY_ICON);
  145. phead = pend;
  146. }
  147. }
  148. pend->next = NULL;
  149. }
  150. void move_snake(void)
  151. {
  152. SNAKEP head = CALLSNAKE; // 蛇新的头部
  153. switch (DIRECTION)
  154. {
  155. case U:
  156. head->x = SNAKE_HEAD->x;
  157. head->y = SNAKE_HEAD->y - 1;
  158. break;
  159. case D:
  160. head->x = SNAKE_HEAD->x;
  161. head->y = SNAKE_HEAD->y + 1;
  162. break;
  163. case L:
  164. head->x = SNAKE_HEAD->x - 1;
  165. head->y = SNAKE_HEAD->y;
  166. break;
  167. case R:
  168. head->x = SNAKE_HEAD->x + 1;
  169. head->y = SNAKE_HEAD->y;
  170. break;
  171. case S:
  172. system("pause >nul");
  173. break;
  174. }
  175. head->next = SNAKE_HEAD; // 旧头部连接新头部 使旧头部成为身体
  176. SNAKE_HEAD = head; // 获取头部
  177. if (SNAKE_HEAD->x == SNAKE_FOOD->x && SNAKE_HEAD->y == SNAKE_FOOD->y) // 检查蛇是否吃到食物
  178. {
  179. while (head) // 吃到了食物蛇蛇尾不需要释放
  180. {
  181. if (head == SNAKE_HEAD)
  182. gotoxy_print(SNAKE_HEAD->x, SNAKE_HEAD->y, HEAD_ICON);
  183. else
  184. gotoxy_print(head->x, head->y, BODY_ICON);
  185. head = head->next;
  186. }
  187. create_food();
  188. }
  189. else
  190. {
  191. while (head->next->next) // 没吃到食物释放掉蛇尾
  192. {
  193. if (head == SNAKE_HEAD)
  194. gotoxy_print(SNAKE_HEAD->x, SNAKE_HEAD->y, HEAD_ICON);
  195. else
  196. gotoxy_print(head->x, head->y, BODY_ICON);
  197. head = head->next;
  198. }
  199. gotoxy_print(head->next->x, head->next->y, NULL_ICON);
  200. free(head->next);
  201. head->next = NULL;
  202. }
  203. }
  204. void create_food(void)
  205. {
  206. SNAKEP  temp;
  207. while (1)
  208. {
  209. srand(time(NULL)); // 获取新种子 生成新的随机数
  210. SNAKE_FOOD->x = rand() % (WIDTH - 2) + 1; // 确保坐标只会出现在表格内(不包括表格)
  211. SNAKE_FOOD->y = rand() % (HIGHT - 2) + 1; // 确保坐标只会出现在表格内(不包括表格)
  212. temp = SNAKE_HEAD;
  213. while(temp) // 食物落在蛇身上重新获取
  214. {
  215. if (temp->x == SNAKE_FOOD->x && temp->y == SNAKE_FOOD->y)
  216. continue;
  217. else
  218. {
  219. gotoxy_print(SNAKE_FOOD->x, SNAKE_FOOD->y, FOOD_ICON);
  220. break;
  221. }
  222. }
  223. break;
  224. }
  225. }
  226. void get_keyborad_input(void)
  227. {
  228. int key = 0;
  229.     while (1)
  230.     {
  231.         key = getch();
  232.         if (key == 224) // 键盘方向键需要获取两次
  233.         {
  234.             key = getch();
  235.             if (key == U ||\
  236.                 key == D ||\
  237.                 key == L ||\
  238.                 key == R)
  239.             {
  240.              DIRECTION = key;
  241.              break;
  242. }
  243.             else continue;
  244.         }
  245.     }
  246. }
  247. int hit_the_wall(void)
  248. {
  249. if (SNAKE_HEAD->x == 0 || SNAKE_HEAD->x == WIDTH-1 ||\
  250. SNAKE_HEAD->y == 0 || SNAKE_HEAD->y == HIGHT-1 )
  251. return 1;
  252. return 0;
  253. }
复制代码

回复 1# Gin_Q


这个效果也挺酷:
http://bbs.bathome.net/thread-24093-1-1.html
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我帮忙写的代码不需要付钱,不用找我要支付宝或微信账号。如果一定要给,请到微信群给大家发红吧。

TOP

回复 2# Batcher


    代码哪里有问题,卡卡的!难搞咯!

TOP

本帖最后由 wujunkai 于 2020-9-20 11:49 编辑

回复 3# Gin_Q


    断断续续优化了2年,C++的
  1. /* 贪吃蛇 3.40.0 */
  2. #include<cstdio>
  3. #include<windows.h>
  4. #define HIT
  5. #define UP 1
  6. #define LEFT 2
  7. #define DOWN 3
  8. #define RIGHT 4
  9. #define HEAD 5
  10. #define WALL 22
  11. #define Handle GetStdHandle(STD_OUTPUT_HANDLE)
  12. #define Pempty(a) Psame(a,' ')
  13. #define Key(a) GetAsyncKeyState(a)
  14. #define elif else if
  15. struct botton{
  16. int x ,y ;
  17. int length ;
  18. };
  19. struct bearing:POINT{
  20. void walk(int Flag);
  21. };
  22. struct Snake{
  23. int Sum ;
  24. int Flag ;
  25. int Grade ;
  26. int Color ;
  27. int Speed ;
  28. bool Life ;
  29. bool Active ;
  30. bearing End ;
  31. bearing Head ;
  32. Snake(int color,int speed,bool life) ;
  33. void Move() ;
  34. void Smarter() ;
  35. void Re(int flag,POINT pos) ;
  36. void Go(bool iiSmart,bool iiSmarter,int faster) ;
  37. void Direction(int up,int left,int down,int right) ;
  38. };
  39. bool Pcolor(int,int) ;
  40. bool Hit(botton,int) ;
  41. char*Psame(int,char) ;
  42. bool Pposition(int,int) ;
  43. void Dead() ;
  44. void Menu() ;
  45. void Foods() ;
  46. void Levels() ;
  47. void GradeIn() ;
  48. void Prepare() ;
  49. void Setting() ;
  50. void GradeInput() ;
  51. void Pedge(botton) ;
  52. void GradeOutput(int) ;
  53. void Walk(int,long&,long&) ;
  54. POINT Food = {} ;
  55. //   第一个人 第二个人 电脑
  56. Snake Frst(10,1,true) ,Scnd(14,1,false) ,Auto( 1,1,false) ;
  57. int Level = 1 ;
  58. int Score[4] = {} ;
  59. int Map[WALL][WALL] = {} ;
  60. // 开始 菜单 死亡
  61. bool iBegin = true ,iMenu = false ,iDead = true ;
  62. // 加速 循环地图 竞技模式
  63. bool iFast = true ,iFor = true ,iRace = false ;
  64. // 迷宫模式 额外奖励 帮助
  65. bool iMaze = false ,iPrize = false ,iHelp = false ;
  66. // 调试模式
  67. bool iDebug = false ;
  68. const char wLevel[5][5] ={"简单","普通","困难","炼狱","调试"} ;
  69. /* 初始化蛇 */
  70. Snake::Snake(int color,int speed,bool life)
  71. {
  72. Color=color ;
  73. Speed=speed ;
  74. Life=life ;
  75. }
  76. /* 数据导入 */
  77. void GradeIn()
  78. {
  79. if(fopen("score.log","rb"))
  80. fscanf(fopen("score.log","rb"),"%d%d%d",Score,Score+1,Score+2) ;
  81. }
  82. /* 检测击键 */
  83. bool Hit(botton bot,int key)
  84. {
  85. #ifdef HIT
  86. RECT rect={} ;
  87. POINT pos={} ;
  88. GetCursorPos(&pos) ;
  89. GetWindowRect(GetConsoleWindow(),&rect) ;
  90. int x=(pos.x-rect.left-6)/8 , y=(pos.y-rect.top-32)/16 ;
  91. return(x>=bot.x&&x<bot.x+bot.length&&y>=bot.y&&y<=bot.y+2)&&Key(key) ;
  92. #endif
  93. return false;
  94. }
  95. /* 选择菜单 */
  96. void Menu()
  97. {
  98. int place=0 ;
  99. void (*function[])()={Prepare,Levels,GradeInput,Setting} ;
  100. botton bot[5]={{16,7,12},{13,10,18},{13,13,10},{23,13,8},{16,16,12}} ;
  101. Print:
  102. system("cls") ;
  103. printf("\n\n\n%s贪%s吃%s蛇\n\n\n\n",Pempty(17),Pempty(2),Pempty(2),Pcolor(15,3)) ;
  104. printf("\n%s开始游戏\n\n",Pempty(18)) ;
  105. printf("\n%s游戏难度 :%s\n\n",Pempty(15),wLevel[Level]) ;
  106. printf("\n%s排行榜%s设置\n\n",Pempty(15),Pempty(4)) ;
  107. printf("\n%s退出游戏",Pempty(18)) ;
  108. Pedge(bot[place]);
  109. Scan:
  110. Sleep(125) ;
  111. if (Key(' ')||Key(VK_RETURN)){
  112. if(place<4)
  113. function[place]() ;
  114. if(place==0||place==4){
  115. iBegin=(place==0);
  116. return ;
  117. }
  118. place=0 ;
  119. }
  120. elif ((Key('S')||Key(VK_DOWN)) && place!=4)
  121. place+=(place==2)?2:1 ;
  122. elif ((Key('W')||Key(VK_UP)) && place!=0)
  123. place-=(place==3)?2:1 ;
  124. elif ((Key('D')||Key(VK_RIGHT)) && place==2)
  125. place++ ;
  126. elif ((Key('A')||Key(VK_LEFT)) && place==3)
  127. place-- ;
  128. else
  129. goto Scan ;
  130. goto Print ;
  131. }
  132. /* 难度选择 */
  133. void Levels()
  134. {
  135. Print:
  136. system("cls") ;
  137. printf("\n\n\n%s困 难 度 选 择\n\n\n\n",Pempty(15)) ;
  138. for(int i=0 ;i<4+iDebug ;i++)
  139. printf("%s%s\n\n\n",Pempty(20),wLevel[i]) ;
  140. Pedge({18,(Level+2)*3,8});
  141. Scan:
  142. Sleep(125) ;
  143. if ((Key('S')||Key(VK_DOWN)) && Level != 3+iDebug)
  144. Level++ ;
  145. elif((Key('W')||Key(VK_UP)) && Level != 0)
  146. Level-- ;
  147. elif(Key(' ')||Key(VK_RETURN))
  148. return ;
  149. else
  150. goto Scan ;
  151. goto Print ;
  152. }
  153. /* 排行数据 */
  154. void GradeInput()
  155. {
  156. system("cls") ;
  157. printf("\n\n\n%s排 行 榜\n\n",Pempty(18)) ;
  158. for(int i=0 ;i<3 ;i++)
  159. printf("%s第%d名: %d\n\n",Pempty(17) ,i+1,Score[i]) ;
  160. printf("\n\n\n%s知道了\n\n",Pempty(19)) ;
  161. Pedge({17,13,10});
  162. for(Sleep(125) ; !(Key(' ') ||Key(VK_RETURN)) ;Sleep(125)) ;
  163. }
  164. /* 游戏设置 */
  165. void Setting()
  166. {
  167. bool iClear = false ;
  168. bool *str[10] = {&iDead ,&iFor ,&iHelp ,&iMaze ,&iPrize ,&iRace ,&Auto.Life ,&Scnd.Life ,&iClear ,&iDebug } ;
  169. char name[10][9] = {"死亡判定" ,"循环地图" ,"智能辅助" ,"迷宫地图" ,"额外奖励" ,"淘汰模式" ,"人机模式" ,"双人模式" ,"分数清理" ,"调试模式" } ;
  170. int place = 0 ;
  171. Print:
  172. system("cls") ;
  173. printf("\n\n%s设%s置\n\n\n",Pempty(18),Pempty(4)) ;
  174. for(int i=0;i<10;i+=2){
  175. printf("%s%s%s%s\n\n\n",Pempty(4),name[i],Pempty(11),name[i+1],Pposition(0,i/2*3+5),Pcolor(15,3));
  176. printf("%s",(*str[i]  )?"  开":"关",Pposition(16,i/2*3+5),Pcolor((*str[i]  )?3:15,(*str[i])?15:3));
  177. printf("%s",(*str[i+1])?"  开":"关",Pposition(36,i/2*3+5),Pcolor((*str[i+1])?3:15,(*str[i+1])?15:3));
  178. }
  179. printf("\n\n\n%s退%s出",Pempty(16),Pempty(5),Pcolor(15,3));
  180. if(place<10)
  181. Pedge({(place%2)?34:14,place/2*3+4,8}) ;
  182. else
  183. Pedge({14,19,13}) ;
  184. Scan:
  185. if  ((iFast||!iDead)&&!iDebug)
  186. iDead=true;
  187. Sleep(125) ;
  188. if  ( (Key('S')||Key(VK_DOWN)) && place < 10)
  189. place+=2 ;
  190. elif( (Key('W')||Key(VK_UP)) && place > 1)
  191. place-=2 ;
  192. elif( (Key('A')||Key(VK_LEFT)) && place%2 == 1)
  193. place-- ;
  194. elif( (Key('D')||Key(VK_RIGHT)) && place%2 == 0)
  195. place++ ;
  196. elif(Key(' ')||Key(VK_RETURN)){
  197. if(place>=10)
  198. return ;
  199. *str[place]=!(*str[place]);
  200. }
  201. else
  202. goto Scan ;
  203. if(iClear)
  204. Score[0] = Score[1] = Score[2] = Score[3]= 0 ;
  205. goto Print ;
  206. }
  207. /* 主函数 */
  208. int main()
  209. {
  210. system("color 3f&mode con cols=44 lines=24&title 贪吃蛇") ;
  211. GradeIn() ;
  212. Menu:
  213. Menu() ;
  214. while( iBegin ){
  215. Frst.Direction('W','A','S','D' );
  216. Scnd.Direction(VK_UP,VK_LEFT,VK_DOWN,VK_RIGHT) ;
  217. if( !Scnd.Life )
  218. Frst.Direction(VK_UP,VK_LEFT,VK_DOWN,VK_RIGHT) ;
  219. Frst.Go(iHelp ,false ,'R' ) ;
  220. Scnd.Go(iHelp ,false ,VK_NUMPAD0 ) ;
  221. Auto.Go(true ,true ,-1 ) ;
  222. if(iDead&&(Frst.Active&& Map[Frst.Head.y][Frst.Head.x] != HEAD)||
  223.   (Auto.Active&& Map[Auto.Head.y][Auto.Head.x] != HEAD)||
  224.   (Scnd.Active&& Map[Scnd.Head.y][Scnd.Head.x] != HEAD))
  225. Dead() ;
  226. if(iMenu){
  227. GradeOutput(Frst.Grade+Scnd.Grade) ;
  228. goto Menu ;
  229. }
  230. Sleep((iDebug&&Level==4)?0 : ( Level < 3)?(150 -(Level * 50)) :(rand() % 80)) ;
  231. }
  232. return 0 ;
  233. }
  234. /* 运动处理 */
  235. void Snake::Go(bool iiSmart,bool iiSmarter,int faster)
  236. {
  237. for(int i=0;((iFast&&Key(faster))||i<Speed)&&Active;i++){
  238. iMenu = Key(VK_ESCAPE) ;
  239. if(iiSmarter)
  240. Smarter() ;
  241. if(iiSmart)
  242. for(int i=0 ;i<16 ;i++)
  243. if((Flag==LEFT && Map[Head.y]  [Head.x-1])||
  244.    (Flag==DOWN && Map[Head.y+1][Head.x]  )||
  245.    (Flag==RIGHT && Map[Head.y]  [Head.x+1])||
  246.    (Flag==UP && Map[Head.y-1][Head.x]  ))
  247. Flag=rand()%4+1 ;
  248. Move() ;
  249. }
  250. }
  251. /* 智能方向 */
  252. void Snake::Smarter()
  253. {
  254. Map[Food.y][Food.x]=-2 ;
  255. for(int nem=0 ;nem<50&&Map[Head.y-1][Head.x]!=-2&&Map[Head.y+1][Head.x]!=-2&&Map[Head.y][Head.x-1]!=-2&&Map[Head.y][Head.x+1]!=-2 ;nem++){
  256. for(int i=1 ;i<WALL-1 ;i++){
  257. for(int j=1 ;j<WALL-1 ;j++){
  258. if(Map[i][j]==-2){
  259. if(Map[i-1][j]==0)
  260. Map[i-1][j]=-1 ;
  261. if(Map[i+1][j]==0)
  262. Map[i+1][j]=-1 ;
  263. if(Map[i][j-1]==0)
  264. Map[i][j-1]=-1 ;
  265. if(Map[i][j+1]==0)
  266. Map[i][j+1]=-1 ;
  267. }
  268. }
  269. }
  270. if(iFor){
  271. for(int i=0 ;i<WALL ;i++){
  272. for(int j=0 ;j<WALL ;j+=(i==0||i==WALL-1)?1:WALL-1){
  273. if(Map[i][j]==-1){
  274. Map[(i==0||i==WALL-1)?abs(i-WALL+1):i][(j==0||j==WALL-1)?abs(j-WALL+1):j] = (Map[(i==0||i==WALL-1)?abs(i-WALL+1):i][(j==0||j==WALL-1)?abs(j-WALL+1):j]==0)?-2:Map[(i==0||i==WALL-1)?abs(i-WALL+1):i][(j==0||j==WALL-1)?abs(j-WALL+1):j] ;
  275. Map[(i==0||i==WALL-1)?abs(i-WALL+2):i][(j==0||j==WALL-1)?abs(j-WALL+2):j] = (Map[(i==0||i==WALL-1)?abs(i-WALL+2):i][(j==0||j==WALL-1)?abs(j-WALL+2):j]==0)?-2:Map[(i==0||i==WALL-1)?abs(i-WALL+2):i][(j==0||j==WALL-1)?abs(j-WALL+2):j] ;
  276. }
  277. }
  278. }
  279. }
  280. for(int i=0 ;i<WALL ;i++)
  281. for(int j=0 ;j<WALL ;j++)
  282. Map[i][j]=(Map[i][j]==-1)?-2:Map[i][j] ;
  283. }
  284. if (Map[Head.y-1][Head.x]==-2)
  285. Flag=UP ;
  286. elif(Map[Head.y+1][Head.x]==-2)
  287. Flag=DOWN ;
  288. elif(Map[Head.y][Head.x-1]==-2)
  289. Flag=LEFT ;
  290. elif(Map[Head.y][Head.x+1]==-2)
  291. Flag=RIGHT ;
  292. for(int i=0 ;i<WALL ;i++)
  293. for(int j=0 ;j<WALL ;j++)
  294. if(Map[i][j]==-2)
  295. Map[i][j]=0 ;
  296. }
  297. /* 定位打印 */
  298. bool Pposition(int x ,int y)
  299. {
  300. CONSOLE_CURSOR_INFO CurSor ={};
  301. SetConsoleCursorPosition(Handle, { x,y }) ;
  302. GetConsoleCursorInfo(Handle,&CurSor) ;
  303. CurSor.bVisible = false ;
  304. SetConsoleCursorInfo(Handle,&CurSor) ;
  305. }
  306. /* 字体颜色 */
  307. bool Pcolor( int a ,int b)
  308. {
  309. SetConsoleTextAttribute(Handle, a + b * 0x10) ;
  310. }
  311. /* 批量打印 */
  312. char*Psame (int n,char word)
  313. {
  314. char * turn=new char [n+1] ;
  315. memset(turn,word,n);
  316. turn[n]=0;
  317. return turn ;
  318. }
  319. /* 边框打印 */
  320. void Pedge(botton the)
  321. {
  322. for(int i=0;i<2;i++){
  323. printf("%s",Psame(the.length,'-'),Pposition(the.x,the.y+i*2),Pcolor(15,3));
  324. printf("#" ,Pposition(the.x+i*(the.length-1),the.y+1));
  325. }
  326. }
  327. /* 运行准备 */
  328. void Prepare()
  329. {
  330. Frst.Re(RIGHT,{3,10}) ;
  331. if(Auto.Life)
  332. Scnd.Re(DOWN,{11,3});
  333. else
  334. Scnd.Re(LEFT,{18,10}) ;
  335. Auto.Re(LEFT,{18,10}) ;
  336. iMenu = false ;
  337. system("cls") ;
  338. for(int i = 0 ; i < WALL ; i++){
  339. for(int j = 0 ; j < WALL ; j++){
  340. Map[i][j] = 0;
  341. if ( i == 0 || i == WALL -1 || j == 0 || j == WALL -1){
  342. Map[i][j] = (iFor)?0:WALL;
  343. printf("■",Pcolor( 15,3)) ;
  344. }
  345. else
  346. printf("%s",Pempty(2),Pcolor( 3 , 3)) ;
  347. }
  348. }
  349. Foods() ;
  350. }
  351. /* 蛇的重置 */
  352. void Snake::Re(int flag,POINT pos)
  353. {
  354. Sum = -3 ;
  355. Grade = 0 ;
  356. Flag = flag ;
  357. Active = Life ;
  358. End.x = Head.x = pos.x ;
  359. End.y = Head.y = pos.y ;
  360. }
  361. /* 蛇皮走位 */
  362. void bearing::walk(int Flag)
  363. {
  364. switch(Flag){
  365. case LEFT:{
  366. x-=(iFor&&x==1)?-19:1 ;
  367. }return ;
  368. case RIGHT:{
  369. x+=(iFor&&x==20)?-19:1 ;
  370. }return ;
  371. case UP:{
  372. y-=(iFor&&y==1)?-19:1 ;
  373. }return ;
  374. case DOWN:{
  375. y+=(iFor&&y==20)?-19:1 ;
  376. }return ;
  377. }
  378. }
  379. /* 方向判断 */
  380. void Snake::Direction(int up,int left,int down,int right)
  381. {
  382. Flag = ((Key(left)) && Flag!=RIGHT )? LEFT :Flag ;
  383. Flag = ((Key(right))&& Flag!=LEFT )? RIGHT :Flag ;
  384. Flag = ((Key(up)) && Flag!=DOWN )? UP :Flag ;
  385. Flag = ((Key(down)) && Flag!=UP )? DOWN :Flag ;
  386. }
  387. /* 蛇的移动 */
  388. void Snake::Move()
  389. {
  390. printf("●",Pcolor(Color,3) ,Pposition(End.x*2,End.y) ) ;
  391. Map[Head.y][Head.x] = Flag ;
  392. Head.walk(Flag) ;
  393. printf("●",Pcolor( Color ,3),Pposition( Head.x * 2 ,Head.y)) ;
  394. Map[Head.y][Head.x] += HEAD ;
  395. if (Head.y==Food.y&& Head.x==Food.x){
  396. Grade++ ;
  397. Foods() ;
  398. }
  399. if (Sum==Grade){
  400. int Temp = Map[End.y][End.x] ;
  401. Map[End.y][End.x] = 0 ;
  402. printf("%s",Pempty(2),Pcolor( 3 ,3), Pposition( End.x * 2 ,End.y) ) ;
  403. End.walk(Temp) ;
  404. }
  405. else
  406. Sum++ ;
  407. }
  408. /* 死亡判断 */
  409. void Dead()
  410. {
  411. if(iRace&&(Frst.Active||Scnd.Active||Auto.Active)){
  412. Snake*they[3]={&Frst,&Scnd,&Auto} ;
  413. for(int i=0;i<3;i++)
  414. if(Map[they[i]->Head.y][they[i]->Head.x] != HEAD){
  415. they[i]->Active = false ;
  416. Map[they[i]->Head.y][they[i]->Head.x] -= HEAD ;
  417. }
  418. return ;
  419. }
  420. GradeOutput(Frst.Grade+Scnd.Grade) ;
  421. printf(" Game Over !",Pcolor( 15, 3) ,Pposition( 16 , 9)) ;
  422. Sleep(1500) ;
  423. char wDead[3][9] ={"重新开始","返回菜单","退出游戏"} ;
  424. int place = iBegin = false ;
  425. Print:
  426. system("cls") ;
  427. printf("\n\n\n\n%s游 戏 结 束\n",Pempty(16)) ;
  428. if (Scnd.Life&&Frst.Grade!=Scnd.Grade)
  429. printf("%s%s 赢 了",Pempty(16),(Frst.Grade>Scnd.Grade)?"左 边":"右 边");
  430. printf("\n%s分数 : %d\n\n\n\n" ,Pempty(17),Frst.Grade+Scnd.Grade) ;
  431. for( int i = 0 ; i < 3 ; i++)
  432. printf("%s%s\n\n\n",Pempty(18),wDead[i]) ;
  433. Pedge({16,place*3+9,12}) ;
  434. Scan:
  435. Sleep(125) ;
  436. if ((Key('W')||Key(VK_UP)) && place != 0)
  437. place-- ;
  438. elif((Key('S')||Key(VK_DOWN)) && place != 2)
  439. place++ ;
  440. elif(Key(' ')||Key(VK_RETURN)){
  441. iBegin = (place==0||place==1) ;
  442. if (place==0)
  443. Prepare() ;
  444. elif(place==1)
  445. iBegin = iMenu = true ;
  446. return ;
  447. }
  448. else
  449. goto Scan ;
  450. goto Print ;
  451. }
  452. /* 随机果实 */
  453. void Foods()
  454. {
  455. do{
  456. Food.x = rand() %(WALL - 2) +1 ,Food.y = rand() %(WALL - 2) +1 ;
  457. }while( Map[Food.y][Food.x]!=0 ) ;
  458. printf("★",Pcolor(4,3),Pposition( Food.x * 2 ,Food.y)) ;
  459. }
  460. /* 分数保存 */
  461. void GradeOutput(int grade)
  462. {
  463. for(int i=2 ;i>=0 ;i--)
  464. if(Score[i]<grade){
  465. Score[i+1] = Score[i] ;
  466. Score[i] = grade ;
  467. }
  468. fprintf(fopen("score.log","w+"),"%d\n%d\n%d",Score[0],Score[1],Score[2]) ;
  469. }
复制代码
1

评分人数

TOP

哇这么热闹,
老早以前用批处理写的咬文嚼字蛇:http://www.bathome.net/thread-43231-1-1.html
由于每个蛇身都不一样,不能直接处理头和尾中间不管,所以实现是全挪一遍233。
happy用纯批写过一个很精简的贪吃蛇,好像只有60行左右,不过链接找不到了。
1

评分人数

TOP

回复 4# wujunkai

这个是DOS程序吗?

TOP

回复 6# netdzb


    不是,是控制台程序

TOP

回复 7# wujunkai

在什么平台编译的?mingw可以吗?

TOP

回复 8# netdzb


    不知道,我用的是dev C++

TOP

返回列表