黑马程序员技术交流社区

标题: 数字九宫格游戏,上代码,欢迎试玩和优化游戏代码。 [打印本页]

作者: 984326157    时间: 2015-7-7 01:31
标题: 数字九宫格游戏,上代码,欢迎试玩和优化游戏代码。
  1. //
  2. //  main.c
  3. //  数字九宫格
  4. //
  5. //  Created by apple apple on 15/7/6.
  6. //  Copyright (c) 2015年 shuangxing. All rights reserved.
  7. //
  8. /*游戏玩法介绍:
  9. 1)#只能上下左右移动一步,移动到那个位置的数字与#交换位置
  10.     1  #    3
  11.     8  2    5
  12.     4  7   6
  13. 2)直到#移动到最右下角时,并且盘面行程如下次序,才算游戏胜利
  14.     1        2        3
  15.     4        5        6
  16.     7        8        #
  17. 3)胜利后把#替换成9,盘面再次打印
  18.     1        2        3
  19.     4        5        6
  20.     7        8        9
  21.     胜利!

  22. 编程要求:
  23. 1)盘面要按一定的逻辑打乱次序(因为随机打乱存在一定的完不成能游戏的概率)
  24. 2)键盘控制#的移动,w/W:上移;s/S:下移;a/A:左移;d/D:右移。


  25. 游戏界面:

  26. 开始界面
  27. 1.开始游戏
  28. 2.退出游戏
  29. 提示用户选择1开始游戏,2退出游戏

  30. 玩游戏界面
  31. 打印盘面
  32. 提示移动规则

  33. 胜利界面
  34. 打印完整盘面
  35. 提示胜利并结束游戏!

  36. */
  37. #include <stdio.h>
  38. #include <time.h>
  39. #include <stdlib.h>
  40. //记录#的位置,初始位置为2,2
  41. int x = 2,y = 2;

  42. /**
  43. *  打印盘面
  44. *
  45. *  @param map 盘面数组
  46. */
  47. void printMap(char map[3][3])
  48. {
  49.     for (int i=0; i<3; i++) {
  50.         for (int j =0; j<3; j++) {
  51.             printf("%c\t",map[i][j]);
  52.         }
  53.         printf("\n");
  54.     }
  55. }
  56. /**
  57. *  移动函数
  58. *
  59. *  @param map       盘面数组
  60. *  @param direction 移动方向
  61. */
  62. void Move(char map[3][3],char direction)
  63. {
  64.     char temp;
  65.     switch (direction) {
  66.         case 'a':
  67.         case 'A':
  68.             //向左移动一格,y值减一
  69.             if (y>0) {
  70.                 temp = map[x][y];
  71.                 map[x][y] = map[x][y-1];
  72.                 map[x][y-1] = temp;
  73.                 y--;
  74.             }
  75.             
  76.             break;
  77.         case 'd':
  78.         case 'D':
  79.             //向右移动一格,y值加一
  80.             if (y<2) {
  81.                 temp = map[x][y];
  82.                 map[x][y] = map[x][y+1];
  83.                 map[x][y+1] = temp;
  84.                 y++;
  85.             }
  86.             break;

  87.         case 'w':
  88.         case 'W':
  89.             //向上移动一格,x值减一
  90.             if (x>0) {
  91.                 temp = map[x][y];
  92.                 map[x][y] = map[x-1][y];
  93.                 map[x-1][y] = temp;
  94.                 x--;
  95.             }
  96.             break;

  97.         case 's':
  98.         case 'S':
  99.             //向下移动一格,x值加一
  100.             if (x<2) {
  101.                 temp = map[x][y];
  102.                 map[x][y] = map[x+1][y];
  103.                 map[x+1][y] = temp;
  104.                 x++;
  105.             }
  106.             break;
  107.         default:
  108.             break;
  109.     }
  110. }
  111. /**
  112. *  按照一定的逻辑打乱盘面次序
  113. *
  114. *  @param map 盘面数组
  115. */
  116. void sortMap(char map[3][3])
  117. {
  118.     //1.令map[2][2]='#'
  119.     map[2][2]='#';
  120.     srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
  121.     //产生随机数
  122.     int suiji = rand()%4;
  123.     for (int i=0; i<100;i++ ) {
  124.        // printf("%d",suiji);
  125.         switch (suiji) {
  126.             case 0:
  127.                 Move(map, 'w');
  128.                 break;
  129.             case 1:
  130.                 Move(map, 's');
  131.                 break;
  132.             case 2:
  133.                 Move(map, 'a');
  134.                 break;
  135.             case 3:
  136.                 Move(map, 'd');
  137.                 break;
  138.                
  139.             default:
  140.                 break;
  141.         }
  142.         suiji = rand()%4;
  143.         
  144.     }
  145.    
  146.    
  147. }
  148. /**
  149. *  判断是否正确完成游戏
  150. *
  151. *  @param map 盘面数组
  152. *
  153. *  @return 成功返回1,不成功返回0
  154. */
  155. int isOK(char map[3][3])
  156. {
  157.     if (map[0][0] == '1' &&
  158.         map[0][1] == '2' &&
  159.         map[0][2] == '3' &&
  160.         map[1][0] == '4' &&
  161.         map[1][1] == '5' &&
  162.         map[1][2] == '6' &&
  163.         map[2][0] == '7' &&
  164.         map[2][1] == '8' &&
  165.         map[2][2] == '#' ) {
  166.         return 1;
  167.     }else return 0;
  168. }


  169. int main(int argc, const char * argv[]) {
  170.     //初始化盘面数组
  171.     char  map[3][3] = {'1','2','3','4','5','6','7','8','9'};
  172.     //打印盘面
  173.     printMap(map);
  174.    


  175.     //打印游戏开始界面
  176.     printf("***1.开始游戏***\n");
  177.     printf("***2.退出游戏***\n");
  178.     printf("请输入1开始游戏,或者2退出游戏。\n");
  179.     //建立界面选择逻辑
  180.     char flag;
  181.     flag = getc(stdin);
  182.     if (flag =='1') {//开始游戏
  183.         //打乱次序
  184.         sortMap(map);
  185.         //打印盘面
  186.         printMap(map);
  187.         //提示玩家控制游戏
  188.         printf("请开始游戏,输入w“#”向上移动,输入s“#”向下移动,输入a“#”向左移动,输入d“#”向右移动。\n");
  189.         //创建游戏循环
  190.         while (1) {
  191.             char ch = getc(stdin);
  192.             if (ch == 'w' || ch == 'W'
  193.                 || ch == 's' || ch == 'S'
  194.                 || ch == 'a' || ch == 'A'
  195.                 || ch == 'd' || ch == 'D' ) {
  196.                 Move(map, ch);
  197.                 printMap(map);
  198.                 if (isOK(map)) {
  199.                     map[2][2] = '9';
  200.                     printf("\n\n");
  201.                     printMap(map);
  202.                     printf("胜利了!游戏结束!");
  203.                     break;
  204.                 }
  205.             }
  206.         }
  207.     }else if(flag == '2')
  208.     {
  209.         printf("游戏已退出!\n");
  210.         return 0;
  211.     }else{
  212.         printf("输入错误!游戏退出!请重新运行!\n");
  213.     }
  214.     return 0;
  215. }
复制代码

作者: javaking    时间: 2015-7-7 07:20
写得不错!
作者: 周位杰    时间: 2015-7-7 07:26
好腻害啊~~
作者: pp584995727    时间: 2015-7-7 07:27
学习了,顶顶顶
作者: 慕名黑马生    时间: 2015-7-7 15:16
没找模版自己写的话感觉挺nb了
作者: pacio    时间: 2015-7-7 17:54
dev-c跑不起来,第一个循环嵌套有问题
作者: pacio    时间: 2015-7-7 18:00
pacio 发表于 2015-7-7 17:54
dev-c跑不起来,第一个循环嵌套有问题

程序没问题,我的编译器没设置好,现在OK
作者: 984326157    时间: 2015-7-8 10:06
慕名黑马生 发表于 2015-7-7 15:16
没找模版自己写的话感觉挺nb了

原创哦,看完基础视频中的迷宫游戏后自己就想了一个题目,自己练习的
作者: WPeng    时间: 2015-7-8 13:21
厉害,膜拜中。。
作者: huguozhang    时间: 2015-7-10 00:34
拷贝下来 学习  感谢分享~~~
作者: a867750627    时间: 2015-7-10 09:32
有点厉害啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2