我的半成品贪吃蛇有问题,求路人帮忙解决

kd1158 2016-10-21 04:16:39
大体的思路可以不用看了,就是它只能动一下就停住了,小弟实在看不出来错哪里了

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
using namespace std;

const int Array_x = 100;
const int Array_y = 50;
class Position
{
char Array[Array_x][Array_y];
int x , y;
public:
Position(int _x = 40,int _y = 20)
{
x = _x;
y = _y;
if((x <= 0 || y <= 0) || (x >= Array_x || y >= Array_y))
{
cout << "输入值或大或小,默认值为边框为20 , 祝你玩的愉快" << endl;

for(int j = 0 ; j < y ; ++j)
{
for(int i = 0 ; i < x ; ++i)
{
if(i == 0 || j == 0 || i == x-1 || j == y-1)

Array[j][i] = 'A';

else
Array[j][i] = ' ';
}
} }
else
{
for(int j = 0 ; j < y ; ++j)
{
for(int i = 0 ; i < x ; ++i)
{
if(i == 0 || j == 0 || i == x-1 || j == y-1)

Array[j][i] = 'A';

else
Array[j][i] = ' ';
}
}
}

}
void AssValue(int temp_x ,int temp_y)
{
Array[temp_x][temp_y] = 'B';
}
void AssEmpty(int temp_x , int temp_y)
{
Array[temp_x][temp_y] = ' ';
}
char get_Array(int _x , int _y)
{
return Array[_x][_y];
}
int get_x()
{
return x;
}
int get_y()
{
return y;
}
void Print()
{
for(int i = 0 ; i < y ; ++i)
{
for(int j = 0 ; j < x ; ++j)
cout << Array[i][j];
cout << endl;
}
}
};

struct Node
{
int x;
int y;
Node *next;
};

class Pointer
{

Position pst;
Node *head;
public:
void Initiate(int px , int py)
{
head = new Node;
head->x = px;
head->y = py;
head->next = NULL;
pst.AssValue(px , py);
}
Position getPosition()
{
return pst;
}
void Assign_rand(int temp_x , int temp_y)
{
pst.AssValue(temp_x , temp_y);
}
void Add(int temp_x , int temp_y)
{
Node *temp = new Node;
temp->x = temp_x;
temp->y = temp_y;

temp->next = head;
pst.AssValue(temp_x , temp_y);
head = temp;

}
void Del()
{
Node* tt = head;
if(tt->next == NULL)
{
delete head;
head = NULL;
}
else
{
while(tt->next != NULL)
{
tt = tt->next;
}
}
pst.AssEmpty(tt->x , tt->y);

delete tt;
tt = NULL;

}
};

class Running
{
// Position pos;
Pointer pt;
int rx , ry;
public:
Running(int _rx = 10, int _ry = 10)
:rx(_rx) , ry(_ry){}
void Create_head()
{
pt.Initiate(rx , ry);
for(int i = 1 ; i < 3 ; ++i)
{
++rx;
pt.Add(rx , ry);
}
}
void Create_ege()
{
int sign = 1;
int r_x , r_y;
srand((unsigned)time(0));
while(sign)
{
r_x = rand()%(pt.getPosition().get_x());
r_y = rand()%(pt.getPosition().get_y());
if(' ' == pt.getPosition().get_Array(r_x , r_y))
sign = 0;
}
pt.Assign_rand(r_x , r_y);
}
void Display()
{
pt.getPosition().Print();
}
void game_over()
{
int temp_rx = pt.getPosition().get_x() - 1;
int temp_ry = pt.getPosition().get_y() - 1;
if(rx == 0 || rx == temp_rx || ry == 0 || ry == temp_ry)
return;
}
void Judge(char ch)
{
switch(ch)
{
case 'w':
++ry;pt.Add(rx , ry);break;
case 's':
--ry;pt.Add(rx , ry);break;
case 'a':
--rx;pt.Add(rx , ry);break;
case 'd':
++rx;pt.Add(rx , ry);break;
}
}
void Run() //问题就在这里
{
char ch = 'w';
// int sign = 1;
pt.getPosition().Print();
while(1)
{
Judge(ch);
pt.Del();
Sleep(1000);
system("cls");
pt.getPosition().Print();
}

}
int get_rx()
{
return rx;
}
int get_ry()
{
return ry;
}

};

int main()
{
Running rn;
rn.Create_head();
rn.Create_ege();
rn.Run(); //这是运行的代码,主要的问题就在这个函数中
return 0;
}
...全文
222 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-23
  • 打赏
  • 举报
回复
培养自己的好奇心和意志力,改掉自己懒得动手的毛病。 或者趁早改行。
kd1158 2016-10-23
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
请问牛x老师一件事件,为什么我有时候编程遇到问题的时候(这种问题感觉自己可以改正但是找起来麻烦)就不想找下去了,这是什么原因。如果是您出现了,你会怎么解决?
  • 打赏
  • 举报
回复
可以尝试用这种 1、调试->附加到进程 2、调试->全部中断 3、然后看运行到哪个位置,检查是否出现死循环
paschen 版主 2016-10-21
  • 打赏
  • 举报
回复
Del函数中tt = tt->next; 之后会让tt 指向了已经delete的内存 具体建议楼主单步跟踪程序运行,以观察分析原因
赵4老师 2016-10-21
  • 打赏
  • 举报
回复
小灸舞 2016-10-21
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
super_admi 2016-10-21
  • 打赏
  • 举报
回复
好长啊,我也希望有这么长。
赵4老师 2016-10-21
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧