case 6 % 炮 if ~(x==oldx && y~=oldy) && ~(x~=oldx && y==oldy) flag = 0; return end % no chess in the way if x==oldx inc = 1; if oldy>y inc = -1; end if pos_chess(y+1,x+1)~=0 if ~(length(find(pos_chess(oldy+1+inc:inc:y+1-inc,x+1)~=0))==1) flag = 0; return end else if ~(isempty(find(pos_chess(oldy+1+inc:inc:y+1-inc,x+1)~=0, 1))) flag = 0; return end end else inc = 1; if oldx>x inc = -1; end if pos_chess(y+1,x+1)~=0 if ~(length(find(pos_chess(y+1,oldx+1+inc:inc:x+1-inc)~=0))==1) flag = 0; return end else if ~(isempty(find(pos_chess(y+1,oldx+1+inc:inc:x+1-inc)~=0, 1))) flag = 0; return end end end
时间: 2024-02-10 09:34:06 浏览: 78
这段代码是实现象棋中“炮”的移动规则的判断,判断是否符合规则。如果当前位置和目标位置不在同一行或同一列,则不符合规则,返回 0。如果中间有其他棋子挡住,则不符合规则,返回 0。如果炮在起点,则目标位置必须没有棋子,否则不符合规则,返回 0。如果炮不在起点,则目标位置必须有且仅有一个棋子,否则不符合规则,返回 0。如果符合规则,则返回 1。
相关问题
function flag = CanMove(x,y) flag = 1; oldx = chess_x(cur_turn,cur_cid); oldy = chess_y(cur_turn,cur_cid); switch chess_type(cur_cid) case 1 % 将 % move 1 step if ~(x==oldx && abs(y-oldy)==1) && ~(y==oldy && abs(x-oldx)==1) flag = 0; return end % out area if cur_turn==1 if ~(x>=0 && x<=2 && y>=3 && y<=5) flag = 0; return end else if ~(x>=7 && x<=9 && y>=3 && y<=5) flag = 0; return end end
这个函数是用来判断当前选中的棋子能否移动到(x,y)位置。首先将当前选中棋子的原来位置存放在oldx和oldy中,然后根据当前选中棋子的类型判断能否移动到(x,y)位置。例如,如果当前选中的棋子是将,那么将只能向前、向后、向左或向右移动一步,并且必须在九宫格内移动。如果不能移动到(x,y)位置,则将标志位flag设为0,表示不能移动到该位置。
GLfloat initX = 0, initY = 0; GLfloat oldx = 0, oldy = 0; int times = 0; bool gDrawline = false; void drawkoch(GLfloat dir, GLfloat len, GLint iter) { GLdouble dirRad = dir * 3.1415926 / 180.f; GLfloat newX = oldx + len * cos(dirRad); GLfloat newY = oldy + len * sin(dirRad); if (iter == 0) { glVertex2f(oldx, oldy); glVertex2f(newX, newY); oldx = newX; oldy = newY; } else { iter--; len = len / 3; drawkoch(dir, len, iter); dir += 60; drawkoch(dir, len, iter); dir -= 120; drawkoch(dir, len, iter); dir += 60; drawkoch(dir, len, iter); } } typedef GLfloat point2d[2]; int iter = 0; float snowAngle = 0; point2d p = { 960, 20 }; point2d anyline[2]; point2d pp; void CMFCGLSetupView::OnDraw(CDC* pDC) { CMFCGLSetupDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: add draw code for native data here wglMakeCurrent(pDC->m_hDC, m_hRC); oldx = initX; oldy = initY; glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, Cx, 0, Cy, -1000, 1000); switch (drawMode) { case 0: glTranslatef(400, 450, 0); glBegin(GL_LINES); glColor3f(0.0, 1.0, 0.0); drawkoch(0, 500, iter); glEnd(); break; case 1: glTranslatef(400, 450, 0); glPushMatrix(); glTranslated(250, -125 * sqrt(3), 0); glRotated(snowAngle, 0, 1, 0); glTranslated(-250, 125 * sqrt(3), 0); glBegin(GL_LINES); glColor3f(0.0, 1.0, 0.0); drawkoch(0, 500, iter); drawkoch(-120, 500, iter); drawkoch(-240, 500, iter); glEnd(); glPopMatrix(); break; case 2: if (gDrawline) { oldx = anyline[0][0]; oldy = anyline[0][1]; point2d v; v[0] = (anyline[1][0] - anyline[0][0]); v[1] = (anyline[1][1] - anyline[0][1]); float len = sqrt(v[0] * v[0] + v[1] * v[1]); v[0] /= len; v[1] /= len; point2d n = { 1, 0 }; float cosTheta = v[0] * n[0] + v[1] * n[1]; float angle = acos(cosTheta) * 180.f / PI; if (anyline[1][1] < anyline[0][1]) { angle = -angle; } glBegin(GL_LINES); drawkoch(angle, len, iter); glEnd(); } break; default: break; } glBegin(GL_POINTS); glVertex2f(pp[0], pp[1]); glEnd(); glFlush(); wglMakeCurrent(pDC->m_hDC, NULL); }
这段代码是使用OpenGL库绘制Koch曲线的实现。具体来说,这段代码定义了一个名为`drawkoch`的函数,该函数使用递归的方式绘制Koch曲线。在`OnDraw`函数中,根据不同的`drawMode`变量值,选择不同的绘制模式来绘制Koch曲线:
- 当`drawMode`为0时,绘制一个普通的Koch曲线;
- 当`drawMode`为1时,绘制一个Koch雪花;
- 当`drawMode`为2时,绘制用户自定义的线段。
其中,绘制Koch曲线和Koch雪花的实现方式相同,都是调用`drawkoch`函数来进行递归绘制。而绘制用户自定义线段的方式则需要先计算出线段的长度和方向,然后调用`drawkoch`函数来进行绘制。
此外,代码中还定义了一些全局变量,如`initX`、`initY`、`oldx`、`oldy`等,用于记录绘制Koch曲线时的初始点和当前绘制点的坐标。还有一些辅助函数,如计算角度和距离的函数等。
阅读全文