基于VC++6.0开发俄罗斯方块(五)

开始游戏

一.开始游戏模块概述

在这里插入图片描述

二.显示俄罗斯方块

注意:开始游戏之后,俄罗斯方块会显示在游戏窗口和右侧的方块预览界面上,这两部分是有联系的,在方块的预览界面上出现的方块类型,就是在游戏窗口下一个会出现的方块类型

/**
 * 开始游戏
 */
void Gameplay()
{
	int n;
 	struct Tetris t,*tetris=&t;       				//定义结构体的指针并指向结构体变量
 	char ch;         									//定义接收键盘输入的变量
 	tetris->number=0;      							//初始化俄罗斯方块数为0个
 	tetris->speed=300;      							//初始移动速度为300ms
	tetris->score=0;      								//初始游戏的分数为0分
 	tetris->level=1;      								//初始游戏为第1关
 	while(1)											//循环产生方块,直至游戏结束
 	{
  		Flag(tetris);     								//得到产生俄罗斯方块类型的序号
  		Temp=tetris->flag;     						//记住当前俄罗斯方块序号
  		tetris->x=FrameX+2*Frame_width+6;			//获得预览界面方块的x坐标
  		tetris->y=FrameY+10;                         	//获得预览界面方块的y坐标
  		tetris->flag = tetris->next;                 //获得下一个俄罗斯方块的序号
  		PrintTetris(tetris);                          //调用打印俄罗斯方块方法
  		tetris->x=FrameX+Frame_width;  				//获得游戏窗口中心方块x坐标
  		tetris->y=FrameY-1;     						//获得游戏窗口中心方块y坐标
  		tetris->flag=Temp;  

三.实现各种按键操作:

游戏中俄罗斯方块的左右移动,变形等都需要通过敲击键盘按键来实现,在本程序之中用kbhit函数和getch函数来接收键盘按键。
(1)通过kbhit 函数来检测当前是否有键盘按键输入,如果有就返回对应按键值,否侧返回0
在这里插入图片描述
(2)getch函数用来从控制台读取一个字符
在这里插入图片描述
注意:ch=getch()用于实现按键之后,把该键字符对应的ASCII码赋给ch,然后ch的值分别和键盘字符的ASCII码值进行对比。

重点介绍ASCII码

ASCII码是基于拉丁字母的一套计算机编码,可以用来表示所有的大写和小写字母,数字0~9,标点符号,以及在美式英语中使用的特殊控制字符。

在这里插入图片描述

ASCII字符10进制对应表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以看到还有很多字符和键盘按键的ASCII码在表之中并未显示出来,我们可以用代码来获取特们的ASCII码。
在这里插入图片描述
这段代码用于获取键盘按键的ASCII码,注意积累
通过这段代码我们知道了上箭头对应72,下箭头对应80,左箭头对应75,右箭头对应77.

 //按键操作
  		while(1)  									//控制方块方向,直至方块不再下移
  		{
   			label:PrintTetris(tetris);			//打印俄罗斯方块
   			Sleep(tetris->speed);   			//延缓时间
   			CleanTetris(tetris);  					//清除痕迹
   			Temp1=tetris->x;    					//记住中心方块横坐标的值
   			Temp2=tetris->flag;    				//记住当前俄罗斯方块序号
   			if(kbhit())       				  	 	//判断是否有键盘输入,有则用ch↓接收
   			{
    			ch=getch();
    			if(ch==75)     						//按 ←键则向左动,中心横坐标减2
    			{
     				tetris->x-=2;
    			}
    			if(ch==77)     						//按 →键则向右动,中心横坐标加2
    			{
     				tetris->x+=2;
    			}
    			if(ch==80)     						//按 ↓键则加速下落
    			{
					if(ifMove(tetris)!=0)
					{
						tetris->y+=2;
					}
					if(ifMove(tetris)==0)
						{
							tetris->y=FrameY+Frame_height-2;
    					}
    			}
    			if(ch==72)     						//按 ↑键则变体,即当前方块顺时针转90度
    			{
    	 			if( tetris->flag>=2 && tetris->flag<=3 )	//如果是直线方块
     				{
      					tetris->flag++;
      					tetris->flag%=2;
      					tetris->flag+=2;
     				}
     				if( tetris->flag>=4 && tetris->flag<=7 )	//如果是T字方块
     				{
      					tetris->flag++;
      					tetris->flag%=4;
      					tetris->flag+=4;
     				}
     				if( tetris->flag>=8 && tetris->flag<=11 )	//如果是Z字方块
     				{
      					tetris->flag++;
      					tetris->flag%=4;
      					tetris->flag+=8;
     				}
     				if( tetris->flag>=12 && tetris->flag<=15 )	//如果是7字方块
     				{
      					tetris->flag++;
      					tetris->flag%=4;
      					tetris->flag+=12;
     				}
     				if( tetris->flag>=16 && tetris->flag<=19 )	//如果是反7字方块
     				{
      					tetris->flag++;
      					tetris->flag%=4;
      					tetris->flag+=16;
     				}
    			}
    			if(ch == 32)     					//按空格键,暂停
    			{
     				PrintTetris(tetris);
     				while(1)
     				{
      					if(kbhit())   			//再按空格键,继续游戏
      					{
       						ch=getch();
       						if(ch == 32)
       						{
        						goto label;
       						}
      					}
     				}
    			}
				if(ch == 27)
				{
					system("cls");
					memset(a,0,6400*sizeof(int));       	//初始化a数组
					welcom();
				}
    			if(ifMove(tetris)==0) 					//如果不可动,上面操作无效
    			{
    				tetris->x=Temp1;
     				tetris->flag=Temp2;
    			}
    			else      									//如果可动,执行操作
    			{
     				goto label;
    			}
   			}
   			tetris->y++;     								//如果没有操作指令,方块向下移动
   			if(ifMove(tetris)==0)  						//如果向下移动且不可动,方块放在此处
   			{
    			tetris->y--;
    			PrintTetris(tetris);
    			Del_Fullline(tetris);
    			break;
   			}
  		}
上述代码之中还出现了goto无条件跳转语句这点很重要!注意积累

在这里插入图片描述

四.游戏结束界面:

当方块达到屏幕顶端的时候,需要弹出游戏结束画面,在此界面上需要有选择,可以选择重新游戏,也可以直接退出。

在这里插入图片描述

//游戏结束条件:方块触到框顶位置
for(i=tetris->y-2;i<tetris->y+2;i++)	
  		{
  			if(i==FrameY)
   			{
   				system("cls");	//清屏
                gotoxy(29,7);			//设置显示位置
                printf("   \n");
				color(12);	//红色
				printf("\t\t\t■■■■	■	   ■    ■■     \n");
                printf("\t\t\t■			■■    ■    ■  ■   \n");
                printf("\t\t\t■■■	■  ■  ■    ■   ■  \n");
				printf("\t\t\t■			■   ■ ■    ■  ■   \n");
				printf("\t\t\t■■■■	■      ■    ■■     \n");
				gotoxy(17,18);
				color(14);
				printf("我要重新玩一局-------1");
				gotoxy(44,18);
				printf("不玩了,退出吧-------2\n");
				int n;
				gotoxy(32,20);
				printf("选择【1/2】:");
				color(11);
				scanf("%d", &n);	//输入1或2
    			switch (n)			//分支语句
    			{
    				case 1:
        				system("cls");
        				Replay(tetris);       	//重新开始游戏
        				break;
    				case 2:
        				exit(0);
        				break;
    			}
   			}
  		}
  		tetris->flag = tetris->next;  			//清除下一个俄罗斯方块的图形(右边窗口)
  		tetris->x=FrameX+2*Frame_width+6;
  		tetris->y=FrameY+10;
  		CleanTetris(tetris);
 	}
}

五.重新游戏

/**
 * 重新开始游戏
 */
void Replay(struct Tetris *tetris)
{
	system("cls");                  //清屏
	memset(a,0,6400*sizeof(int)); //初始化a数组,否则不会正常显示方块,导致游戏直接结束
	DrwaGameframe();       			//制作游戏窗口
	Gameplay(); 						//开始游戏
}

六.游戏按键说明模块:

在游戏欢迎界面输入2就可以进入游戏按键说明模块,并且显示了游戏中用到的全部按键及其功能

在这里插入图片描述

6.1按键说明界面的实现

包括两部分:首先是绘制边框,其次是显示中间的文字说明

/**
 * 按键说明
 */
void explation()
{
	int i,j = 1;
    system("cls");			//清屏
    color(13);				//粉色
    gotoxy(32,3);			//设置显示位置
    printf("按键说明");
    color(2);
    for (i = 6; i <= 16; i++)   			//输出上下边框===
	{
		for (j = 15; j <= 60; j++)  	//输出左右边框||
		{
			gotoxy(j, i);
			if (i == 6 || i == 16) printf("=");
			else if (j == 15 || j == 59) printf("||");
		}
	}
    color(3);
    gotoxy(18,7);
    printf("tip1: 玩家可以通过 ← →方向键来移动方块");
    color(10);
    gotoxy(18,9);
    printf("tip2: 通过 ↑使方块旋转");
    color(14);
    gotoxy(18,11);
    printf("tip3: 通过 ↓加速方块下落");
    color(11);
    gotoxy(18,13);
    printf("tip4: 按空格键暂停游戏,再按空格键继续");
    color(4);
    gotoxy(18,15);
    printf("tip5: 按ESC退出游戏");
    getch();                //按任意键返回主界面
    system("cls");		//清屏
    main();			//返回主函数
}

七.游戏规则介绍模块:

在游戏欢迎界面输入3即可转到游戏规则模块

在这里插入图片描述
与按键说明模块几乎是一致的,包括绘制边框和显示中间的文字内容两部分

/**
 * 游戏规则
 */
void regulation()
{
	int i,j = 1;
    system("cls");
    color(13);
    gotoxy(34,3);
    printf("游戏规则");
    color(2);
    for (i = 6; i <= 18; i++)   			//输出上下边框===
	{
		for (j = 12; j <= 70; j++)  	//输出左右边框||
		{
			gotoxy(j, i);
			if (i == 6 || i == 18) printf("=");
			else if (j == 12 || j == 69) printf("||");
		}
	}
    color(12);
    gotoxy(16,7);
    printf("tip1: 不同形状的小方块从屏幕上方落下,玩家通过调整");
    gotoxy(22,9);
    printf("方块的位置和方向,使他们在屏幕底部拼出完整的");
    gotoxy(22,11);
    printf("一行或几行");
    color(14);
    gotoxy(16,13);
    printf("tip2: 每消除一行,积分增加100");
    color(11);
    gotoxy(16,15);
    printf("tip3: 每累计1000分,会提升一个等级");
    color(10);
    gotoxy(16,17);
    printf("tip4: 提升等级会使方块下落速度加快,游戏难度加大");
	getch();                //按任意键返回主界面
	system("cls");
	welcom();
}

八.游戏规则介绍模块:

在游戏欢迎界面输入4,即可退出游戏。

/**
*  退出
*/
void close()
{
   exit(0);
}

本章总结

本章通过一个完整的游戏程序开发,帮助用户逐步了解了程序的输入/输出,循环控制,熟悉了函数的声明,定义和调用,掌握了开发应用程序的基本思路和技巧,是一次全方位的学习体验;
1)严谨的工程明明规范和代码书写规范;
2)学会开发项目程序所必需的选择结构和循环控制;
3)掌握常用方法的定义和所在文件包,以及灵活使用他们的技巧;
4)提升解决编程之中常见错误的能力;

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是VC++6.0版本的俄罗斯方块代码的一部分: ```c++ #include <stdio.h> #include <conio.h> #include <windows.h> /*******定义全局变量*******/ int i,j,Temp,Temp1,Temp2; //temp,temp1,temp2用于记住和转换方块变量的值 //标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案 int a\[80\]\[80\]={0}; int b\[4\]; //标记4个"口"方块:1表示有方块,0表示无方块 struct Tetris //声明俄罗斯方块的结构体 { int x; //中心方块的x轴坐标 int y; //中心方块的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 main() { welcom(); //欢迎界面 return 0; } ``` 这段代码是VC++6.0版本的俄罗斯方块游戏的一部分,包括了全局变量的定义和一些函数的声明。你可以根据需要继续完善和实现其他函数来完成整个游戏的功能。 #### 引用[.reference_title] - *1* *3* [基于VC++6.0开发俄罗斯方块(一)](https://blog.csdn.net/weixin_44566643/article/details/96365759)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于VC++6.0开发俄罗斯方块(三)](https://blog.csdn.net/weixin_44566643/article/details/96422094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值