本帖最后由 984326157 于 2015-7-14 01:06 编辑
根据《算法谜题》一书中的捉鸡一题,改编成游戏并使用C语言编程实现,如下:
农场主捉鸡游戏玩法介绍: # # # # # # # #
# # # # # C # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
F # # # # # # #
1)场地是8X8的,农场主初始位置在最左下角(F),鸡的位置在场地上的位置随机分配(C)
2)游戏开始后,玩家选择农场主先走还是鸡先走,玩家代表农场主去捉鸡,鸡自动移动;农场主和鸡交替走,农场主和鸡都可以移动到上下左右方向上邻近的一步,不能走对角,当农场主移动到鸡所在的位置,或者鸡自投罗网跑到农场主的位置时,农场主赢,游戏结束
3)如果选择正确的话(即选择农场主先走还是鸡先走),农场主最多14步可捉到鸡,如果14步还捉不到,宣布游戏失败!
4)W、S、A、D控制农场主(F)的上、下、左、右移动
辛苦了半天,终于把游戏完成,自己试玩了一下,还可以。本游戏如果选择错误(即鸡先走或人先走),游戏很可能会失败的哦,请大家讨论如何选择鸡先走还是人先走能百分之百捉住鸡?
代码:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- //定义变量
- int count = 14;//倒计时,14步,14步贷不到鸡游戏失败
- int famerX,famerY,//记录农场主的位置
- cockX,cockY;//记录公鸡的位置
- char fORc;//记录谁先走,'F'农场主先走,‘C’公鸡先走
- /**
- * 打印地图功能
- *
- * @param map 地图数组
- */
- void printMap(char map[8][8]){
- for (int i=0; i<8; i++) {
- for (int j = 0; j<8; j++) {
- printf(" %c",map[i][j]);
- }
- printf("\n");
- }
- printf("\n");
- }
- /**
- 初始化地图
-
- */
- void initMap(char map[8][8]){
- //1)使用#填充地图
- for (int i=0; i<8; i++) {
- for (int j = 0; j<8; j++) {
- map[i][j] = '#';
- }
- }
-
- //2)初始化农场主位置左下角(7,0)
- famerX = 7,famerY = 0;
- //放入农场主
- map[famerX][famerY] = 'F';
-
- //3)随机初始化鸡的位置,鸡的位置不能和农场主的位置重合
- srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
- //产生随机数
- cockX = rand()%8;
- cockY = rand()%8;
- while (cockX == famerX && cockY == famerY) {
- //如果公鸡和农场主的位置重合则重新分配公鸡的位置
- cockX = rand()%8;
- cockY = rand()%8;
- }
- map[cockX][cockY] = 'C';
- }
- int fEc(){
- if (famerX == cockX && famerY == cockY) {
- return 1;
- }
- return 0;
- }
- /**
- * 移动函数
- *
- * @param map 盘面数组
- * @param direction 移动方向
- * @param x 当前X坐标
- * @param y 当前Y坐标
- */
- void Move(char map[8][8],char direction,int *x,int *y)
- {
- char temp;
- switch (direction) {
- case 'a':
- case 'A':
- //向左移动一格,y值减一
- if (*y>0) {
- temp = map[*x][*y];
- map[*x][*y] = map[*x][*y-1];
- map[*x][*y-1] = temp;
- (*y)--;
- if (fEc()) {
- map[*x][*y] = 'X';
- map[*x][*y+1] = '#';
- }
-
- }
-
- break;
- case 'd':
- case 'D':
- //向右移动一格,y值加一
- if (*y<7) {
- temp = map[*x][*y];
- map[*x][*y] = map[*x][*y+1];
- map[*x][*y+1] = temp;
- (*y)++;
- if (fEc()) {
- map[*x][*y] = 'X';
- map[*x][*y-1] = '#';
- }
- }
- break;
-
- case 'w':
- case 'W':
- //向上移动一格,x值减一
- if (*x>0) {
- temp = map[*x][*y];
- map[*x][*y] = map[*x-1][*y];
- map[*x-1][*y] = temp;
- (*x)--;
- if (fEc()) {
- map[*x][*y] = 'X';
- map[*x+1][*y] = '#';
- }
- }
- break;
-
- case 's':
- case 'S':
- //向下移动一格,x值加一
- if (*x<7) {
- temp = map[*x][*y];
- map[*x][*y] = map[*x+1][*y];
- map[*x+1][*y] = temp;
- (*x)++;
- if (fEc()) {
- map[*x][*y] = 'X';
- map[*x-1][*y] = '#';
- }
- }
- break;
- default:
- break;
- }
- }
- /**
- * 公鸡自动移动
- *
- * @param map 地图
- */
- void cockMove(char map[8][8]){
- srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
- //产生随机数
- int suiji = rand()%4;
-
- // printf("%d",suiji);
- switch (suiji) {
- case 0:
- Move(map, 'w',&cockX,&cockY);
- break;
- case 1:
- Move(map, 's',&cockX,&cockY);
- break;
- case 2:
- Move(map, 'a',&cockX,&cockY);
- break;
- case 3:
- Move(map, 'd',&cockX,&cockY);
- break;
-
- default:
- break;
- }
- }
- /**
- * 判断是否赢了,以及用户输入提醒
- */
- int isOK(char map[8][8]){
- if (fEc()) {//赢了
- printMap(map);
- printf("你走了%d步捉住了公鸡,你赢了!\n",14-count);
- return 1;
- }else{
- return 0;
- }
-
- }
- /**
- * 农场主移动
- *
- * @param map 地图
- */
- void famerMove(char map[8][8]){
- char move = getc(stdin);
- while (1) {
-
- if (move == 'w' || move == 'W' ||
- move == 's' || move == 'S' ||
- move == 'a' || move == 'A' ||
- move == 'd' || move == 'D' ) {
- Move(map, move, &famerX, &famerY);
- count --;
-
- break;
- }else{
- move = getc(stdin);
- }
- }
-
-
- }
- int main(int argc, const char * argv[]) {
-
-
- char map[8][8];//定义数组存放地图
- //初始化地图
- initMap(map);
- printMap(map);
- //打印控制游戏选择提示
- printf("请选择:‘F’代表农场主先走还是‘C’代表公鸡先走?\n");
- fORc=getc(stdin);
- while (1) {
- if (fORc == 'f' ||
- fORc == 'F' ||
- fORc == 'c' ||
- fORc == 'C') {
- if (fORc == 'f' || fORc == 'F') {
- printf("你选择了农场主先走,游戏开始!\n");
-
- }else{
- printf("你选择了公鸡先走,游戏开始!\n\n");
-
- }
- break;
-
- }else{
- printf("输入不合法,游戏推出,请重新运行!\n");
- return 0;
-
-
- }
- }
-
-
- //创建游戏循环
- while (1) {
-
- if (fORc =='C' || fORc == 'c') {
- //公鸡自动移动
- cockMove(map);
- if (isOK(map)) {
- printf("公鸡自投罗网!\n");
- return 0;
- }
- //打印地图
- printf("公鸡已走完:\n");
- printMap(map);
- fORc = 'f';
- //判断是否胜利
- //打印用户控制提示
-
- }else if(fORc == 'f'||fORc =='F'){
- printf("\n请移动农场主(F):输入w(上)、s(下)、a(左)、d(右)后回车开始移动!你还剩%d步!\n",count);
- //用户移动
- famerMove(map);
-
- //判断是否胜利
- if (isOK(map)) {
- return 0;
- }
-
- //打印地图
- printf("农场主已走完:\n");
- printMap(map);
- //当农场主走了14步还捉不到公鸡则推出游戏
- if (count == 0) {
- printf("14步已用完,你还没捉住公鸡,太失败了!请重新开始吧\n");
- return 0;
- }
-
- fORc = 'c';
-
- }
- }
- return 0;
- }
复制代码
|
|