数字迷宫
第一部分 案例描述
案例目的
本案例为实现动态的刷新Dos界面,使用用户控制头像“消灭”窗口中出现的数字(无固定顺序)的游戏,来使学员加深对一维数组、二维数组、循环语句、选择程序设计以及相关系统函数的使用。
案例难度
★★★★
案例覆盖技能点
a) 选择程序设计
b) 循环程序设计
c) 用户、屏幕窗口的输入输出
d) 相关系统函数
e) 一维、二维数组
推荐案例完成时间
4天
适用课程和对象
C语言案例(T阶段)
第二部分 需求和开发环境
使用技术和开发环境
Microsoft Visual C++ 6.0
案例需求
本案例要求制作一个《数字迷宫》的游戏,该游戏的玩法描述为:
1、 系统主要地图为固定模式
2、 地图内部包含墙体、走廊、阿拉伯数字(1~7)、玩家头像(1个)四种不同内容
3、 用户通过上、下、左、右按键来控制玩家头像在地图范围内的走动
4、 在玩家走动过程中,碰撞墙壁时,该步的走动无效,玩家头像原地不变
5、 玩家允许在设计走廊内部进行走动
6、 玩家头像遇到阿拉布数字时,数字消失,并且对玩家走动无影响
7、 玩家头像遭遇所有数字之后(地图上无阿拉伯数字),该局游戏结束,并自动开始下一局游戏
8、 在某一局游戏中,游戏走廊、墙体与其他游戏相同,但数字位置会随机产生
9、 阿拉伯数字产生在走廊内而非墙体上
10、 在玩家游戏过程中按下Esc键,游戏无条件退出。
11、 在玩家未使用Esc键时,程序正常运行

/*
**功能:数字迷宫
**日期:2017-7-8~2017-7-11
**版本:v 1.3
**作者:lzh
*/#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>int code [17][24]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1,0,0,0,0,0,-1,-1,-1,0,0,0,-1,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0,0,0,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,0,-1,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,-1,0,0,-1,0,-1,0,0,0,0,-1,0,-1,-1,-1,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,0,0,0,0,-1,0,0,0,-1,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,-1,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,-1,-1,-1,-1,0,-1,-1,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,-1,-1,-1,-1,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};int x1,y1,x2,y2;//初始位置
char ch;
int flag;
int num,num1,num2;//剩余数字
int cnt;//记录数字大小
int step1,step2;//记录步数
int f;//标记声音
int fast = 999; //记录最快成绩
FILE *fp1 ,*fp2;
int t = 1;
//位置函数
void Gotoxy(int x,int y)
{COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);//定位光标位置
}//载入特效
void Load()
{int i = 0;Gotoxy(15,8);printf("游戏正在加载....");Gotoxy(15,10);for (i = 1; i <= 40; ++i){putchar('-');}for (i = 1; i <= 40; ++i){putchar('\b');}for (i = 1; i <= 40; ++i){putchar('>');Sleep(100);}system("cls");
}//帮助
void Help()
{Gotoxy(0,13);printf("\t\t\t      游戏说明\n");printf("\t\t1.单人模式中使用上下左右键控制位置\n");printf("\t\t2.双人模式中玩家一使用上下左右键控制,玩家二使用wasd控制\n");printf("\t\t3.双人模式中先吃到4个数字的玩家获胜\n");printf("\t\t4.按t键开启音效,按f键关闭音效\n");printf("\t\t5.游戏默认关闭音效\n");printf("\t\t6.吃光地图中7个数字即可获胜,该局游戏结束,并自动开始下一局游戏\n");printf("\t\t7.游戏过程中可随时按ESC键退出\n");
}//显示主页面void ShowMain()
{while(1){Gotoxy(4,5);printf("数");Sleep(200);Gotoxy(8,5);printf("字");Sleep(200);Gotoxy(12,5);printf("迷");Sleep(200);Gotoxy(16,5);printf("宫");Sleep(200);Gotoxy(20,5);printf(" V");Sleep(200);Gotoxy(22,5);printf("1.3");Sleep(200);//printf("\t\t\t        数字迷宫v 1.03\n\n");Gotoxy(30,4);printf("1.开始标准模式(单人模式)");Sleep(200);Gotoxy(30,6);printf("2.开始竞技模式(双人模式)");Sleep(200);Gotoxy(30,8);printf("3.帮助");Sleep(200);Gotoxy(30,12);printf("0.退出\n");int choose;scanf("%d",&choose);if(choose == 1){printf("qqq");flag = 1;break;}else if (choose == 2){flag = 2;break;}else if (choose == 3){//system("cls");Help();}else if (choose == 0){flag = 0;break;}}printf("QAQ");
}//根据数组输出图像
void SetCode(int num)
{if(num == 0){printf("■");}else if(num == -1){printf("  ");}else if (num >= 1&&num <= 7){printf("%d ",num);}
}//通过随机函数在走廊处随机生成数字
void SetNum()
{while(cnt<=7){int x = rand()%17;int y = rand()%24;if(code[x][y] == -1&&x != 1&&y != 1){code[x][y] = cnt++;}elseSetNum();}
}//生成地图主体函数:
void SetWindow()
{for(int i = 0; i <= 16; i++){printf("\t\t");for(int j = 0 ; j <= 23; j++){SetCode(code[i][j]);}printf("\n");}Gotoxy(18,1);//确定初始位置printf("\1 ");if(flag == 2){Gotoxy(58,2);printf("\2 ");}
}void UpKey1()
{if(code[x1-1][y1] != 0)x1--;
}
void DownKey1()
{if(code[x1+1][y1] != 0)x1++;
}
void LeftKey1()
{if(code[x1][y1-1] != 0)y1--;
}
void RightKey1()
{if(code[x1][y1+1] != 0)y1++;
}void UpKey2()
{if(code[x2-1][y2] != 0)x2--;
}
void DownKey2()
{if(code[x2+1][y2] != 0)x2++;
}
void LeftKey2()
{if(code[x2][y2-1] != 0)y2--;
}
void RightKey2()
{if(code[x2][y2+1] != 0)y2++;
}//覆盖原来表情
void GoToXYSpace(char ch)
{if(ch==72||ch==75||ch==77||ch==80){Gotoxy(2*y1+16,x1);printf("  ");}else{Gotoxy(2*y2+16,x2);printf("  ");}
}//移动表情
void MoveEmoji()
{if(ch==72||ch==75||ch==77||ch==80){Gotoxy(2*y1+16,x1);printf("\1 ");}else{Gotoxy(2*y2+16,x2);printf("\2 ");}
}//判断方向
void Direction(char ch)
{if(ch == 72||ch == 75||ch == 77||ch == 80){switch (ch)//判断方向并计步{case 72:UpKey1();break;//上case 80:DownKey1();break;//下case 75:LeftKey1();break;//左case 77:RightKey1();break;//右}step1++;}else{switch(ch){case 119:UpKey2();break;//wcase 115:DownKey2();break;//scase 97:LeftKey2();break;//acase 100:RightKey2();break;//d}step2++;}
}//检查剩余数字
int CheckLeftNum()
{if(num>=7)return 1;return 0;
}//判断是否吃掉数字并计数
void CountNum(int x,int y)
{if(code[x][y] >= 1 && code[x][y] <= 7){num++;code[x][y] = -1; //改变状态if(f)Beep(523,500);if(ch == 72||ch == 75||ch == 77||ch == 80)num1++;elsenum2++;}
}void Information()
{Gotoxy(1,1);printf("当前步数");Gotoxy(1,2);printf("玩家1 :%d",step1);if(flag == 2){Gotoxy(1,3);printf("玩家2 :%d",step2);}Gotoxy(1,4);printf("按t开启音效\n");Gotoxy(1,5);printf("按f关闭音效\n");Gotoxy(40,22);printf("数字迷宫 v1.3");Gotoxy(60,22);printf("design by lzh  ");Gotoxy(65,1);printf("当前得分");Gotoxy(65,2);printf("玩家1:");Gotoxy(72,2);printf("%d",num1);if(flag == 2){Gotoxy(65,4);printf("玩家2:");Gotoxy(72,4);printf("%d",num2);}int i = 999;fp1 = fopen("rank.txt","r");fscanf(fp1,"%d",&i);Gotoxy(1,20);printf("当前最快记录为%d s",i);fclose(fp1);
}// 随机变化5种颜色
void ChangeColor()
{int color;color = rand()%4;switch(color){case 0:system("color 6f");break;case 1:system("color 07");break;case 2:system("color 30");break;case 3:system("color 70");break;}
}void Begin()
{x1 = 1;y1 = 1;x2 = 2;y2 = 21;cnt = 1;step1 = 0;step2 = 0;system("cls");srand((unsigned)time(NULL));printf("2");SetNum(); //生成随机数SetWindow(); //生成地图
}//单人模式
void OneP()
{while(flag != 0){Begin();int startTime = clock(); //获取当前时间while(1){ch = getch();if(ch == 27)  //判断ESC键exit(0);while(!(ch==72||ch==75||ch==77||ch==80)) //防止误触{if(ch == 't')  //判断是否开启音效{f = 1;}else if (ch == 'f')f = 0;elsech = getch();}if(t = 0)break;GoToXYSpace(ch);//清除上次位置Direction(ch);//判断输入方向MoveEmoji();//移动表情 );CountNum(x1,y1); //统计数字个数Information(); //显示提示信息if(CheckLeftNum()){num = 0;step1 = 0;step2 = 0;num1 = 0;num2 = 0;int endTime = clock();int time = endTime - startTime;//计算用时if (time/1000 < fast){fast = time/1000;fp2 = fopen("rank.txt","wb+");fprintf(fp2,"%d",fast);fclose(fp2);}ChangeColor();Gotoxy(30,19);printf("<( ̄︶ ̄)> 用时%d s~",time/1000);Sleep(1000);MessageBox(NULL,"Bingo~ QVQ  进入下一关","Good job",MB_OK);break;}}}
}//双人模式
void TwoP()
{while(flag != 0){Begin();int startTime = clock();while(1){ch = getch();if(ch == 27)exit(0);while(!(ch == 72||ch == 75||ch == 77||ch == 80||ch == 119||ch == 97||ch == 115||ch == 100)) //防止误触{if(ch == 't') //标记音效{f = 1;}else if (ch == 'f')f = 0;ch = getch();}if(ch==72||ch==75||ch==77||ch==80) //Player One{GoToXYSpace(ch);//清除上次位置Direction(ch);//判断输入方向MoveEmoji();//移动表情CountNum(x1,y1); //统计数字个数}else    //Player Two{GoToXYSpace(ch);Direction(ch);//判断输入方向MoveEmoji();CountNum(x2,y2);}Information();if(CheckLeftNum()){int endTime = clock();int time = endTime - startTime;//计算用时step1 = 0;step2 = 0;ChangeColor();Gotoxy(30,19);printf("<( ̄︶ ̄)> 用时%d s~",time/1000);ChangeColor();if(num1>num2)MessageBox(NULL,"玩家1获胜","QvQ",MB_OK);elseMessageBox(NULL,"玩家2获胜","QvQ",MB_OK);num = 0;num1 = 0;num2 = 0;break;}}}
}//选择哪种游戏模式
void Switch()
{while(flag != 0){if(flag == 1){OneP(); //单人模式}else if(flag == 2){TwoP(); //双人模式}}
}int main()
{SetConsoleTitle("数字迷宫v 1.3");//设置标题system("color 3f");Load();//进度条效果ShowMain();Switch();return 0;
}

实训项目 数字迷宫小游戏相关推荐

  1. 实训题目——数字迷宫——优秀

    数字迷宫 相关文件下载到我的资源下载. 第一部分   案例描述 案例目的 本案例为实现动态的刷新Dos界面,使用用户控制头像"消灭"窗口中出现的数字(无固定顺序)的游戏,来使学员加 ...

  2. c语言猜拳游戏实训报告,Java猜拳小游戏程序设计实验报告.doc

    Java程序设计实验报告 班级: 学号: 姓名: 实验题目:猜拳小游戏 实验要求: 用java编写一个人机对战的猜拳小游戏.人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况.有简单的操作界面. 实验 ...

  3. 数字迷宫小游戏源代码

    数字迷宫 案例需求 本案例要求制作一个<数字迷宫>的游戏,该游戏的玩法描述为: 1. 系统主要地图为固定模式 2. 地图内部包含墙体.走廊.阿拉伯数字(1~7).玩家头像(1个)四种不同内 ...

  4. java小游戏实训目的_Java弹球小游戏实验报告.doc

    Java弹球小游戏实验报告 滨江学院 Java程序设计实验报告 题 目 弹球小游戏 姓 名 许浩 学 号 20112346064 学 院 滨江学院 专 业 网络工程 年 级 2011级 指导教师 张舒 ...

  5. Java实训项目一一拼图游戏(附源码)

    1 实训基本信息 1.1 实训项目名称 (1)拼图游戏 1.2 实训环境 本次实训内容主要针对专业学生,实训形式以实战讲解为主导.实训课程由实训老师主讲,实训老师教学严谨又平易近人,讲解的内容非常细致 ...

  6. java实训小项目6_实训项目

    layout: post title: 实训项目 date: 2020-12-6 author: XiaoJia849 categories: - 开发部 tags: - 后端 - springboo ...

  7. 实训项目“你画我猜”总结_前端篇

    为期4周的实训就要结束了,感谢团队中的每一名同学,才有了我们今天的成果.我们这个5人小团队(产品一位,测试一位,开发三位(两名后台,一名前端)),来自不同的学校,带着刚毕业的学生气一起组成了我们的&q ...

  8. JAVA实训项目:银行网银系统管理平台(含源码)

    JAVA实训项目:银行网银系统管理平台(含源码) 文章目录 JAVA实训项目:银行网银系统管理平台(含源码) 前言 一.项目功能需求描述以及相关技术的应用 相关技术应用 二.设计过程 系统流程图 1. ...

  9. JAVA实训项目之学生管理系统(JDBC+GUI)

    本系统设计采用的是Java作为设计语言,MySQL作为数据库,简单来说整个系统涉及到Swing界面的开发.以及对于数据库的一些操作,查询.增加.删除等,通过上述的操作来完成相应的学生管理系统的基本功能 ...

最新文章

  1. CVPR新规严禁审稿期间公开宣传论文,可发arXiv,LeCun:疯了吧!
  2. TSNE Understanding
  3. C#基础解析之Ⅱ【运算符和条件结构】
  4. 神经网络应该注意的重要问题
  5. .Net异步编程知多少
  6. 8.2.5: Spring3.0新增的@DependsOn和@Lazy
  7. composer Failed to decode zlib stream
  8. boost :: dynamic_bitset时序测试
  9. Linux版本划分——基于打包方式
  10. Spring Boot笔记-logback-spring.xml获取application.properties中的变量
  11. random模块 时间模块 sys模块 os模块 json模块 pickle模块
  12. python在json文件中查找指定数据_Python中json的取值 如何使用python提取json中指定字段的数据...
  13. 4、Spring配置中的classpath:与classpath*:的区别
  14. JS屏蔽360浏览器代码
  15. 增加批量修改成本价格,配合后台管理增加成本价和毛利润统计
  16. Mqtt客户端与服务端通讯
  17. 惯量比多少合适_惯量比折算问题
  18. less面试_面试必看:less与sass的区别
  19. 梦碎IPO的百果园,给水果零售业敲了个警钟
  20. CSS形成圆、平行四边形、菱形、梯形、饼图

热门文章

  1. android夜景录像模式,手机如何拍出超级夜景?详细教程来袭,苹果/安卓版本全都有...
  2. Angular 入门教程系列:36:Restful的增删改查
  3. 用计算机猜出人的年龄,抖音很火的年龄计算器
  4. sdcard 和mnt/sdcard 两个文件夹的区别
  5. 双上行链路的热备份网关冗余
  6. android 系统语言改变广播,关于android语言切换后通知栏显示的问题
  7. [创业-38]:公司、企业、组织的本质与层次
  8. 信息战争,从过去到未来
  9. 马士兵:从零到年薪百万,写给浮躁的程序员
  10. 手机便签会保存动图吗?