实验项目一 俄罗斯方块游戏

[知识支撑点] 

  1. 基本的控制台输入、输出。
  2. 函数的声明、定义和调用。
  3. switch选择结构。
  4. goto无条件跳转语句的使用。
  5. 控制台字体和颜色的设置。
  6. 控制台上文字显示位置的设置。
  7. 随机数rand()函数的使用。
  8. 获取键盘按键并进行相应操作。

[实践目的] 

(1)培养学生综合运用所学的知识,通过上机实践,提高分析和解决问题的能力。

(2)通过实践训练,提高学生在理论计算、结构设计、查阅设计资料、运用标准与规范编程能力。

[实验能力目标] 

(1)能准确理解题目的内涵,对问题的分析、功能划分以及数据组织的能力。

(2)采用合适的解决方法,对问题进行分解,逐步求精。

(3)程序实现能力,能将问题分析,采用合适的数据表述、算法设计和程序调试,完成相应的程序设计。

[预习要求] 

(1)开发工具Dev C++的安装,熟悉工具界面和基本功能的使用。

(2)回顾C语言基础,包括二维数组、结构体、指针、宏定义、变量、逻辑运算符、“==”与“=”等。

(3)回顾程序运行结构:循环结果(for循环、while循环)、分支结构(if……else分支语句)。

(4)回顾函数使用:printf()、scanf()、system()函数。

[项目实践目标要求]

俄罗斯方块游戏是一款老少皆宜的经典益智类游戏。该游戏堆砌各种形状的方块,满行即消除该行,当方块堆积到屏幕最上方时游戏结束。

该项目实践的目标要求如下:

  1. 实现友好的游戏界面,字体和颜色显示清晰,界面排版美观。
  2. 实现游戏的业务规则:

[键盘按键规则]

  1. 通过键盘上的←和→箭头来控制左右移动的方向。
  2. 通过键盘上↑是方块变形。
  3. 通过键盘上↓加速方块落下。
  4. 通过键盘上空格键暂停游戏,再按空格键继续游戏。
  5. 通过键盘上ESC退出游戏。

[业务规则]

  1. 不同形状的小方块从屏幕上方落下,玩家通过调整方块的位置和方向,使他们在屏幕底部拼出完整的一条或几条。
  2. 每消除一行,积分张100.
  3. 每累计1000分,会提升一个等级。
  4. 提升等级会使方块下落速度加快,游戏难度加大。
  5. 代码编写规范。
  6. 游戏测试顺畅。
#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("(_)&
  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Knuuy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值