2 weixin 36153180 weixin_36153180 于 2016.09.16 17:21 提问

俄罗斯方块C++程序,遇到死循环的情况,求助

#ifndef RB_H

#define RB_H

//长条形
const int A1=1;
const int A1_1=8;
//田字
const int A2=2;
//z字
const int A3=3;
const int A3_1=9;
//反z字
const int A4=4;
const int A4_1=10;
//T字
const int A5=5;
const int A5_1=11;
const int A5_2=12;
const int A5_3=13;
//L形
const int A6=6;
const int A6_1=14;
const int A6_2=15;
const int A6_3=16;
const int A6_4=17;
//反L形
const int A7=7;
const int A7_1=18;
const int A7_2=19;
const int A7_3=20;
const int A7_4=21;

class RB
{
private:
int score;
int level;
int ID;
int hotPointx;
int hotPointy;
int top;
public:
RB()
{
score=0;
level=1;
top=30;

}

// void GetHotPoint();
void DrawMap();
void DrawBlock(int x,int y,int id);
void DeleteBlock(int x,int y,int id);
int Rotate(int id);
int Judge(int x,int y,int id);
void UpdateMap(int id);
void RunGame();
};

#endif

#include"RB.h"
#include
using namespace std;
#include
#include

int Block[19][8]=
{
{0,0,0,1,0,2,0,3},//一字
{-1,1,0,1,1,1,2,1},

{0,0,1,0,1,1,0,1},//田形

{0,0,0,1,1,1,1,2},//z形    
{0,1,1,1,1,0,2,0},

{0,2,0,1,1,1,1,0},//反z形
{0,0,1,0,1,1,2,1},

{0,0,1,0,2,0,1,1},//T形
{1,0,0,1,1,1,2,1},
{1,0,0,1,1,1,1,2},
{0,0,0,1,0,2,1,1},

{0,0,0,1,0,2,1,2},//L形
{0,0,0,1,1,0,2,0},
{0,0,1,0,1,1,1,2},
{2,0,0,1,1,1,2,1},

{1,0,1,1,1,2,1,2},//反L形
{0,0,0,1,1,1,2,1},
{0,0,0,1,0,2,1,0},
{0,0,1,0,2,0,2,1}

};
int height[19]={1,4,2,2,3,2,3,3,3,3,3,3,2,3,2,3,2,3,2};
int map[12][24]={0};

void setCurPos(int i, int j, int color = 1 | 2 | 4)//

{

HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出句柄

SetConsoleTextAttribute(out, color);// //设置颜色

COORD pos = {2*i, j };

SetConsoleCursorPosition(out, pos);// //设置位置

}

//旋转方块
int RB::Rotate(int ID)
{

switch(ID)
{
case 0:ID=1;break;
case 1:ID=0;break;

case 2:ID=2;break;

case 3:ID=4;break;
case 4:ID=3;break;

case 5:ID=6;break;

case 6:ID=5;break;

case 7:ID=8;break;
case 8:ID=9;break;
case 9:ID=10;break;
case 10:ID=7;break;

case 11:ID=12; break;
case 12:ID=13;break;
case 13:ID=14;break;
case 14:ID=15;break;

case 15:ID=16; break;
case 16:ID=17;break;
case 17:ID=18;break;
case 18:ID=15;break;

}
return ID;
}

//画出砖块
void RB::DrawBlock(int x,int y,int id)
{

int nx=0,ny=0;
for(int i=0;i<4;i++)
{
nx=x+Block[id][2*i];
ny=y+Block[id][2*i+1];

  setCurPos(nx+1,ny+1);
  cout<<"■";

}
}
//消除砖块
void RB::DeleteBlock(int x,int y,int id)
{
int nx=0,ny=0;
for(int i=0;i<4;i++)
{
nx=x+Block[id][2*i];
ny=y+Block[id][2*i+1];
setCurPos(nx+1,ny+1);
cout<<" ";
}
}
//画出游戏的边框
void RB::DrawMap()
{
for(int i=0;i<21;i++)
{
setCurPos(i,0);
cout<<"■";
setCurPos(i,25);
cout<<"■";
}
for(int j=1;j<25;j++)
{
setCurPos(0,j);
cout<<"■";
setCurPos(13,j);
cout<<"■";
setCurPos(20,j);
cout<<"■";
}
for( i=14;i<21;i++)
{
setCurPos(i,7);
cout<<"■";
}

}

int RB::Judge(int x,int y,int id)
{int nx=0,ny=0;
for(int i=0;i {
nx=x+Block[id][2*i];
ny=y+Block[id][1+2*i];
if(nx>0||nx0||ny return 1;
}
return 0;
}
//更新画面
void RB::UpdateMap(int id)
{
int flag=0;
int clear=0;
int nx=0;int ny=0;
// for(int i=0;i // {
// nx=hotPointx+Block[id][i*2];
// ny=hotPointy+Block[id][2*i+1];
// map[nx][ny]=1;
// }
if(hotPointy top=hotPointy;
for(int j=hotPointy;j {
flag=0;
for(int i=0;i {
if(map[i][j]==0)
flag=0;
break;
}
if(flag==1)
{
for(int k = j; k >= top; k--)
{
if (k == 0) //消除 到了最顶行

{

for (int i = 1; i < 13; i++)
{

map[i][k] = 0;

setCurPos(i,k + 1);

cout << " ";

}

}

else

{

for (int i = 0; i < 12; i++)

{

map[i][k] = map[i][k - 1];

setCurPos(i, k + 1); //因为有两条图形框边,游戏运行过程中的坐标系相对于 真正的坐标系是x、y都加 1 的

if (map[i][k] == 0) //被删除行的 上一行是空的,所以这一行也是空的

cout << " ";

else //上一行不是空的

{

int tempColor = map[i][k];

setCurPos(i + 1, k + 1, tempColor);

cout << "■";

}

}

}

}
top++; // //消除成功,最高点下降一个

clear++;

score += clear * 100;

    }
}

}
void RB::RunGame()
{

DrawMap();

int curBlock=0;
int nextBlock=0;
int Count=0;
int i=0;
char x=' ';
hotPointx=6;hotPointy=0;
curBlock=rand()%7;
nextBlock=rand()%7;
DrawBlock(hotPointx,hotPointy,curBlock);
DrawBlock(15,2,nextBlock);
Count = 10000 - 1000 * level;  
while(1)
{

    if(i>Count)
    {
        if(Judge(hotPointx,hotPointy+1,curBlock)==0)
        {
            //落到底一瞬间发生了什么
            UpdateMap(curBlock);
            DeleteBlock(15,2,nextBlock);

            curBlock=nextBlock;
            hotPointx=6;hotPointy=0;

            nextBlock=rand()%7;
            DrawBlock(hotPointx,hotPointy,curBlock);
            DrawBlock(15,2,nextBlock);
            if (Judge(hotPointx, hotPointy, curBlock) == 0)      //无法绘制当前图形  
            {  
                system("cls");  
                cout << "游戏结束!!!最终得分为:" << score << endl;  
                system("pause");  
                exit(0);  
            }
        }
        else
        {
            DeleteBlock(hotPointx,hotPointy,nextBlock);
            hotPointy++;
            DrawBlock(hotPointx,hotPointy,nextBlock);
        }
    }

    if(_kbhit())
    {
        x=_getch();
        if(x=='a'||x=='A')
        {

            if(Judge(hotPointx-1,hotPointy,curBlock))
            {
                DeleteBlock(hotPointx,hotPointy,curBlock);
                hotPointx-=1;
                DrawBlock(hotPointx,hotPointy,curBlock);
            }
        }
        else if(x=='s'||x=='S')
        {
            if(Judge(hotPointx,hotPointy+1,curBlock))
            {
                DeleteBlock(hotPointx,hotPointy,curBlock);
                hotPointy+=1;
                DrawBlock(hotPointx,hotPointy,curBlock);
            }
        }
        else if(x=='d'||x=='D')
        {
            if(Judge(hotPointx+1,hotPointy,curBlock))
            {
                DeleteBlock(hotPointx,hotPointy,curBlock);
                hotPointx+=1;
                DrawBlock(hotPointx,hotPointy,curBlock);
            }
        }
        else if(x=='w'||x=='W')
        {
            int temp = curBlock;  
            curBlock = Rotate(curBlock);  
            if (Judge(hotPointx, hotPointy, curBlock))  
            {  
                DeleteBlock(hotPointx, hotPointy, temp);  
                DrawBlock(hotPointx, hotPointy, curBlock);  
            }  
            else  
                curBlock = temp; 
        }
        while(_kbhit())
        {
            _getch();   
        }

    }
    i++;

}

}

void main()
{

RB r1;
r1.RunGame();

}

2个回答

WANGBIN890615
WANGBIN890615   2016.09.18 18:01
已采纳

代码我就不看了, 遇到死循环,一个是他的循环开始的地方,一个是终止的地方,一个是变化量,看你这情况,
肯定是变化量的地方出了问题,没达到终止条件,你可以这么测试,让变量更快的达到终止条件,如果可以证明终止条件没问题,变化量出了问题,另一个是修改变化量,测试是不是循环条件出了问题。找到问题了,自然就找到解决方案了。

weixin_36153180
weixin_36153180 多谢,我试试
接近 2 年之前 回复
u012930316
u012930316   2016.09.18 18:10

你这代码这么多...能说明下到底是哪个地方死循环了么.....

weixin_36153180
weixin_36153180 运行的时候一直在窗口中画方格,停不下来。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
功能完善的俄罗斯方块程序(C语言编写,详细注释)
本人的原创Windows入门程序,直接用C语言调用Windows API的方式编写,几乎涉及了Windows入门会碰到的所有基础问题:窗口、消息、菜单、工具栏、资源、对话框、计时器、自绘按钮、GDI位图操作、Windows目录操作、INI文件操作等等。 顺便向一位叫吴志刚的朋友表示感谢,我从你的MFC版本的俄罗斯方块中拿了图标和所有的位图资源,还仿照了你的界面布局,希望你不要责备后生,呵呵。 程序的开发环境是VC6,源代码中有详细的注释,算法也一看就明白,如果你是位初学者,拿来练练手应该会有所收获,希望能对你有所帮助。
C语言-控制台俄罗斯方块
求改进
linux下使用C语言实现俄罗斯方块游戏
实现思路: 关键点是使用闹钟信号,闹钟定时一段时间触发信号函数,在信号函数里对方块进行自动下落操作,而主线控制界面显示以及处理用户的输入。 共有两个文件 main.c 和 data.h,需要把两个文件放到同一目录下 main.c /*********************** * name: main * 功能:实现俄罗斯方块小游戏 * 编辑人:王廷云 * 编辑日期:2017...
俄罗斯方块 linux c
#include #include #include #include #include #include //#include //#include //#include //#include /*"▣" "▣" "▊" "■" */ #define NONE          "\33[m"   
小程序 俄罗斯方块
小程序 俄罗斯方块主要适合于初学C语言的人进行学习,高手就算了
C语言图形编程--俄罗斯方块制作(一)详解
效果图   用C语言实现俄罗斯方块,需要先解决下面几个问题: 1、如何用C语言绘制图形界面 EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。   包含库#include 先初始化图形窗口 initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH为窗口的宽带,WINDOW_HIGH为窗口的高度。
俄罗斯方块代码——c++实现
用codeblock实现不了,缺少库函数,windows的kpi。555 现在还么解决办法,不过代码挺好的,贴吧大神多。 2017-5-2#include<windows.h> #include<time.h> #include<stdlib.h>#define W 14 //游戏区域宽度 #define H 20 //游戏区域高度 #define W1 6 //右边状态栏宽度 #define
VC++ 6.0 C语言实现俄罗斯方块教程
今天把我之前写的大作业分享一下吧,并教你们如何实现,希望你们看了前面的教程也能自己写一个。 1.要先下载一个 graphics.h 的头文件来绘图。 2.初始化窗口:initgraph(x, y);这是先创建一个窗口的函数,以左上角为(0,0),向右为x轴,向下为y轴,其中x表示长x个单位,y表示宽y个单位。 3.关闭图像窗口:closegraph();结束时用来关闭用的。 4.按任意键继
程序设计俄罗斯方块C语言简单实现可动态修改地图,功能对战和难度,评分选择,道具
简单分模块板的俄罗斯方块,用C语言设计 功能有:难度选择,对战模式,本地排行榜 对应的设置参数可以自行修改 设置参数有下落时间、地图大小等等 纯C语言设计
VC写的双人版俄罗斯方块
以前写过C++版的俄罗斯方块,后来老师让写双人版,刚开始大家都认为是把所有的代码copy一遍就行了,但实际并不是这样,这样做并不能实现双人版。     在老师的提示下,我们写出来C++版的俄罗斯方块游戏,现在把它移植到VC下,让界面更好看些。 一.  功能需求:  1. 能进行双人模式: 这是程序的主要功能。 2. 能进行下一砖块的预测: 这也是俄罗斯方块游戏的基本功能,可以在这个基