A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 984326157 中级黑马   /  2015-7-14 01:07  /  1804 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 984326157 于 2015-7-14 01:06 编辑

根据《算法谜题》一书中的捉鸡一题,改编成游戏并使用C语言编程实现,如下:
农场主捉鸡游戏玩法介绍: # # # # # # # #
# # # # # C # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
F # # # # # # #
1)场地是8X8的,农场主初始位置在最左下角(F),鸡的位置在场地上的位置随机分配(C)
2)游戏开始后,玩家选择农场主先走还是鸡先走,玩家代表农场主去捉鸡,鸡自动移动;农场主和鸡交替走,农场主和鸡都可以移动到上下左右方向上邻近的一步,不能走对角,当农场主移动到鸡所在的位置,或者鸡自投罗网跑到农场主的位置时,农场主赢,游戏结束
3)如果选择正确的话(即选择农场主先走还是鸡先走),农场主最多14步可捉到鸡,如果14步还捉不到,宣布游戏失败!
4)W、S、A、D控制农场主(F)的上、下、左、右移动
辛苦了半天,终于把游戏完成,自己试玩了一下,还可以。本游戏如果选择错误(即鸡先走或人先走),游戏很可能会失败的哦,请大家讨论如何选择鸡先走还是人先走能百分之百捉住鸡?
代码:
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>

  4. //定义变量
  5. int count = 14;//倒计时,14步,14步贷不到鸡游戏失败
  6. int famerX,famerY,//记录农场主的位置
  7.     cockX,cockY;//记录公鸡的位置
  8. char fORc;//记录谁先走,'F'农场主先走,‘C’公鸡先走
  9. /**
  10. *  打印地图功能
  11. *
  12. *  @param map 地图数组
  13. */
  14. void printMap(char map[8][8]){
  15.     for (int i=0; i<8; i++) {
  16.         for (int j = 0; j<8; j++) {
  17.             printf(" %c",map[i][j]);
  18.         }
  19.         printf("\n");
  20.     }
  21.     printf("\n");

  22. }

  23. /**
  24. 初始化地图

  25. */
  26. void initMap(char map[8][8]){
  27.     //1)使用#填充地图
  28.     for (int i=0; i<8; i++) {
  29.         for (int j = 0; j<8; j++) {
  30.             map[i][j] = '#';
  31.         }
  32.     }
  33.    
  34.     //2)初始化农场主位置左下角(7,0)
  35.     famerX = 7,famerY = 0;
  36.     //放入农场主
  37.     map[famerX][famerY] = 'F';
  38.    
  39.     //3)随机初始化鸡的位置,鸡的位置不能和农场主的位置重合
  40.     srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
  41.     //产生随机数
  42.     cockX = rand()%8;
  43.     cockY = rand()%8;
  44.     while (cockX == famerX && cockY == famerY) {
  45.         //如果公鸡和农场主的位置重合则重新分配公鸡的位置
  46.         cockX = rand()%8;
  47.         cockY = rand()%8;
  48.     }
  49.     map[cockX][cockY] = 'C';

  50. }


  51. int fEc(){
  52.     if (famerX == cockX && famerY == cockY) {
  53.         return 1;
  54.     }
  55.     return 0;
  56. }
  57. /**
  58. *  移动函数
  59. *
  60. *  @param map       盘面数组
  61. *  @param direction 移动方向
  62. *  @param x         当前X坐标
  63. *  @param y         当前Y坐标
  64. */
  65. void Move(char map[8][8],char direction,int *x,int *y)
  66. {
  67.     char temp;
  68.     switch (direction) {
  69.         case 'a':
  70.         case 'A':
  71.             //向左移动一格,y值减一
  72.             if (*y>0) {
  73.                 temp = map[*x][*y];
  74.                 map[*x][*y] = map[*x][*y-1];
  75.                 map[*x][*y-1] = temp;
  76.                 (*y)--;
  77.                 if (fEc()) {
  78.                     map[*x][*y] = 'X';
  79.                     map[*x][*y+1] = '#';
  80.                 }
  81.                
  82.             }
  83.             
  84.             break;
  85.         case 'd':
  86.         case 'D':
  87.             //向右移动一格,y值加一
  88.             if (*y<7) {
  89.                 temp = map[*x][*y];
  90.                 map[*x][*y] = map[*x][*y+1];
  91.                 map[*x][*y+1] = temp;
  92.                 (*y)++;
  93.                 if (fEc()) {
  94.                     map[*x][*y] = 'X';
  95.                     map[*x][*y-1] = '#';
  96.                 }
  97.             }
  98.             break;
  99.             
  100.         case 'w':
  101.         case 'W':
  102.             //向上移动一格,x值减一
  103.             if (*x>0) {
  104.                 temp = map[*x][*y];
  105.                 map[*x][*y] = map[*x-1][*y];
  106.                 map[*x-1][*y] = temp;
  107.                 (*x)--;
  108.                 if (fEc()) {
  109.                     map[*x][*y] = 'X';
  110.                     map[*x+1][*y] = '#';

  111.                 }
  112.             }
  113.             break;
  114.             
  115.         case 's':
  116.         case 'S':
  117.             //向下移动一格,x值加一
  118.             if (*x<7) {
  119.                 temp = map[*x][*y];
  120.                 map[*x][*y] = map[*x+1][*y];
  121.                 map[*x+1][*y] = temp;
  122.                 (*x)++;
  123.                 if (fEc()) {
  124.                     map[*x][*y] = 'X';
  125.                     map[*x-1][*y] = '#';
  126.                 }
  127.             }
  128.             break;
  129.         default:
  130.             break;
  131.     }
  132. }


  133. /**
  134. *  公鸡自动移动
  135. *
  136. *  @param map 地图
  137. */
  138. void cockMove(char map[8][8]){
  139.     srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
  140.     //产生随机数
  141.     int suiji = rand()%4;
  142.    
  143.         // printf("%d",suiji);
  144.         switch (suiji) {
  145.             case 0:
  146.                 Move(map, 'w',&cockX,&cockY);
  147.                 break;
  148.             case 1:
  149.                 Move(map, 's',&cockX,&cockY);
  150.                 break;
  151.             case 2:
  152.                 Move(map, 'a',&cockX,&cockY);
  153.                 break;
  154.             case 3:
  155.                 Move(map, 'd',&cockX,&cockY);
  156.                 break;
  157.                
  158.             default:
  159.                 break;
  160.         }
  161. }
  162. /**
  163. *  判断是否赢了,以及用户输入提醒
  164. */
  165. int isOK(char map[8][8]){
  166.     if (fEc()) {//赢了
  167.         printMap(map);
  168.         printf("你走了%d步捉住了公鸡,你赢了!\n",14-count);
  169.         return 1;
  170.     }else{
  171.         return 0;
  172.     }
  173.    
  174. }

  175. /**
  176. *  农场主移动
  177. *
  178. *  @param map 地图
  179. */
  180. void famerMove(char map[8][8]){
  181.     char move = getc(stdin);
  182.     while (1) {
  183.         
  184.         if (move == 'w' || move == 'W' ||
  185.             move == 's' || move == 'S' ||
  186.             move == 'a' || move == 'A' ||
  187.             move == 'd' || move == 'D' ) {
  188.              Move(map, move, &famerX, &famerY);
  189.             count --;
  190.             
  191.             break;
  192.         }else{
  193.             move = getc(stdin);
  194.         }
  195.     }
  196.    
  197.    
  198. }

  199. int main(int argc, const char * argv[]) {
  200.    
  201.    
  202.     char map[8][8];//定义数组存放地图
  203.     //初始化地图
  204.     initMap(map);
  205.     printMap(map);
  206.     //打印控制游戏选择提示
  207.     printf("请选择:‘F’代表农场主先走还是‘C’代表公鸡先走?\n");
  208.     fORc=getc(stdin);
  209.     while (1) {
  210.         if (fORc == 'f' ||
  211.             fORc == 'F' ||
  212.             fORc == 'c' ||
  213.             fORc == 'C') {
  214.             if (fORc == 'f' || fORc == 'F') {
  215.                 printf("你选择了农场主先走,游戏开始!\n");
  216.                
  217.             }else{
  218.                 printf("你选择了公鸡先走,游戏开始!\n\n");
  219.                
  220.             }
  221.             break;
  222.             
  223.         }else{
  224.             printf("输入不合法,游戏推出,请重新运行!\n");
  225.             return 0;
  226.             
  227.             
  228.         }
  229.     }
  230.    

  231.    
  232.     //创建游戏循环
  233.     while (1) {
  234.       
  235.         if (fORc =='C' || fORc == 'c') {
  236.             //公鸡自动移动
  237.             cockMove(map);
  238.             if (isOK(map)) {
  239.                 printf("公鸡自投罗网!\n");
  240.                 return 0;
  241.             }
  242.             //打印地图
  243.             printf("公鸡已走完:\n");
  244.             printMap(map);
  245.             fORc = 'f';
  246.             //判断是否胜利
  247.             //打印用户控制提示
  248.             
  249.         }else if(fORc == 'f'||fORc =='F'){
  250.             printf("\n请移动农场主(F):输入w(上)、s(下)、a(左)、d(右)后回车开始移动!你还剩%d步!\n",count);
  251.             //用户移动
  252.             famerMove(map);
  253.             
  254.             //判断是否胜利
  255.             if (isOK(map)) {
  256.                 return 0;
  257.             }
  258.             
  259.             //打印地图
  260.             printf("农场主已走完:\n");
  261.             printMap(map);
  262.             //当农场主走了14步还捉不到公鸡则推出游戏
  263.             if (count == 0) {
  264.                 printf("14步已用完,你还没捉住公鸡,太失败了!请重新开始吧\n");
  265.                 return 0;
  266.             }
  267.             
  268.             fORc = 'c';
  269.             
  270.         }
  271.     }
  272.     return 0;
  273. }
复制代码


3 个回复

倒序浏览
感觉好厉害
回复 使用道具 举报
看着就好高端的样子 好好学习  
回复 使用道具 举报
这个比小人推箱子复杂啊,小人可以控制箱子,但是这个游戏农场主不能控制小鸡,不过感觉不是很难
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马