- //
- // 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;
- }
复制代码 |
|