[知识支撑点]
- 基本的控制台输入、输出。
- 函数的声明、定义和调用。
- switch选择结构。
- goto无条件跳转语句的使用。
- 控制台字体和颜色的设置。
- 控制台上文字显示位置的设置。
- 随机数rand()函数的使用。
- 获取键盘按键并进行相应操作。
[实践目的]
(1)培养学生综合运用所学的知识,通过上机实践,提高分析和解决问题的能力。
(2)通过实践训练,提高学生在理论计算、结构设计、查阅设计资料、运用标准与规范编程能力。
[实验能力目标]
(1)能准确理解题目的内涵,对问题的分析、功能划分以及数据组织的能力。
(2)采用合适的解决方法,对问题进行分解,逐步求精。
(3)程序实现能力,能将问题分析,采用合适的数据表述、算法设计和程序调试,完成相应的程序设计。
[预习要求]
(1)开发工具Dev C++的安装,熟悉工具界面和基本功能的使用。
(2)回顾C语言基础,包括二维数组、结构体、指针、宏定义、变量、逻辑运算符、“==”与“=”等。
(3)回顾程序运行结构:循环结果(for循环、while循环)、分支结构(if……else分支语句)。
(4)回顾函数使用:printf()、scanf()、system()函数。
[项目实践目标要求]
俄罗斯方块游戏是一款老少皆宜的经典益智类游戏。该游戏堆砌各种形状的方块,满行即消除该行,当方块堆积到屏幕最上方时游戏结束。
该项目实践的目标要求如下:
- 实现友好的游戏界面,字体和颜色显示清晰,界面排版美观。
- 实现游戏的业务规则:
[键盘按键规则]
- 通过键盘上的←和→箭头来控制左右移动的方向。
- 通过键盘上↑是方块变形。
- 通过键盘上↓加速方块落下。
- 通过键盘上空格键暂停游戏,再按空格键继续游戏。
- 通过键盘上ESC退出游戏。
[业务规则]
- 不同形状的小方块从屏幕上方落下,玩家通过调整方块的位置和方向,使他们在屏幕底部拼出完整的一条或几条。
- 每消除一行,积分张100.
- 每累计1000分,会提升一个等级。
- 提升等级会使方块下落速度加快,游戏难度加大。
- 代码编写规范。
- 游戏测试顺畅。
#include <iostream>
//head.h文件源代码
#include <stdio.h>
#include <windows.h>//windows相关命令 ,设置字体背景框颜色
#include <conio.h>//键盘输入按键
#include <time.h>//随机数
#include <dos.h>
//宏定义
#define FrameX 13//x左上角坐标值
#define FrameY 3
#define Frame_height 20 //窗体高度
#define Frame_width 18
/*******定 义 全 局 变 量 *******/
int i,j,Temp,Temp1,Temp2;//存储方块变量值
int a[80][80];//标记游戏图案,0代表无图案,1有方块图案,2 游戏边框
int b[4];//俄罗斯方块由4个小方块组成,b[i]=0表示无方块,b[i]=1表示有方块
//俄罗斯方块结构体
struct Tetris
{
int x;
int y;//坐标值
int flag;//标记方块类型
int next;//下一个方块类型
int speed;//速度
int number;//方块个数
int score;//产生分数
int level;//游戏等级
};
HANDLE hOut;//定义控制台句柄 ,接下来要设置控制台颜色和获取控制台的位置
/*******函 数 声 明 *******/
int color(int c); //设置文字颜色
void gotoxy(int x, int y); //光标移到指定位置
void DrwaGameframe(); //绘制游戏边框
void Flag(struct Tetris *); //随机产生方块类型的序号
void MakeTetris(struct Tetris *); //制作俄罗斯方块
void PrintTetris(struct Tetris *); //打印俄罗斯方块
void CleanTetris(struct Tetris *); //清除俄罗斯方块的痕迹
int ifMove(struct Tetris *); //判断是否能移动,返回值为1,能移动,否则,不能移动
void Del_Fullline(struct Tetris *); //判断是否满行,并删除满行的俄罗斯方块
void Gameplay(); //开始游戏
void regulation(); //游戏规则
void explation(); //按键说明
void welcom(); //欢迎界面
void Replay(struct Tetris * tetris); //重新开始游戏
void title(); //欢迎界面上方的标题
void flower(); //欢迎界面上的字符装饰花
void close(); //关闭游戏
//设置文字颜色
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
return 0;
}
//设置屏幕光标输出位置
void gotoxy(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
//设计标题部分
void title()
{
color(15); //设置字体颜色:白色
gotoxy(28,3); //设置光标输出位置
printf("趣 味 俄 罗 斯 方 块\n");//光标输出的"趣 味 俄 罗 斯 方 块"
color(11); //设置字体颜色:蓝绿色
gotoxy(18,5); //设置光标输出位置
printf("■"); //光标输出的"■"
gotoxy(18,6); //设置光标输出位置
printf("■■"); //光标输出的"■■"
gotoxy(18,7); //设置光标输出位置
printf("■"); //光标输出的"■"
color(14);
gotoxy(26,6);
printf("■■");
gotoxy(28,7);
printf("■■");
color(10);
gotoxy(36,6);
printf("■■");
gotoxy(36,7);
printf("■■");
color(13);
gotoxy(45,5);
printf("■");
gotoxy(45,6);
printf("■");
gotoxy(45,7);
printf("■");
gotoxy(45,8);
printf("■");
color(12);
gotoxy(56,6);
printf("■");
gotoxy(52,7);
printf("■■■");
}
//字符画装饰
void flower()
{
gotoxy(66,11); //确定屏幕上要输出的位置
color(12); //设置颜色
printf("(_)"); //红花上边花瓣
gotoxy(64,12);
printf("(_)"); //红花左边花瓣
gotoxy(68,12);
printf("(_)"); //红花右边花瓣
gotoxy(66,13);
printf("(_)"); //红花下边花瓣
gotoxy(67,12); //红花花蕊
color(6);
printf("@");
gotoxy(72,10);
color(13);
printf("(_)&