首页 > 编程语言 >【自用14】C++俄罗斯方块-思路复盘3

【自用14】C++俄罗斯方块-思路复盘3

时间:2024-09-10 21:24:40浏览次数:13  
标签:判断 14 int 是否 C++ 移动 复盘 方块 游戏

在上篇降落函数中使用到了判断游戏是否结束的功能,因此这篇先从判断游戏是否结束开始

判断游戏是否结束

void failCheck(void){
    if(!moveable(START_X,START_Y,MOVE_DOWN,BLOCK_UP)){
        setcolor(WHITE);
        setfont(45,0,_T("隶体"));
        outtextxy(75,300,_T("GAME OVER!"));
        Sleep(1000);
        system("pause");
        closegraph();
        exit(0);
    }
}

判断游戏是否结束,最主要的判断条件是方块是否可以移动,如果方块刚产生就无法移动,则可以作为游戏结束的判断条件。如果游戏结束,则显示游戏结束的字样。

由于游戏的运行应该不断判断方块能否移动以及游戏是否结束。这里的思路是这样的,在主函数中,不断循环新方块函数,在新方块函数中调用移动函数,在移动函数中判断游戏是否结束。相当于游戏不断调用移动函数并且不断判断游戏是否结束。

如果游戏没有结束,则方块持续降落

在降落过程中要判断用户是否有键盘的输入,由于降落是持续循环的,相当于判断键盘输入也是持续循环的。

判断方块是否可以移动

//如果在指定位置可以在指定方向移动,就返回1,否则就返回0
int moveable(int x0,int y0,move_dir_t moveDir,block_dir_t blockDir){
    //计算当前方块的左上角在30*15的游戏区中的位置(第多少行,第多少列)
    int x=(y0-minY)/UNIT_SIZE;
    int y=(x0-minX)/UNIT_SIZE;
 
    int id=BlockIndex*4+blockDir;
    int ret=1;
 
    if(moveDir==MOVE_DOWN){
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                if(block[id][i][j]==1 && (x+i+1>30 || (x+i>=0 && x+i<30 && y+j>=0 && y+j<15 && visit[x+i+1][y+j]==1))){
                    ret=0;
                }
            }
        }
    }else if(moveDir==MOVE_LEFT){
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                if(block[id][i][j]==1 && (y+j==0 || (x+i>=0 && x+i<30 && y+j-1>=0 && y+j-1<15 && visit[x+i][y+j-1]==1))){
                    ret=0;
                }
            }
        }
    }else if(moveDir==NOVE_RIGHT){
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                if(block[id][i][j]==1 && (y+j+1>=15 || (y+j+1>=15 || (x+i>=0 && x+i<30 && y+i+1>=0 && y+j+1<15 && visit[x+i][y+j+1]==1)))){
                    ret=0;
                }
            }
        }
    }
    return ret;
}

首先找到需要判断的方块的位置,判断这个位置在指定方向上的下一个位置是否越界,如果没有越界,则判断该位置在指定方向的下一个位置是否被占用。

如果位置越界或被占用,则返回不能向指定方向移动的结果。

这里我当初有个疑问:就是如果一个方块的几个格子连在一起,岂不是会判断不能移动。后面发现,假如指定方向是向右,则这个形状方块的最右边的方块是可以移动的,最右边的方块移动之后,次右边的方块也可以移动了,这样依次移动即可。

但是又有一个问题,判断方块是否可以移动的时候是按照顺序判断的,最边上的方块不一定是最先判断的,除非,这个判断的动作不断的循环,否则只判断一轮的话是无法满足移动方块的需求的。那这个判断是否是循环进行的呢?

根据前面的描述,游戏是否结束会循环判断,而是否可以移动函数在判断游戏是否结束函数中被调用,因此判断是否可以移动函数也是会被循环调用的。

这样一来,方块下落的功能就基本上完成了。只需要在移动函数的判断语句之后加上对方块坐标的修改即可。具体代码如下

void move(void){
	int x = START_X;
	int y = START_Y;
	int k = 0;
	block_dir_t  blockDir = BLOCK_UP;
	int curSpeed = speed;

	// 检测游戏是否结束
	failCheck();

	// 持续向下降落
	while (1) {
		if (_kbhit()) {
			int key = _getch();
			if (key == KEY_SPACE) {
				_getch();
			}
		}

		// 清除当前方块
		clearBlock(x, k, blockDir);

		if (_kbhit()) {
			int key = _getch();

			if(key == KEY_UP) {
				
			} else if (key == KEY_DOWN) {
				
			} else if (key == KEY_LEFT) {
				
			} else if (key ==KEY_RIGHT) {
				
			}
		}

		k += 20;

		// 绘制当前方块
		drawBlock(x, y+k, BlockIndex, blockDir);

		wait(curSpeed);
		
		//k += 20;

		// 方块的“固化”处理
		
	}
}

标签:判断,14,int,是否,C++,移动,复盘,方块,游戏
From: https://blog.csdn.net/m0_57667919/article/details/142027220

相关文章

  • 【自用21.】C++-this指针
    Human::Human(intage,intsalary){ cout<<"调用自定义的构造函数"<<endl; this->age=age;//this是一个特殊的指针,指向这个对象本身 this->salary=salary; name="无名"; addr=newchar[64]; strcpy_s(addr,64,"China");}......
  • C++入门基础知识61——【关于C++继承】
    成长路上不孤单......
  • C++入门基础知识60——【关于C++ 类 & 对象】
    成长路上不孤单......
  • C++入门基础知识59——【关于C++数据结构】
    成长路上不孤单......
  • C++ 中的左值引用和右值引用
    1、前言概念左值引用一直有这个概念。C++11中才出现了右值引用的概念。注意本文只讨论左值引用和右值引用,但需要提前了解一下左值和右值。//以下的a、p、*p、b都是左值inta=3;int*p=&a;*p;constintb=2;doublex=1.3,y=3.8;......
  • Chapter 14 计算机网络基本概述
    欢迎大家订阅【Vue2+Vue3】入门到实践专栏,开启你的Vue学习之旅!文章目录前言一、网络的基本概念二、集线器、交换机和路由器三、互连网与互联网四、网络的类型五、互连网的组成1.边缘部分2.核心部分六、网络协议前言计算机网络是现代信息社会的基础,本章详细......
  • Java基础14
    Annotation注解理解:是从jdk5.0开始引入,,以“@注解名”在代码中存在>Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。  还可以添加一些参数值,这些信息被保存在Annotation的"name=value"对中。>注解可以在类编译、运......
  • P1486
    偷懒的新方法#include<cstdio>#include<iostream>#include<ext/pb_ds/assoc_container.hpp>#include<ext/pb_ds/tree_policy.hpp>usingnamespace__gnu_pbds;usingnamespacestd;structnode{intv,id;node(inta,intb){......
  • 判断数正负C++
    给定一个整数N,判断其正负。如果N>0,输出positive;如果N=0,输出zero;如果N<0,输出negative。输入输入一个整数N(−109≤N≤109)N(−10​9​​≤N≤10​9​​)输出如果N>0,输出positive;如果N=0,输出zero;如果N<0,输出negative。样例输入1        1样例输......
  • C++:使自定义类支持迭代器
    概述在C++中,链表迭代器是一种用来遍历链表(如std::list)元素的工具。链表是一种数据结构,其中每个元素(节点)包含一个数据值和一个指向下一个节点的指针。链表迭代器允许以类似于数组的方式访问链表中的元素,但不需要直接操作指针。链表迭代器的作用访问元素:链表迭代器使你能够......