——<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;
}