MiHuYou论坛

搜索
查看: 182|回复: 0

分享几个C++小游戏

[复制链接]

10

主题

13

帖子

69

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
69
QQ
发表于 2023-12-30 18:54:10 | 显示全部楼层 |阅读模式
一个在网上找到的HTML小游戏,有需要的可以拿走
源代码如下
网上找到的几个C++小游戏,有需要的可以拿走
  1. 1.走迷宫

  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <time.h>
  6. #define Height 25 //迷宫的高度,必须为奇数
  7. #define Width 25 //迷宫的宽度,必须为奇数
  8. #define Wall 1
  9. #define Road 0
  10. #define Start 2
  11. #define End 3
  12. #define Esc 5
  13. #define Up 1
  14. #define Down 2
  15. #define Left 3
  16. #define Right 4
  17. int map[Height+2][Width+2];
  18. void gotoxy(int x,int y) //移动坐标
  19. {
  20.         COORD coord;
  21.         coord.X=x;
  22.         coord.Y=y;
  23.         SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
  24. }
  25. void hidden()//隐藏光标
  26. {
  27.         HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  28.         CONSOLE_CURSOR_INFO cci;
  29.         GetConsoleCursorInfo(hOut,&cci);
  30.         cci.bVisible=0;
  31.         //赋1为显示,赋0为隐藏
  32.         SetConsoleCursorInfo(hOut,&cci);
  33. }
  34. void create(int x,int y) //随机生成迷
  35. {
  36.         int c[4][2]= {
  37.                 0,1,1,0,0,-1,-1,0
  38.         }
  39.         ;
  40.         //四个方向
  41.         int i,j,t;
  42.         //将方向打乱
  43.         for (i=0;i<4;i++) {
  44.                 j=rand()%4;
  45.                 t=c[i][0];
  46.                 c[i][0]=c[j][0];
  47.                 c[j][0]=t;
  48.                 t=c[i][1];
  49.                 c[i][1]=c[j][1];
  50.                 c[j][1]=t;
  51.         }
  52.         map[x][y]=Road;
  53.         for (i=0;i<4;i++)
  54.         if(map[x+2*c[i][0]][y+2*c[i][1]]==Wall) {
  55.                 map[x+c[i][0]][y+c[i][1]]=Road;
  56.                 create(x+2*c[i][0],y+2*c[i][1]);
  57.         }
  58. }
  59. int get_key() //接收按键
  60. {
  61.         char c;
  62.         while(c=getch()) {
  63.                 if(c==27) return Esc;
  64.                 //Esc
  65.                 if(c!=-32)continue;
  66.                 c=getch();
  67.                 if(c==72) return Up;
  68.                 //上
  69.                 if(c==80) return Down;
  70.                 //下
  71.                 if(c==75) return Left;
  72.                 //左
  73.                 if(c==77) return Right;
  74.                 //右
  75.         }
  76.         return 0;
  77. }
  78. void paint(int x,int y) //画迷宫
  79. {
  80.         gotoxy(2*y-2,x-1);
  81.         switch(map[x][y]) {
  82.                 case Start:
  83.                 printf("入");
  84.                 break;
  85.                 //画入口
  86.                 case End:
  87.                 printf("出");
  88.                 break;
  89.                 //画出口
  90.                 case Wall:
  91.                 printf("▇");
  92.                 break;
  93.                 //画墙
  94.                 case Road:
  95.                 printf(" ");
  96.                 break;
  97.                 //画路
  98.         }
  99. }
  100. void game() {
  101.         int x=2,y=1;
  102.         //玩家当前位置,刚开始在入口处
  103.         int c;
  104.         //用来接收按键
  105.         while(1) {
  106.                 gotoxy(2*y-2,x-1);
  107.                 printf("A");
  108.                 //画出玩家当前位置
  109.                 if(map[x][y]==End) //判断是否到达出口
  110.                 {
  111.                         gotoxy(30,24);
  112.                         printf("\n");
  113.                         //
  114.                         printf("到达终点,按任意键结束");
  115.                         getch();
  116.                         break;
  117.                 }
  118.                 c=get_key();
  119.                 if(c==Esc) {
  120.                         gotoxy(0,24);
  121.                         break;
  122.                 }
  123.                 switch(c) {
  124.                         case Up: //向上走
  125.                         if(map[x-1][y]!=Wall) {
  126.                                 paint(x,y);
  127.                                 x--;
  128.                         }
  129.                         break;
  130.                         case Down: //向下走
  131.                         if(map[x+1][y]!=Wall) {
  132.                                 paint(x,y);
  133.                                 x++;
  134.                         }
  135.                         break;
  136.                         case Left: //向左走
  137.                         if(map[x][y-1]!=Wall) {
  138.                                 paint(x,y);
  139.                                 y--;
  140.                         }
  141.                         break;
  142.                         case Right: //向右走
  143.                         if(map[x][y+1]!=Wall) {
  144.                                 paint(x,y);
  145.                                 y++;
  146.                         }
  147.                         break;
  148.                 }
  149.         }
  150. }
  151. int main() {
  152.         int i,j;
  153.         srand((unsigned)time(NULL));
  154.         //初始化随即种子
  155.         hidden();
  156.         //隐藏光标
  157.         for (i=0;i<=Height+1;i++)
  158.         for (j=0;j<=Width+1;j++)
  159.         if(i==0||i==Height+1||j==0||j==Width+1) //初始化迷宫
  160.         map[i][j]=Road; else map[i][j]=Wall;
  161.         create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1));
  162.         //从随机一个点开始生成迷宫,该点行列都为偶数
  163.         for (i=0;i<=Height+1;i++) //边界处理
  164.         {
  165.                 map[i][0]=Wall;
  166.                 map[i][Width+1]=Wall;
  167.         }
  168.         for (j=0;j<=Width+1;j++) //边界处理
  169.         {
  170.                 map[0][j]=Wall;
  171.                 map[Height+1][j]=Wall;
  172.         }
  173.         map[2][1]=Start;
  174.         //给定入口
  175.         map[Height-1][Width]=End;
  176.         //给定出口
  177.         for (i=1;i<=Height;i++)
  178.         for (j=1;j<=Width;j++) //画出迷宫
  179.         paint(i,j);
  180.         game();
  181.         //开始游戏
  182.         getch();
  183.         return 0;
  184. }

  185. 2.推箱子

  186. #include <stdio.h>
  187. #include <stdlib.h>
  188. #include <conio.h>

  189. int  map[2][7][8] =
  190. {
  191.         //0:空的 1:■ :墙
  192.         //3:☆ 4:★  //目的地和箱子
  193.         //5:※                  //人
  194.         //7:⊙                  //目的(3)和箱子(4)在一起
  195.         //8:※                  //人(5)和目的(3)在一起
  196.         //为让多种情况使用一种算法

  197.         {
  198.         1, 1, 1, 1, 1, 1, 1, 1,
  199.         1, 0, 0, 0, 0, 0, 0, 1,
  200.         1, 3, 1, 0, 1, 1, 3, 1,
  201.         1, 4, 0, 0, 4, 0, 3, 1,
  202.         1, 0, 1, 0, 1, 1, 4, 1,
  203.         1, 0, 0, 5, 0, 0, 0, 1,
  204.         1, 1, 1, 1, 1, 1, 1, 1
  205.         },
  206.         {
  207.                 1, 1, 1, 1, 1, 1, 1, 1,
  208.                 1, 0, 0, 0, 0, 0, 0, 1,
  209.                 1, 3, 1, 0, 1, 1, 3, 1,
  210.                 1, 3, 4, 5, 4, 0, 3, 1,
  211.                 1, 4, 1, 0, 1, 1, 4, 1,
  212.                 1, 0, 0, 0, 0, 0, 0, 1,
  213.                 1, 1, 1, 1, 1, 1, 1, 1
  214.         }
  215. };
  216. int cas = 0;        //为0表示第一关
  217. //记录每一关的箱子数 或者是项目和目的在一起的总数
  218. int boxSum[2] = {3,4};
  219. //地图绘图
  220. void drawMap()
  221. {
  222.         for (int i = 0; i < 7; i++)
  223.         {
  224.                 for (int j = 0; j < 8; j++)
  225.                 {
  226.                         if (j == 0)
  227.                                 printf("\t\t");
  228.                         switch (map[cas][i][j])
  229.                         {
  230.                                 //        //0:空的 1:■ :墙
  231.                         case 0:
  232.                                 printf("  ");
  233.                                 break;
  234.                         case 1:
  235.                                 printf("■");
  236.                                 break;
  237.                                 //3:☆ 4:★  //目的地和箱子
  238.                         case 3:
  239.                                 printf("☆");
  240.                                 break;
  241.                         case 4:
  242.                                 printf("★");
  243.                                 break;
  244.                                 //5:※                  //人
  245.                         case 5:
  246.                         case 8:
  247.                                 printf("※");
  248.                                 break;
  249.                         case 7:
  250.                                 printf("⊙");
  251.                                 break;
  252.                                 //7:⊙                  //目的(3)和箱子(4)在一起
  253.                                 //8:※                  //人(5)和目的(3)在一起
  254.                         }
  255.                 }
  256.                 printf("\n");
  257.         }
  258. }
  259. //按键处理
  260. void keyDown()
  261. {
  262.         //分析按键过程
  263.         //定位人在哪里
  264.         //人有两种情况:第一个是:人,第二个:人站在目的上
  265.         int i, j;
  266.         for (i = 0; i < 7; i++)
  267.         {
  268.                 for (j = 0; j < 8; j++)
  269.                 {
  270.                         if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
  271.                         {
  272.                                 break;
  273.                         }
  274.                 }
  275.                 if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
  276.                 {
  277.                         break;
  278.                 }
  279.         }

  280.         char ch = _getch();        //看不见的字符输入,+头文件 conio.h
  281.         switch (ch)
  282.         {
  283.                 //72 80   75 77
  284.         case 'w':
  285.         case 'W':
  286.         case 72:
  287.                 //下一个地方等于空地或者是目的 能走
  288.                 if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
  289.                 {
  290.                         //3+5=8 :表示目的和人在一起
  291.                         //新地方(map[i-1][j])人(5)来了
  292.                         map[cas][i - 1][j] += 5;
  293.                         //老地方(map[i][j])人(5)走了
  294.                         map[cas][i][j] -= 5;
  295.                 }
  296.                 //如果下一个是箱子,要进一步判断能走
  297.                 //注意点:箱子两种状态:箱子,箱子和目的在一起
  298.                 else if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
  299.                 {
  300.                         //做箱子的下一个地方判断能不能走
  301.                         if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
  302.                         {
  303.                                 //新的地方箱子来了
  304.                                 map[cas][i - 2][j] += 4;
  305.                                 //箱子的位置:箱子(-4)走了 人来(+5)
  306.                                 map[cas][i - 1][j] += 1;
  307.                                 //原来的地方人走了
  308.                                 map[cas][i][j] -= 5;
  309.                         }

  310.                 }

  311.                 break;
  312.         case 's':
  313.         case 'S':
  314.         case 80:
  315.                 //下一个地方等于空地或者是目的 能走
  316.                 if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
  317.                 {
  318.                         //3+5=8 :表示目的和人在一起
  319.                         //新地方(map[i-1][j])人(5)来了
  320.                         map[cas][i + 1][j] += 5;
  321.                         //老地方(map[i][j])人(5)走了
  322.                         map[cas][i][j] -= 5;
  323.                 }
  324.                 else if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
  325.                 {
  326.                         //做箱子的下一个地方判断能不能走
  327.                         if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
  328.                         {
  329.                                 //新的地方箱子来了
  330.                                 map[cas][i + 2][j] += 4;
  331.                                 //箱子的位置:箱子(-4)走了 人来(+5)
  332.                                 map[cas][i + 1][j] += 1;
  333.                                 //原来的地方人走了
  334.                                 map[cas][i][j] -= 5;
  335.                         }

  336.                 }
  337.                 break;

  338.         case 'a':
  339.         case 'A':
  340.         case 75:
  341.                 //下一个地方等于空地或者是目的 能走
  342.                 if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
  343.                 {
  344.                         //3+5=8 :表示目的和人在一起
  345.                         //新地方(map[i-1][j])人(5)来了
  346.                         map[cas][i][j - 1] = map[cas][i][j - 1] + 5;
  347.                         //老地方(map[i][j])人(5)走了
  348.                         map[cas][i][j] = map[cas][i][j] - 5;
  349.                         //j+=5  j=j+5

  350.                 }
  351.                 else if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
  352.                 {
  353.                         //做箱子的下一个地方判断能不能走
  354.                         if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
  355.                         {
  356.                                 //新的地方箱子来了
  357.                                 map[cas][i][j - 2] += 4;
  358.                                 //箱子的位置:箱子(-4)走了 人来(+5)
  359.                                 map[cas][i][j - 1] += 1;
  360.                                 //原来的地方人走了
  361.                                 map[cas][i][j] -= 5;
  362.                         }

  363.                 }

  364.                 break;
  365.         case 'D':
  366.         case 'd':
  367.         case 77:
  368.                 //下一个地方等于空地或者是目的 能走
  369.                 if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
  370.                 {
  371.                         //3+5=8 :表示目的和人在一起
  372.                         //新地方(map[i-1][j])人(5)来了
  373.                         map[cas][i][j + 1] += 5;
  374.                         //老地方(map[i][j])人(5)走了
  375.                         map[cas][i][j] -= 5;
  376.                 }
  377.                
  378.                 //下一个地方是箱子,判断箱子的下一个地方是不是目的和空地
  379.                 else if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
  380.                 {
  381.                         //做箱子的下一个地方判断能不能走
  382.                         if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
  383.                         {
  384.                                 //新的地方箱子来了
  385.                                 map[cas][i][j + 2] += 4;
  386.                                 //箱子的位置:箱子(-4)走了 人来(+5)
  387.                                 map[cas][i][j + 1] += 1;
  388.                                 //原来的地方人走了
  389.                                 map[cas][i][j] -= 5;
  390.                         }

  391.                 }
  392.                 break;
  393.         }
  394. }
  395. //胜负判断
  396. //用什么判断胜负: 箱子到达目的的个数
  397. int gameOver()
  398. {
  399.         int count = 0;
  400.         //所有的地方找一遍
  401.         for (int i = 0; i < 7; i++)
  402.         {
  403.                 for (int j = 0; j < 8; j++)
  404.                 {
  405.                         if (map[cas][i][j] == 7)
  406.                                 count++;
  407.                 }
  408.         }
  409.         return count;
  410. }
  411. //箱子数是零的时候也是胜利
  412. int gameOver2()
  413. {
  414.         int count = 3;
  415.         //所有的地方找一遍
  416.         for (int i = 0; i < 7; i++)
  417.         {
  418.                 for (int j = 0; j < 8; j++)
  419.                 {
  420.                         if (map[cas][i][j] == 3)
  421.                                 count--;
  422.                 }
  423.         }
  424.         return count;
  425. }

  426. int main()
  427. {
  428.         while (1)
  429.         {
  430.                 printf("\n\t用方向键或w a s d键移动※推动★进入☆\n",cas+1);
  431.                 printf("\n\t\t 共两关 第 %d 关\n",cas+1);
  432.                 drawMap();
  433.                 if (gameOver() == boxSum[cas])
  434.                 {
  435.                         cas++;
  436.                         if (cas == 2)
  437.                                 break;
  438.                         else
  439.                             printf("\n\t\t 该关 OK!按任一键进继续\n");       
  440.                 }
  441.                 keyDown();
  442.                 system("cls");
  443.         }
  444.         printf("游戏结束!");
  445.         printf("\n");
  446.         system("pause");
  447.         return 0;
  448. }

  449. 3.汉诺塔

  450. #include <bits/stdc++.h>
  451. #include <conio.h>
  452. #include <windows.h>
  453. using namespace std;
  454. const int COLUMN[4] = { 0, 2, 5, 8 };
  455. const int DISC_CNT_MAX = 10;
  456. const int ROW_OP_CNT = 2, COL_OP_CNT = 16;
  457. const int ROW_MESSAGE = 3, COL_MESSAGE = 16;
  458. const int ROW_HELP = 15, COL_HELP = 1;
  459. const int ROW_MAX = 30, COL_MAX = 120;
  460. const int BLUE = 1;
  461. const int GREEN = 2;
  462. const int CYAN = 3;
  463. const int AQUA = 3;
  464. const int RED = 4;
  465. const int PURPLE = 5;
  466. const int YELLOW = 6;
  467. const int WHITE = 7;
  468. int n;
  469. stack<int> rod[4];
  470. int sz[4] = { 0 };
  471. int pos1, pos2;
  472. int key;
  473. bool prev_key_is_esc;
  474. int op_cnt;
  475. bool is_moving;
  476. int moved_disc;
  477. template <typename T>
  478. inline T read() {
  479. T x = 0;
  480. T multiplier = 1;
  481. char ch = getchar();
  482. while (ch < '0' || ch > '9') {
  483.     if (ch == '-') {
  484.         multiplier = -1;
  485.     }
  486.     ch = getchar();
  487. }
  488. while (ch >= '0' && ch <= '9') {
  489.     x = (x << 3) + (x << 1) + (ch & 15);
  490.     ch = getchar();
  491. }
  492. return x * multiplier;
  493. }
  494. void set_caret_pos(int row = 1, int col = 1) {
  495. COORD pos;
  496. pos.X = col - 1;
  497. pos.Y = row - 1;
  498. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
  499. }
  500. int get_caret_row() {
  501. CONSOLE_SCREEN_BUFFER_INFO info;
  502. GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
  503. return info.dwCursorPosition.Y + 1;
  504. }
  505. int get_caret_col() {
  506. CONSOLE_SCREEN_BUFFER_INFO info;
  507. GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
  508. return info.dwCursorPosition.X + 1;
  509. }
  510. pair<int, int> get_caret_pos() {
  511. CONSOLE_SCREEN_BUFFER_INFO info;
  512. GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
  513. return make_pair(info.dwCursorPosition.Y + 1, info.dwCursorPosition.X + 1);
  514. }
  515. void set_foreground_color(int x, bool intensity = false) {
  516. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
  517.                         x | (intensity << 3));
  518. }
  519. void set_cursor_visibility(bool visibility = true) {
  520. CONSOLE_CURSOR_INFO cc_info;
  521. cc_info.bVisible = visibility;
  522. cc_info.dwSize = 1;
  523. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cc_info);
  524. }
  525. void disp_init_state(int n) {
  526. for (int i = 1; i <= n; i++) {
  527.     set_caret_pos(i, COLUMN[1]);
  528.     printf("%d", i);
  529. }
  530. for (int i = 1; i <= 3; i++) {
  531.     set_caret_pos(n + 1, COLUMN[i] - 1);
  532.     printf("---");
  533.     set_caret_pos(n + 2, COLUMN[i]);
  534.     putchar('A' + i - 1);
  535. }
  536. set_caret_pos(ROW_OP_CNT, COL_OP_CNT);
  537. printf("0");
  538. }
  539. void disp_help() {
  540. set_caret_pos(ROW_HELP, COL_HELP);
  541. printf("如何玩:\n"
  542.        "数字表示光盘的尺寸.\n"
  543.        "将A杆上圆盘移动到C杆上,每次一个.\n"
  544.        "每个杆上的圆盘必须按大小升序堆叠.\n"
  545.        "使用左右箭头键选择杆.\n"
  546.        "按Enter键拾取选定杆上的顶部圆盘.\n"
  547.        "然后使用左右键移动.\n"
  548.        "按ESC取消当前移动.\n"
  549.        "再次按Enter键可将圆盘放置.\n"
  550.        "按R重新启动.\n"
  551.        "按ESC键两次退出.\n");
  552. }
  553. void disp_pos(int pos1, int pos2 = 0) {
  554. for (int i = 1; i <= 3; i++) {
  555.     set_caret_pos(n + 3, COLUMN[i]);
  556.     printf(" ");
  557. }
  558. set_caret_pos(n + 3, COLUMN[pos1]);
  559. printf("^");
  560. if (pos2) {
  561.     set_caret_pos(n + 3, COLUMN[pos2]);
  562.     set_foreground_color(GREEN, true);
  563.     printf("^");
  564.     set_foreground_color(WHITE);
  565. }
  566. }
  567. void clear() {
  568. for (int i = 1; i <= DISC_CNT_MAX + 3; i++) {
  569.     for (int j = 1; j <= COL_MAX; j++) {
  570.         set_caret_pos(i, j);
  571.         putchar(' ');
  572.     }
  573. }
  574. }
  575. void moving_disc(int pos1, int pos2) {
  576. int x = rod[pos1].top();
  577. set_caret_pos(n + 1 - sz[pos1], COLUMN[pos1]);
  578. set_foreground_color(RED, true);
  579. printf("%d", x);
  580. set_foreground_color(WHITE);
  581. set_caret_pos(n - sz[pos2] + (pos1 == pos2), COLUMN[pos2]);
  582. set_foreground_color(GREEN, true);
  583. printf("%d", x);
  584. set_foreground_color(WHITE);
  585. }
  586. void update_discs(int pos1, int pos2) {
  587. int x = rod[pos1].top();
  588. set_caret_pos(n + 1 - sz[pos1], COLUMN[pos1]);
  589. printf("  ");
  590. rod[pos1].pop();
  591. sz[pos1]--;
  592. rod[pos2].push(x);
  593. sz[pos2]++;
  594. set_caret_pos(n + 1 - sz[pos2], COLUMN[pos2]);
  595. printf("%d", x);
  596. }
  597. void remove_temp_disc(int pos) {
  598. set_caret_pos(n - sz[pos], COLUMN[pos]);
  599. printf("  ");
  600. }
  601. void update_op_cnt() {
  602. op_cnt++;
  603. set_caret_pos(ROW_OP_CNT, COL_OP_CNT);
  604. printf("%d", op_cnt);
  605. }
  606. int main() {
  607. printf("输入光盘数量(不超过 %d): ", DISC_CNT_MAX);
  608. n = min(read<int>(), DISC_CNT_MAX);
  609. set_cursor_visibility(false);
  610. disp_help();
  611. for (; n <= DISC_CNT_MAX; n++) {
  612.     clear();
  613.      for (int i = 1; i <= 3; i++) {
  614.         while (!rod[i].empty()) {
  615.             rod[i].pop();
  616.         }
  617.         sz[i] = 0;
  618.     }
  619.      for (int i = n; i >= 1; i--) {
  620.         rod[1].push(i);
  621.     }
  622.     sz[1] = n;
  623.      is_moving = false;
  624.     pos1 = 1;
  625.     op_cnt = 0;
  626.     prev_key_is_esc = false;
  627.      disp_init_state(n);
  628.     disp_pos(1);
  629.     while (true) {
  630.         if (sz[3] == n) {
  631.             set_caret_pos(ROW_MESSAGE, COL_MESSAGE);
  632.             if (op_cnt != (1 << n) - 1) {
  633.                 printf("你用%d个动作完成了谜题.",op_cnt);
  634.             } else {
  635.                 printf("祝贺你用最少的动作完成了谜题 " );
  636.             }
  637.             Sleep(2000);
  638.             break;
  639.         }
  640.          key = getch();
  641.         if (key == 224) {
  642.             key = getch();
  643.             if (!is_moving) {
  644.                 if (key == 75) { // Left arrow key
  645.                     pos1 = (pos1 + 1) % 3 + 1;
  646.                 } else if (key == 77) { // Right arrow key
  647.                     pos1 = pos1 % 3 + 1;
  648.                 }
  649.                 disp_pos(pos1);
  650.             } else {
  651.                 remove_temp_disc(pos2);
  652.                 if (key == 75) { // Left arrow key
  653.                     pos2 = (pos2 + 1) % 3 + 1;
  654.                 } else if (key == 77) { // Right arrow key
  655.                     pos2 = pos2 % 3 + 1;
  656.                 }
  657.                 moving_disc(pos1, pos2);
  658.                 disp_pos(pos1, pos2);
  659.             }
  660.         } else if (key == 13) { // Enter key
  661.             if (!is_moving) {
  662.                 if (rod[pos1].empty()) {
  663.                     continue;
  664.                 }
  665.                 is_moving = true;
  666.                 moved_disc = rod[pos1].top();
  667.                 pos2 = pos1;
  668.                 moving_disc(pos1, pos2);
  669.                 disp_pos(pos1, pos2);
  670.             } else {
  671.                 if (!rod[pos2].empty() && rod[pos2].top() < moved_disc) {
  672.                     set_caret_pos(ROW_MESSAGE, COL_MESSAGE);
  673.                     printf("提示:光盘未按升序堆叠在棒上。");
  674.                     continue;
  675.                 }
  676.                 is_moving = false;
  677.                 update_discs(pos1, pos2);
  678.                 update_op_cnt();
  679.                 pos1 = pos2;
  680.                 disp_pos(pos1);
  681.             }
  682.         } else if (key == 27) { // Escape key
  683.             if (prev_key_is_esc) { // Double ESC
  684.                 break;
  685.             }
  686.             if (is_moving) {
  687.                 is_moving = false;
  688.                 remove_temp_disc(pos2);
  689.                 update_discs(pos1, pos1);
  690.                 disp_pos(pos1);
  691.             } else {
  692.                 prev_key_is_esc = true;
  693.             }
  694.         } else if (key == 'R' || key == 'r') {
  695.             n--;
  696.             break;
  697.         }
  698.     }
  699.      if (prev_key_is_esc && key == 27) { // Double ESC
  700.         break;
  701.     }
  702. }
  703. set_caret_pos(ROW_MAX - 1, 1);
  704. return 0;
  705. }

  706. 4.贪吃蛇

  707. #include <iostream>
  708. #include <cstdio>
  709. #include <cstdlib>
  710. #include <ctime>
  711. #include <conio.h>
  712. #include <cmath>
  713. #include <windows.h>
  714. using namespace std;

  715. /*** 光标定位 ***/
  716. HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
  717. COORD coord;

  718. void locate(int x,int y)
  719. {
  720.     coord.X=y;
  721.     coord.Y=x;
  722.     SetConsoleCursorPosition(hout,coord);
  723. };

  724. /*** 隐藏光标 ***/
  725. void hide()
  726. {
  727.     CONSOLE_CURSOR_INFO cursor_info={1,0};
  728.     SetConsoleCursorInfo(hout, &cursor_info);
  729. }

  730. /*** 生成随机数 ***/
  731. double random(double start, double end)
  732. {
  733.     return start+(end-start)*rand()/(RAND_MAX + 1.0);
  734. }

  735. /*** 定义地图的长宽,蛇的坐标,长度,方向,食物的位置 ***/
  736. int m,n;

  737. struct node
  738. {
  739.     int x,y;
  740. }snake[1000];

  741. int snake_length,dir;
  742. node food;
  743. int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

  744. /*** 输出墙 ***/
  745. void print_wall()
  746. {
  747.     cout << " ";
  748.     for (int i=1;i<=n;i++)
  749.         cout << "-";
  750.     cout << endl;
  751.     for (int j=0;j<=m-1;j++)
  752.     {
  753.         cout << "|";
  754.         for (int i=1;i<=n;i++) cout << " ";
  755.         cout << "|" << endl;
  756.     }
  757.     cout << " ";
  758.     for (int i=1;i<=n;i++)
  759.         cout << "-";
  760. }

  761. /*** 首次输出蛇,其中snake[0]代表头 ***/
  762. void print_snake()
  763. {
  764.     locate(snake[0].x,snake[0].y);
  765.     cout << "@";
  766.     for (int i=1;i<=snake_length-1;i++)
  767.     {
  768.         locate(snake[i].x,snake[i].y);
  769.         cout << "*";
  770.     }
  771. }

  772. /*** 判断是否撞墙或者自撞 ***/
  773. bool is_correct()
  774. {
  775.     if (snake[0].x==0 || snake[0].y==0 || snake[0].x==m+1 || snake[0].y==n+1) return false;
  776.     for (int i=1;i<=snake_length-1;i++)
  777.     {
  778.         if (snake[0].x==snake[i].x && snake[0].y==snake[i].y) return false;
  779.     }
  780.     return true;
  781. }

  782. /*** 随机生成并输出食物位置 ***/
  783. bool print_food()
  784. {
  785.     srand((unsigned)time(0));
  786.     bool e;
  787.     while (1)
  788.     {
  789.         e=true;
  790.         int i=(int) random(0,m)+1,j=(int) random(0,n)+1;
  791.         food.x=i;food.y=j;
  792.         for (int k=0;k<=snake_length-1;k++)
  793.         {
  794.             if (snake[k].x==food.x && snake[k].y==food.y)
  795.             {
  796.                 e=false;break;
  797.             }
  798.         }
  799.         if (e) break;
  800.     }
  801.     locate(food.x,food.y);
  802.     cout << "$";
  803.     return true;
  804. }

  805. /*** 蛇的前进 ***/
  806. bool go_ahead()
  807. {
  808.     node temp;
  809.     bool e=false;
  810.     temp=snake[snake_length-1];
  811.     for (int i=snake_length-1;i>=1;i--)
  812.         snake[i]=snake[i-1];
  813.     snake[0].x+=direct[dir][0];
  814.     snake[0].y+=direct[dir][1];
  815.     locate(snake[1].x,snake[1].y);
  816.     cout << "*";
  817.     /*** 吃到了食物 ***/
  818.     if (snake[0].x==food.x && snake[0].y==food.y)
  819.     {
  820.         snake_length++;
  821.         e=true;
  822.         snake[snake_length-1]=temp;
  823.     }
  824.     /*** 输出此时蛇状态 ***/
  825.     if (!e)
  826.     {
  827.         locate(temp.x,temp.y);
  828.         cout << " ";
  829.     }
  830.     else
  831.         print_food();
  832.     locate(snake[0].x,snake[0].y);
  833.     cout << "@";
  834.     /*** 如果自撞 ***/
  835.     if (!is_correct())
  836.     {
  837.         system("cls");
  838.         cout << "You lose!" << endl << "Length: " << snake_length << endl;
  839.         return false;
  840.     }
  841.     return true;
  842. }

  843. /*** 主函数 ***/
  844. int main()
  845. {
  846.         system("mode con cols=80 lines=30"); //设置cmd窗口大小
  847.         system("color 2"); //设置字符颜色:0 黑;1 深蓝;2 深绿;3 深青;4 深红;5 深紫;6 深褐
  848.     cout << "--------------------贪吃蛇---------------------" << endl;
  849.     cout << "先选择难度.请在1-10中输入1个数,1最简单,10则最难" << endl;
  850.     cout << "然后进入游戏画面,以方向键控制方向.祝你游戏愉快!" << endl;
  851.     cout << "-----------------------------------------------" << endl;
  852.     cout << "请输入难度级别:" ;
  853.     m=25;
  854.     n=40;
  855.     if (m<10 || n<10 || m>25 || n>40)
  856.     {
  857.         cout << "ERROR" << endl;
  858.         system("pause");
  859.         return 0;
  860.     }
  861.     int hard;
  862.     cin >> hard;
  863.     if (hard<=0 || hard>100)
  864.     {
  865.         cout << "ERROR" << endl;
  866.         system("pause");
  867.         return 0;
  868.     }
  869.     /*** 数据全部初始化,包括蛇长,位置,方向 ***/
  870.     snake_length=5;
  871.     clock_t a,b;
  872.     char ch;
  873.     double hard_len;
  874.     for (int i=0;i<=4;i++)
  875.     {
  876.         snake[i].x=1;
  877.         snake[i].y=5-i;
  878.     }
  879.     dir=3;
  880.     /*** 输出初始地图,蛇与食物 ***/
  881.     system("cls");
  882.     hide();
  883.     print_wall();
  884.     print_food();
  885.     print_snake();
  886.     locate(m+2,0);
  887.     cout << "Now length: ";
  888.     /*** 开始游戏 ***/
  889.     while (1)
  890.     {
  891.         /*** 难度随长度增加而提高 ***/
  892.         hard_len=(double)snake_length/(double) (m*n);
  893.         /*** 调节时间,单位是ms ***/
  894.         a=clock();
  895.         while (1)
  896.         {
  897.             b=clock();
  898.             if (b-a>=(int)(400-30*hard)*(1-sqrt(hard_len))) break;
  899.         }
  900.         /*** 接受键盘输入的上下左右,并以此改变方向 ***/
  901.         if (kbhit())
  902.         {
  903.             ch=getch();
  904.             if (ch==-32)
  905.             {
  906.                 ch=getch();
  907.                 switch(ch)
  908.                 {
  909.                 case 72:
  910.                     if (dir==2 || dir==3)
  911.                         dir=0;
  912.                     break;
  913.                 case 80:
  914.                     if (dir==2 || dir==3)
  915.                         dir=1;
  916.                     break;
  917.                 case 75:
  918.                     if (dir==0 || dir==1)
  919.                         dir=2;
  920.                     break;
  921.                 case 77:
  922.                     if (dir==0 || dir==1)
  923.                         dir=3;
  924.                     break;
  925.                 }
  926.             }
  927.         }
  928.         /*** 前进 ***/
  929.         if (!go_ahead()) break;
  930.         /*** 在最后输出此时长度 ***/
  931.         locate(m+2,12);
  932.         cout << snake_length;
  933.     }
  934.     system("pause");
  935.     return 0;
  936. }
复制代码



回复

使用道具 举报

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

本版积分规则

Copyright © 2001-2013 Discuz Team.Powered by Discuz!X3.4
快速回复 返回顶部 返回列表