[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 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

回复 6# netdzb


    不是,是控制台程序

TOP

回复 8# netdzb


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

TOP

返回列表