黑马程序员——C语言---数字九宫格游戏实战练习

——<a href=”http://www.itheima.com” target=”blank”>Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ———

学完C语言基础视频,根据基础视频中迷宫游戏有感而发,自编一个数字九宫格游戏练练手。游戏及规则均是自创。AppStore上有九宫格游戏,本人曾经下载下来玩过,但是总是存在打乱次序后完不成的情况,可能是程序逻辑不对。本程序打乱次序逻辑保证百分之百正确,不存在无解的结果。欢迎各位试玩!啥也不说了,上代码!

//
//  main.c
//  数字九宫格
//
//  Created by apple apple on 15/7/6.
//  Copyright (c) 2015年 shuangxing. All rights reserved.
//
/*游戏玩法介绍:
 1)#只能上下左右移动一步,移动到那个位置的数字与#交换位置
    1  #    3
    8  2    5
    4  7   6
 2)直到#移动到最右下角时,并且盘面行程如下次序,才算游戏胜利
    1	2	3
    4	5	6
    7	8	#
 3)胜利后把#替换成9,盘面再次打印
    1	2	3
    4	5	6
    7	8	9
    胜利!
 
 编程要求:
 1)盘面要按一定的逻辑打乱次序(因为随机打乱存在一定的完不成能游戏的概率)
 2)键盘控制#的移动,w/W:上移;s/S:下移;a/A:左移;d/D:右移。
 
 
 游戏界面:
 
 开始界面
 1.开始游戏
 2.退出游戏
 提示用户选择1开始游戏,2退出游戏
 
 玩游戏界面
 打印盘面
 提示移动规则
 
 胜利界面
 打印完整盘面
 提示胜利并结束游戏!
 
 */
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//记录#的位置,初始位置为2,2
int x = 2,y = 2;

/**
 *  打印盘面
 *
 *  @param map 盘面数组
 */
void printMap(char map[3][3])
{
    for (int i=0; i<3; i++) {
        for (int j =0; j<3; j++) {
            printf("%c\t",map[i][j]);
        }
        printf("\n");
    }
}
/**
 *  移动函数
 *
 *  @param map       盘面数组
 *  @param direction 移动方向
 */
void Move(char map[3][3],char direction)
{
    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--;
            }
            
            break;
        case 'd':
        case 'D':
            //向右移动一格,y值加一
            if (y<2) {
                temp = map[x][y];
                map[x][y] = map[x][y+1];
                map[x][y+1] = temp;
                y++;
            }
            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--;
            }
            break;

        case 's':
        case 'S':
            //向下移动一格,x值加一
            if (x<2) {
                temp = map[x][y];
                map[x][y] = map[x+1][y];
                map[x+1][y] = temp;
                x++;
            }
            break;
        default:
            break;
    }
}
/**
 *  按照一定的逻辑打乱盘面次序
 *
 *  @param map 盘面数组
 */
void sortMap(char map[3][3])
{
    //1.令map[2][2]='#'
    map[2][2]='#';
    srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
    //产生随机数
    int suiji = rand()%4;
    for (int i=0; i<100;i++ ) {
       // printf("%d",suiji);
        switch (suiji) {
            case 0:
                Move(map, 'w');
                break;
            case 1:
                Move(map, 's');
                break;
            case 2:
                Move(map, 'a');
                break;
            case 3:
                Move(map, 'd');
                break;
                
            default:
                break;
        }
        suiji = rand()%4;
        
    }
    
    
}
/**
 *  判断是否正确完成游戏
 *
 *  @param map 盘面数组
 *
 *  @return 成功返回1,不成功返回0
 */
int isOK(char map[3][3])
{
    if (map[0][0] == '1' &&
        map[0][1] == '2' &&
        map[0][2] == '3' &&
        map[1][0] == '4' &&
        map[1][1] == '5' &&
        map[1][2] == '6' &&
        map[2][0] == '7' &&
        map[2][1] == '8' &&
        map[2][2] == '#' ) {
        return 1;
    }else return 0;
}


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


    //打印游戏开始界面
    printf("***1.开始游戏***\n");
    printf("***2.退出游戏***\n");
    printf("请输入1开始游戏,或者2退出游戏。\n");
    //建立界面选择逻辑
    char flag;
    flag = getc(stdin);
    if (flag =='1') {//开始游戏
        //打乱次序
        sortMap(map);
        //打印盘面
        printMap(map);
        //提示玩家控制游戏
        printf("请开始游戏,输入w“#”向上移动,输入s“#”向下移动,输入a“#”向左移动,输入d“#”向右移动。\n");
        //创建游戏循环
        while (1) {
            char ch = getc(stdin);
            if (ch == 'w' || ch == 'W'
                || ch == 's' || ch == 'S'
                || ch == 'a' || ch == 'A'
                || ch == 'd' || ch == 'D' ) {
                Move(map, ch);
                printMap(map);
                if (isOK(map)) {
                    map[2][2] = '9';
                    printf("\n\n");
                    printMap(map);
                    printf("胜利了!游戏结束!");
                    break;
                }
            }
        }
    }else if(flag == '2')
    {
        printf("游戏已退出!\n");
        return 0;
    }else{
        printf("输入错误!游戏退出!请重新运行!\n");
    }
    return 0;
}

    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/liuming_xing_cool/article/details/46783353
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞