中国象棋Delphi版本程序代码

合集下载

Pythonpygame实现中国象棋单机版源码

Pythonpygame实现中国象棋单机版源码

Pythonpygame实现中国象棋单机版源码Python中国象棋单机版⿏标点击操作;两天制作,较为粗糙,很多效果还未实现。

# -*- coding: utf-8 -*-"""Created on Sun Jun 13 15:41:56 2021@author: Administrator"""import pygamefrom pygame.locals import *import sysimport mathpygame.init()screen=pygame.display.set_mode((450,550))pygame.display.set_caption('中国象棋')img_board=pygame.image.load('F:/images/中国象棋/board.png')img_redSoldier=pygame.image.load('F:/images/中国象棋/chess_redSoldier.png')img_redCannon=pygame.image.load('F:/images/中国象棋/chess_redCannon.png')img_redCar=pygame.image.load('F:/images/中国象棋/chess_redCar.png')img_redHorse=pygame.image.load('F:/images/中国象棋/chess_redHorse.png')img_redElephant=pygame.image.load('F:/images/中国象棋/chess_redElephant.png')img_redAttendant=pygame.image.load('F:/images/中国象棋/chess_redAttendant.png')img_chief=pygame.image.load('F:/images/中国象棋/chess_chief.png')img_blackSoldier=pygame.image.load('F:/images/中国象棋/chess_blackSoldier.png')img_blackCannon=pygame.image.load('F:/images/中国象棋/chess_blackCannon.png')img_blackCar=pygame.image.load('F:/images/中国象棋/chess_blackCar.png')img_blackHorse=pygame.image.load('F:/images/中国象棋/chess_blackHorse.png')img_blackElephant=pygame.image.load('F:/images/中国象棋/chess_blackElephant.png')img_blackAttendant=pygame.image.load('F:/images/中国象棋/chess_blackAttendant.png')img_general=pygame.image.load('F:/images/中国象棋/chess_general.png')screen.blit(img_board,(0,0))pygame.display.update()red_chess=[[0,6],[2,6],[4,6],[6,6],[8,6],[1,7],[7,7],[0,9],[1,9],[2,9],[3,9],[4,9],[5,9],[6,9],[7,9],[8,9]]black_chess=[[0,3],[2,3],[4,3],[6,3],[8,3],[1,2],[7,2],[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0]]#画棋⼦def draw_chess():for i in range(len(red_chess)):if 0<=i<=4:screen.blit(img_redSoldier,(red_chess[i][0]*50,red_chess[i][1]*50))elif 5<=i<=6:screen.blit(img_redCannon,(red_chess[i][0]*50,red_chess[i][1]*50))elif i==7 or i==15:screen.blit(img_redCar,(red_chess[i][0]*50,red_chess[i][1]*50))elif i==8 or i==14:screen.blit(img_redHorse,(red_chess[i][0]*50,red_chess[i][1]*50))elif i==9 or i==13:screen.blit(img_redElephant,(red_chess[i][0]*50,red_chess[i][1]*50))elif i==10 or i==12:screen.blit(img_redAttendant,(red_chess[i][0]*50,red_chess[i][1]*50))else:screen.blit(img_chief,(red_chess[i][0]*50,red_chess[i][1]*50))for i in range(len(black_chess)):if 0<=i<=4:screen.blit(img_blackSoldier,(black_chess[i][0]*50,black_chess[i][1]*50))elif 5<=i<=6:screen.blit(img_blackCannon,(black_chess[i][0]*50,black_chess[i][1]*50))elif i==7 or i==15:screen.blit(img_blackCar,(black_chess[i][0]*50,black_chess[i][1]*50))elif i==8 or i==14:screen.blit(img_blackHorse,(black_chess[i][0]*50,black_chess[i][1]*50))elif i==9 or i==13:screen.blit(img_blackElephant,(black_chess[i][0]*50,black_chess[i][1]*50))elif i==10 or i==12:screen.blit(img_blackAttendant,(black_chess[i][0]*50,black_chess[i][1]*50))else:screen.blit(img_general,(black_chess[i][0]*50,black_chess[i][1]*50))pygame.display.update()#返回1表⽰正常移动,返回2表⽰有⼦被吃,返回0表⽰拒绝移动#兵移动规则,红兵chess1为red_chess,chess2为black_chessdef soldier_rule(chess1,chess2,current_pos,next_pos):if chess1==red_chess:pos,index=[5,6],1elif chess1==black_chess:pos,index=[3,4],-1if current_pos[1] in pos:if current_pos[0]==next_pos[0] and current_pos[1]==next_pos[1]+index and next_pos not in chess1: for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]current_pos=next_posreturn [current_pos,1]else:if current_pos[0]==next_pos[0] and current_pos[1]==next_pos[1]+index and next_pos not in chess1: for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]current_pos=next_posreturn [current_pos,1]elif current_pos[1]==next_pos[1] and current_pos[0]+1==next_pos[0] and next_pos not in chess1: for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]current_pos=next_posreturn [current_pos,1]elif current_pos[1]==next_pos[1] and current_pos[0]-1==next_pos[0] and next_pos not in chess1: for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]current_pos=next_posreturn [current_pos,1]#车移动规则,红车前两个参数为red_chess、black_chess,⿊车前两个参数为black_chess、red_chess def car_rule(chess1,chess2,current_pos,next_pos):if next_pos not in chess1 and current_pos[0]==next_pos[0]:a,b=current_pos,next_posif a[1]>b[1]:a,b=b,afor i in range(a[1]+1,b[1]):if [a[0],i] in black_chess+red_chess:return 0for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]current_pos=next_posreturn [current_pos,1]elif next_pos not in chess1 and current_pos[1]==next_pos[1]:a,b=current_pos,next_posif a[0]>b[0]:a,b=b,afor i in range(a[0]+1,b[0]):if [i,a[1]] in black_chess+red_chess:return 0for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]current_pos=next_posreturn [current_pos,1]#炮移动规则def cannon_rule(chess1,chess2,current_pos,next_pos):if next_pos not in chess1 and current_pos[0]==next_pos[0]:num=0a,b=current_pos,next_posif a[1]>b[1]:a,b=b,afor i in range(a[1]+1,b[1]):if [a[0],i] in black_chess+red_chess:num+=1if num==1:for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]return 0elif num==0:current_pos=next_posreturn [current_pos,1]else:return 0elif next_pos not in chess1 and current_pos[1]==next_pos[1]:num=0a,b=current_pos,next_posif a[0]>b[0]:a,b=b,afor i in range(a[0]+1,b[0]):if [i,a[1]] in black_chess+red_chess:num+=1if num==1:for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]return 0elif num==0:current_pos=next_posreturn [current_pos,1]else:return 0#马移动规则,红马chess为black_chessdef horse_rule(chess,current_pos,next_pos):index=[[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2],[1,2],[2,1]]leg=[[1,0],[0,-1],[0,-1],[-1,0],[-1,0],[0,1],[0,1],[1,0]]if next_pos not in red_chess+black_chess:for i in range(len(index)):if current_pos[0]+index[i][0]==next_pos[0] and current_pos[1]+index[i][1]==next_pos[1]: if [current_pos[0]+leg[i][0],current_pos[1]+leg[i][1]] not in black_chess+red_chess: current_pos=next_posreturn [current_pos,1]elif next_pos in chess:for i in range(len(index)):if current_pos[0]+index[i][0]==next_pos[0] and current_pos[1]+index[i][1]==next_pos[1]: if [current_pos[0]+leg[i][0],current_pos[1]+leg[i][1]] not in black_chess+red_chess: for i in range(len(chess)):if chess[i]==next_pos:chess[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]#象移动规则,红相chess为black_chessdef elephant_rule(chess,current_pos,next_pos):index=[[2,-2],[-2,-2],[-2,2],[2,2]]leg=[[1,-1],[-1,-1],[-1,1],[1,1]]if chess==black_chess:pos=[5,7,9]elif chess==red_chess:pos=[0,2,4]if next_pos not in red_chess+black_chess and next_pos[1] in pos:for i in range(len(index)):if current_pos[0]+index[i][0]==next_pos[0] and current_pos[1]+index[i][1]==next_pos[1]: if [current_pos[0]+leg[i][0],current_pos[1]+leg[i][1]] not in black_chess+red_chess:current_pos=next_posreturn [current_pos,1]elif next_pos in chess and next_pos[1] in pos:for i in range(len(index)):if current_pos[0]+index[i][0]==next_pos[0] and current_pos[1]+index[i][1]==next_pos[1]: if [current_pos[0]+leg[i][0],current_pos[1]+leg[i][1]] not in black_chess+red_chess: for i in range(len(chess)):if chess[i]==next_pos:chess[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]#⼠移动规则def attendant_rule(chess1,chess2,current_pos,next_pos):if chess1==red_chess:pos1=[[3,9],[3,7],[5,7],[5,9]]pos2=[4,8]elif chess1==black_chess:pos1=[[3,0],[3,2],[5,2],[5,0]]pos2=[4,1]if current_pos in pos1 and next_pos==pos2 and next_pos not in chess1:if next_pos not in chess2:current_pos=next_posreturn [current_pos,1]else:for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]elif current_pos==pos2 and next_pos in pos1 and next_pos not in chess1:if next_pos not in chess2:current_pos=next_posreturn [current_pos,1]else:for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]#将帅移动规则def boss_rule(chess1,chess2,current_pos,next_pos,j_pos):if chess1==red_chess:pos=[7,8,9]elif chess1==black_chess:pos=[0,1,2]flag=0if next_pos not in chess1:if next_pos[0]==j_pos[0]:for i in range(j_pos[1]+1,next_pos[1]):if [j_pos[0],j_pos[1]+i] in black_chess+red_chess:flag=1breakif flag==0:return 0if next_pos not in chess1 and 3<=next_pos[0]<=5 and next_pos[1] in pos:if next_pos not in chess2:if current_pos[0]==next_pos[0]:if current_pos[1]+1==next_pos[1] or current_pos[1]-1==next_pos[1]:current_pos=next_posreturn [current_pos,1]elif current_pos[1]==next_pos[1]:if current_pos[0]+1==next_pos[0] or current_pos[0]-1==next_pos[0]:current_pos=next_posreturn [current_pos,1]else:if current_pos[0]==next_pos[0]:if current_pos[1]+1==next_pos[1] or current_pos[1]-1==next_pos[1]:for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]elif current_pos[1]==next_pos[1]:if current_pos[0]+1==next_pos[0] or current_pos[0]-1==next_pos[0]:for i in range(len(chess2)):if chess2[i]==next_pos:chess2[i]=[-1,-1]current_pos=next_posreturn [current_pos,2]#棋⼦移动def move(chess1,chess2,next_pos):x=0if i in range(5): #兵x=soldier_rule(chess1,chess2,chess1[i],next_pos)if x!=None and x!=0:chess1[i]=x[0]print(chess1[i])screen.blit(img_board,(0,0))draw_chess()elif i==5 or i==6: #炮x=cannon_rule(chess1,chess2,chess1[i],next_pos)if x!=None and x!=0:chess1[i]=x[0]print(chess1[i])screen.blit(img_board,(0,0))draw_chess()elif i==7 or i==15: #⾞x=car_rule(chess1,chess2,chess1[i],next_pos)if x!=None and x!=0:chess1[i]=x[0]print(chess1[i])screen.blit(img_board,(0,0))draw_chess()elif i==8 or i==14: #⾺x=horse_rule(chess2,chess1[i],next_pos)if x!=None and x!=0:chess1[i]=x[0]print(chess1[i])screen.blit(img_board,(0,0))draw_chess()elif i==9 or i==13: #相x=elephant_rule(chess2,chess1[i],next_pos)if x!=None and x!=0:chess1[i]=x[0]print(chess1[i])screen.blit(img_board,(0,0))draw_chess()elif i==10 or i==12: #仕x=attendant_rule(chess1,chess2,chess1[i],next_pos)if x!=None and x!=0:chess1[i]=x[0]print(chess1[i])screen.blit(img_board,(0,0))draw_chess()else: #帥x=boss_rule(chess1,chess2,chess1[i],next_pos,chess2[11]) if x!=None and x!=0:chess1[i]=x[0]print(chess1[i])screen.blit(img_board,(0,0))draw_chess()return xwhite=(255,255,255)black=(0,0,0)def draw_text(text,x,y,size):pygame.font.init()fontObj=pygame.font.SysFont('SimHei',size )textSurfaceObj=fontObj.render(text, True, white,black)textRectObj=textSurfaceObj.get_rect()textRectObj.center=(x,y)screen.blit(textSurfaceObj, textRectObj)pygame.display.update()#判断游戏是否结束def game_over():if red_chess[11]==[-1,-1]:draw_text('⿊⽅胜利',225,525,15)return 1elif black_chess[11]==[-1,-1]:draw_text('红⽅胜利',225,525,15)return 1if __name__=='__main__':all_pos,progress=[],[]for i in range(10):for j in range(9):all_pos.append([j,i])draw_text('红⽅先⾛',225,525,15)chess_kind=0while True:draw_chess()for event in pygame.event.get():if event.type==QUIT:pygame.quit()sys.exit()elif event.type==MOUSEBUTTONDOWN:pos=pygame.mouse.get_pos()print(pos)if chess_kind==0:chess1,chess2=red_chess,black_chesselif chess_kind==1:chess1,chess2=black_chess,red_chessfor i in range(len(chess1)):if chess1[i][0]*50<pos[0]<(chess1[i][0]+1)*50 and chess1[i][1]*50<pos[1]<(chess1[i][1]+1)*50: flag=Falsewhile True:for event in pygame.event.get():if event.type==MOUSEBUTTONDOWN:pos=pygame.mouse.get_pos()next_pos=[pos[0]//50,pos[1]//50]flag=Truebreakif flag==True:breakprogress.append(move(chess1,chess2,next_pos))if progress[-1]!=None and progress[-1]!=0:if chess_kind==0:chess_kind=1elif chess_kind==1:chess_kind=0if chess_kind==1:draw_text('轮到⿊⽅',225,525,15)elif chess_kind==0:draw_text('轮到红⽅',225,525,15)if game_over()==1:while True:for event in pygame.event.get():if event.type==QUIT:pygame.quit()sys.exit()break棋盘图⽚:棋⼦图⽚:运⾏效果:到此这篇关于Python pygame实现中国象棋单机版源码的⽂章就介绍到这了,更多相关pygame实现中国象棋内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

中国象棋python代码

中国象棋python代码

中国象棋python代码下面是一个简单的中国象棋的Python 代码示例:# 定义棋盘# 绘制棋盘def draw_board():for row in chessboard:for piece in row:print(piece, end=' ')print()# 判断是否在棋盘内def is_valid_move(x, y):return 0 <= x < 9 and 0 <= y < 10# 判断移动是否合法def is_valid_move(x1, y1, x2, y2):piece = chessboard[y1][x1]target = chessboard[y2][x2]if piece == ' ':return Falseif piece == '車' or piece == '車':if x1 != x2 and y1 != y2:return Falseif x1 == x2:min_y, max_y = (y1, y2) if y1 < y2 else (y2, y1)for y in range(min_y + 1, max_y):if chessboard[y][x1] != ' ':return Falseif y1 == y2:min_x, max_x = (x1, x2) if x1 < x2 else (x2, x1)for x in range(min_x + 1, max_x):if chessboard[y1][x] != ' ':return Falseif piece == '馬' or piece == '馬':dx = abs(x2 - x1)dy = abs(y2 - y1)if (dx == 1 and dy == 2) or (dx == 2 and dy == 1): return Truereturn Falseif piece == '象' or piece == '相':if y2 > 4 and (y2 - y1) % 2 != 0:return Falseif abs(x2 - x1) != 2 or abs(y2 - y1) != 2:return Falseif chessboard[(y1 + y2) // 2][(x1 + x2) // 2] != ' ': return Falseif piece == '士' or piece == '士':if x2 < 3 or x2 > 5:return Falseif y2 < 7 or y2 > 9:return Falseif abs(x2 - x1) != 1 or abs(y2 - y1) != 1: return Falseif piece == '帥' or piece == '将':if x2 < 3 or x2 > 5:return Falseif y2 < 0 or y2 > 2:return Falseif abs(x2 - x1) + abs(y2 - y1) != 1:return Falseif piece == '兵':if y1 < 5 and y2 != y1 - 1:return Falseif y1 >= 5 and (x1 != x2 or y2 != y1 - 1):return Falseif piece == '卒':if y1 > 4 and y2 != y1 + 1:return Falseif y1 <= 4 and (x1 != x2 or y2 != y1 + 1):return Falseif target == '帥' or target == '将':if piece == '卒' or piece == '兵':if y2 > 2:return Falseif piece == '兵' or piece == '卒':if y2 < 7:return Falsereturn True# 移动棋子def move_piece(x1, y1, x2, y2):if is_valid_move(x1, y1, x2, y2):piece = chessboard[y1][x1]chessboard[y2][x2] = piecechessboard[y1][x1] = ' 'else:print("Invalid move!")# 游戏循环def game_loop():while True:draw_board()player_input = input("请输入移动的起始位置和目标位置,以逗号分隔(例如:2,1,2,3):")positions = player_input.split(',')if len(positions) != 4:print("请输入正确的起始位置和目标位置!")continuex1, y1, x2, y2 = map(int, positions)if not is_valid_move(x1, y1) or not is_valid_move(x2, y2):print("请输入正确的起始位置和目标位置!")continuemove_piece(x1, y1, x2, y2)# 启动游戏game_loop()这是一个简单的中国象棋游戏代码示例,包括棋盘的绘制、棋子移动的判断和执行等功能。

从eclipse控制台输入的五子棋Java代码

从eclipse控制台输入的五子棋Java代码

package com.五子棋.code;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Code2 {String[][] s=new String[15][15];boolean flag=true;public void f4(){for(int i=0;i<s.length;i++){for(int j=0;j<s[i].length;j++){s[i][j]="╋";System.out.print(s[i][j]);}System.out.println();}}public boolean f1(int x,int y){if((x>=0&&x<15)&&(y>=0&&y<15)){if(s[x][y]=="☻"||s[x][y]=="○"){return false;}return true;}return false;}public void f2(int x,int y){boolean b=f1(x,y);if(b==true){f3(x,y);}else{System.out.println("输入格式不正确或重复,请重新输入");}}public void f3(int x,int y){for(int i=0;i<s.length;i++){for(int j=0;j<s[i].length;j++){if(i==x&&j==y){if(flag==true){s[x][y]="☻";flag=false;}else{s[x][y]="○";flag=true;}}System.out.print(s[i][j]);}System.out.println();}if(f5(x,y,"☻")==1){System.out.println("__________");System.out.println("黑子胜利");return;}else if(f5(x,y,"○")==1){System.out.println("白子胜利");return;}}public int f5(int x,int y,String f){int jact1=0,jact2=0;for(int i=0;i<s.length;i++){for(int j=0;j<s[i].length;j++){//判断横向五子while(s[x][y-jact1]==f&&y-jact1>=0||s[x][y+jact1]==f&&j-jact1<15) {jact1++;if(jact1==5){System.out.println("11111111111");return 1;}}//判断横向左右两边五子jact1=0;jact2=0;while((s[x][y-jact1]==f)&&(y-jact1>=0)){jact1++;while(s[x][y+jact2]==f&&(y+jact2<15)){jact2++;if(jact2==5){break;}}if(jact1+jact2==6){System.out.println("2222222222222222");return 1;}}jact1=0;jact2=0;//判断竖向五子while(s[x-jact1][y]==f&&x-jact1>=0||s[x+jact1][y]==f&&j+jact1<15){jact1++;if(jact1==5){System.out.println("3333333333333");return 1;}}//判断竖向上下五子jact1=0;jact2=0;while((s[x-jact1][y]==f)&&(x-jact1>=0)){jact1++;while(s[x+jact2][y]==f&&(x+jact2<15)){jact2++;if(jact2==5){break;}}if(jact1+jact2==6){System.out.println("4444444444444444444");return 1;}}//判断左上方五子jact1=0;jact2=0;while(s[x-jact1][y-jact1]==f&&(y-jact1>=0)&&(x-jact1>=0)){jact1++;if(jact1==5){System.out.println("55555555555555555555");return 1;}}//判断左边斜向上下五子jact1=0;jact2=0;while(s[x-jact1][y-jact1]==f&&y-jact1>=0&&y-jact1>=0){jact1++;while(s[x+jact2][y+jact2]==f&&y+jact2<15&&x-jact2<15){jact2++;if(jact2==5){break;}}if(jact1+jact2==6){System.out.println("666666666666666");return 1;}}//判断右上方五子jact1=0;jact2=0;while(s[x+jact1][y+jact1]==f&&(y-jact1<15)&&(x-jact1<15)){jact1++;if(jact1==5){System.out.println("77777777777777");return 1;}}//判断右边斜向上下五子jact1=0;jact2=0;while(s[x+jact1][y-jact1]==f&&y-jact1>=0&&x+jact1<15){jact1++;while(s[x-jact2][y+jact2]==f&&y+jact2<15&&x-jact2>=0){jact2++;if(jact2==5){break;}}if(jact1+jact2==6){System.out.println("888888888888888888888");return 1;}}}}return 0;}public static void main(String [] args){Code2 co=new Code2();co.f4();System.out.println("是否开始游戏【yes】开始");BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String str=null;try {while((str=br.readLine())!=null){if("yes".equals(str)){System.out.println("黑子先手-请输入坐标(0~15的数字,不含15)");String t1,t2;while((t1=br.readLine())!=null){System.out.println("+++++++++++++++");t2=br.readLine();int a1=Integer.parseInt(t1);int a2=Integer.parseInt(t2);co.f2(a1,a2);System.out.println("----------");}}else{System.out.println("****************");}}} catch (IOException e) {e.printStackTrace();}}}。

Excel制作五子棋vba源代码

Excel制作五子棋vba源代码

Excel制作象棋vba源代码' The algorithm of judge and urgentpoint function are exported from one VC program which I downloaded from web.' Sorry I can't remebered the program and the author name.' The original VC program have three options for different level. I simplized it to the hardest one in this VBA sample.'Dim m_Board(17, 17) As IntegerPrivate Type Cpointx As Integery As IntegerEnd TypeDim m_nType As IntegerDim iWho As IntegerPrivate Sub Excelba_Click()End SubPrivate Sub cmdStart_Click()Cells(17, 1) = "Start"Cells(17, 3) = 0 ' total number of stones'clear the boardRange(Cells(17 + 1, 1), Cells(17 + 15, 15)).Value = 0'clear all picture in this sheet except for two orginal pictureFor Each ipic In ActiveSheet.ShapesIf <> "Picture 9" And <> "Picture 10" And Left(, 7) = "Picture" Thenipic.DeleteEnd IfNext'start itIf optComputer.Value = True ThenCall drawit(8, 8, 1)Call setarray(8, 8, 1)Cells(17, 3) = 1End IfEnd SubPrivate Sub optComputer_Click()Cells(17, 1) = ""Cells(17, 2) = 2Cells(17, 3) = 0End SubPrivate Sub optYou_Click()Cells(17, 1) = ""Cells(17, 2) = 1Cells(17, 3) = 0End SubPrivate Function confArray(ix As Integer, iy As Integer) As IntegerconfArray = Cells(17 + ix, iy)End FunctionPrivate Sub setarray(ix As Integer, iy As Integer, iz As Integer)Cells(17 + ix, iy) = izEnd SubPrivate Sub drawit(ix As Integer, iy As Integer, iz As Integer)Dim strP As StringIf ix < 1 Or ix > 15 Or iy < 1 Or iy > 15 Or iz < 1 Or iz > 2 ThenMsgBox "Wrong Entry Number, please check it!", vbCritical, "Wrong Entry"EndEnd IfIf iz = 1 ThenstrP = "Picture 9"ElseIf iz = 2 ThenstrP = "Picture 10"End IfApplication.ScreenUpdating = FalseActiveSheet.Shapes(strP).SelectSelection.CopyCells(16, 4).SelectActiveSheet.Paste-(Selection.Left - Cells(ix, iy).Left) + 1-(Selection.Top - Cells(ix, iy).Top) + 1Cells(17, 4).SelectApplication.ScreenUpdating = TrueEnd SubPrivate Function UrgentPoint(ByVal iz As Integer) As StringDim i, i0, j, j0 As IntegerDim ptUrgent(2025) As CpointDim nGrade1 As IntegerDim nGrade2 As IntegerDim nUrgent1 As IntegerDim nUrgent2 As IntegerDim nUrgent As IntegerDim iEnd As IntegerDim iStep As IntegerDim jEnd As IntegerDim jStep As IntegerFor i = 0 To 2024ptUrgent(i).x = -1ptUrgent(i).y = -1Next iIf ((Rnd() * 32767) Mod 2) = 0 Theni0 = 0Elsei0 = 14End IfIf i0 = 0 TheniEnd = 14iStep = 1ElseiEnd = 0iStep = -1End IfFor i = i0 To iEnd Step iStepIf ((Rnd() * 32767) Mod 2) = 0 Thenj0 = 0Elsej0 = 14End IfIf j0 = 0 ThenjEnd = 14jStep = 1ElsejEnd = 0jStep = -1End IfFor j = j0 To jEnd Step jStepIf (m_Board(i, j) = 0) ThennGrade1 = Judge(i, j, iz)nGrade2 = Judge(i, j, iz + 1)Select Case (nGrade1)Case 0nUrgent1 = 0Case 1nUrgent1 = 2Case 2nUrgent1 = 4Case 3nUrgent1 = 5Case 4nUrgent1 = 8Case 5nUrgent1 = 10Case 6nUrgent1 = 11nUrgent1 = 12 Case 8nUrgent1 = 13 Case 9nUrgent1 = 14 Case 10nUrgent1 = 15 Case 11nUrgent1 = 16 Case 12nUrgent1 = 17 Case 13nUrgent1 = 18 Case 14nUrgent1 = 19 Case 15nUrgent1 = 20 Case 16nUrgent1 = 32 Case 17nUrgent1 = 34 Case 18nUrgent1 = 36 Case 19nUrgent1 = 38 Case 20nUrgent1 = 40 Case ElsenUrgent1 = 40 End SelectSelect Case (nGrade2)Case 0nUrgent2 = 1 Case 1nUrgent2 = 3 Case 2nUrgent2 = 6 Case 3nUrgent2 = 7 Case 4nUrgent2 = 9 Case 5nUrgent2 = 21nUrgent2 = 22Case 7nUrgent2 = 23Case 8nUrgent2 = 24Case 9nUrgent2 = 25Case 10nUrgent2 = 26Case 11nUrgent2 = 27Case 12nUrgent2 = 28Case 13nUrgent2 = 29Case 14nUrgent2 = 30Case 15nUrgent2 = 31Case 16nUrgent2 = 33Case 17nUrgent2 = 35Case 18nUrgent2 = 37Case 19nUrgent2 = 39Case 20nUrgent2 = 41Case ElsenUrgent2 = 41End SelectnUrgent = WorksheetFunction.Min(nUrgent1, nUrgent2) * 45 + WorksheetFunction.Max(nUrgent1, nUrgent2)ptUrgent(nUrgent).x = iptUrgent(nUrgent).y = jEnd IfNext jNext iFor i = 0 To 2024If ((ptUrgent(i).x <> -1) And (ptUrgent(i).y <> -1)) ThenExit ForEnd IfNext iIf (ptUrgent(i).x = -1 And ptUrgent(i).y = -1) ThenMsgBox "Make Draw"End IfUrgentPoint = ptUrgent(i).x & "|" & ptUrgent(i).yEnd FunctionPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)Dim ix As IntegerDim iy As IntegerDim iz As IntegerDim ix1 As IntegerDim iy1 As IntegerDim stmp As StringDim i As IntegerDim j As IntegerIf > 1 Or Target.Areas(1).Columns.Count > 1 Or Target.Areas(1).Rows.Count > 1 Then Exit SubEnd Ifix = Target.Areas(1).Rowiy = Target.Areas(1).Columniz = confArray(ix, iy)If ix > 15 Or iy > 15 ThenExit SubEnd IfIf iz <> 1 And iz <> 2 And Cells(17, 1) = "Start" ThenFor i = 0 To 14For j = 0 To 14m_Board(j, i) = Cells(17 + i + 1, j + 1)Next jNext iCall drawit(ix, iy, 2)Call setarray(ix, iy, 2)m_Board(iy - 1, ix - 1) = 2Call Judge(iy - 1, ix - 1, 2)Call ringIf Cells(17, 1) = "Start" Thenstmp = UrgentPoint(1)iy1 = Left(stmp, InStr(1, stmp, "|") - 1)ix1 = Mid(stmp, InStr(1, stmp, "|") + 1)Call drawit(ix1 + 1, iy1 + 1, 1)Call setarray(ix1 + 1, iy1 + 1, 1)m_Board(iy1, ix1) = 1Call Judge(iy1, ix1, 1)Call ringEnd IfEnd IfEnd SubPrivate Function Judge(ByVal nX As Integer, ByVal nY As Integer, ByVal cValue As Integer) As IntegerDim nGrade As IntegerDim i As IntegerDim j As IntegerDim k As IntegerDim l As IntegerDim nXStart As IntegerDim nXEnd As IntegerDim nYStart As IntegerDim nYEnd As IntegerDim nXYStart As IntegerDim nXYEnd As IntegerDim nYXStart As IntegerDim nYXEnd As IntegerDim nXStartAdd As IntegerDim nYStartAdd As IntegerDim nXYStartAdd As IntegerDim nYXStartAdd As IntegerDim nXEndAdd As IntegerDim nYEndAdd As IntegerDim nXYEndAdd As IntegerDim nYXEndAdd As IntegerDim bXStartEmpty As BooleanDim bXEndEmpty As BooleanDim bXStartEmpty1 As BooleanDim bXEndEmpty1 As BooleanDim bYStartEmpty As BooleanDim bYEndEmpty As BooleanDim bYStartEmpty1 As BooleanDim bYEndEmpty1 As BooleanDim bXYStartEmpty As BooleanDim bXYEndEmpty As BooleanDim bXYStartEmpty1 As BooleanDim bXYEndEmpty1 As BooleanDim bYXStartEmpty As BooleanDim bYXEndEmpty As BooleanDim bYXStartEmpty1 As BooleanDim bYXEndEmpty1 As BooleannXStart = nXnXEnd = nXnYStart = nYnYEnd = nYnXYStart = nXnXYEnd = nXnYXStart = nXnYXEnd = nXnXStartAdd = 0nYStartAdd = 0nXYStartAdd = 0nYXStartAdd = 0nXEndAdd = 0nYEndAdd = 0nXYEndAdd = 0nYXEndAdd = 0bXStartEmpty = FalsebYStartEmpty = FalsebXYStartEmpty = FalsebYXStartEmpty = FalsebXEndEmpty = FalsebYEndEmpty = FalsebXYEndEmpty = FalsebYXEndEmpty = FalsebXStartEmpty1 = FalsebYStartEmpty1 = FalsebXYStartEmpty1 = FalsebYXStartEmpty1 = FalsebXEndEmpty1 = FalsebYEndEmpty1 = FalsebXYEndEmpty1 = FalsebYXEndEmpty1 = FalseFor i = nX - 1 To 0 Step -1 ' <-If m_Board(i, nY) = cV alue ThennXStart = iElseIf m_Board(i, nY) = 0 ThenbXStartEmpty = TrueFor j = i - 1 To 0 Step -1 ' <-If m_Board(j, nY) = cValue ThennXStartAdd = i - jElseIf m_Board(j, nY) = 0 ThenbXStartEmpty1 = TrueExit ForElseExit ForEnd IfNext jExit ForElseExit ForEnd IfNext iFor i = nX + 1 To 14 ' ->If m_Board(i, nY) = cV alue ThennXEnd = iElseIf m_Board(i, nY) = 0 ThenbXEndEmpty = TrueFor j = i + 1 To 14 ' ->If m_Board(j, nY) = cValue ThennXEndAdd = j - iElseIf m_Board(j, nY) = 0 ThenbXEndEmpty1 = TrueExit ForElseExit ForEnd IfNext jExit ForElseExit ForEnd IfNext iFor i = nY - 1 To 0 Step -1 ' ^|^If m_Board(nX, i) = cV alue ThennYStart = iElseIf m_Board(nX, i) = 0 ThenbYStartEmpty = TrueFor j = i - 1 To 0 Step -1 ' <-If m_Board(nX, j) = cValue ThennYStartAdd = i - jElseIf m_Board(nX, j) = 0 ThenbYStartEmpty1 = TrueExit ForElseExit ForEnd IfNext jExit ForElseExit ForEnd IfNext iFor i = nY + 1 To 14 ' v|vIf m_Board(nX, i) = cV alue ThennYEnd = iElseIf m_Board(nX, i) = 0 ThenbYEndEmpty = TrueFor j = i + 1 To 14 ' ->If m_Board(nX, j) = cValue ThennYEndAdd = j - iElseIf m_Board(nX, j) = 0 ThenbYEndEmpty1 = TrueExit ForElseExit ForEnd IfNext jExit ForElseExit ForEnd IfNext ii = nX - 1j = nY + 1Do While i >= 0 And j < 15'j++If m_Board(i, j) = cValue ThennXYStart = iElseIf m_Board(i, j) = 0 ThenbXYStartEmpty = Truek = i - 1l = j + 1Do While k >= 0 And l < 15If m_Board(k, l) = cValue ThennXYStartAdd = i - kElseIf m_Board(k, l) = 0 ThenbXYStartEmpty1 = TrueExit DoElseExit DoEnd Ifk = k - 1l = l + 1LoopElseExit DoEnd Ifi = i - 1j = j + 1Loopi = nX + 1j = nY - 1Do While i < 15 And j >= 0'j--If m_Board(i, j) = cValue ThennXYEnd = iElseIf m_Board(i, j) = 0 ThenbXYEndEmpty = Truek = i + 1l = j - 1Do While l >= 0 And k < 15If m_Board(k, l) = cValue ThennXYEndAdd = i - kElseIf m_Board(k, l) = 0 ThenbXYEndEmpty1 = TrueExit DoElseExit DoEnd Ifk = k + 1l = l - 1LoopExit DoElseExit DoEnd Ifi = i + 1j = j - 1Loopi = nX - 1j = nY - 1Do While i >= 0 And j >= 0'j--If m_Board(i, j) = cValue ThennYXStart = iElseIf m_Board(i, j) = 0 ThenbYXStartEmpty = Truel = j - 1Do While l >= 0 And k >= 0If m_Board(k, l) = cValue ThennYXStartAdd = i - kElseIf m_Board(k, l) = 0 ThenbYXStartEmpty1 = TrueExit DoElseExit DoEnd Ifk = k - 1l = l - 1LoopExit DoElseExit DoEnd Ifi = i - 1j = j - 1Loopi = nX + 1j = nY + 1Do While i < 15 And j < 15'j--If m_Board(i, j) = cValue ThennYXEnd = iElseIf m_Board(i, j) = 0 ThenbYXEndEmpty = Truek = i - 1l = j - 1Do While l < 15 And k < 15If m_Board(k, l) = cValue ThennYXEndAdd = i - kElseIf m_Board(k, l) = 0 ThenbYXEndEmpty1 = TrueExit DoElseExit DoEnd Ifk = k + 1l = l + 1LoopExit DoElseExit DoEnd Ifi = i + 1j = j + 1LoopnXStep = nXEnd - nXStart + 1nXStep = nXEnd - nXStart + 1nYStep = nYEnd - nYStart + 1nXYStep = nXYEnd - nXYStart + 1nYXStep = nYXEnd - nYXStart + 1Dim bX_4 As BooleanDim bY_4 As BooleanDim bXY_4 As BooleanDim bYX_4 As BooleanDim bX4 As BooleanDim bY4 As BooleanDim bXY4 As BooleanDim bYX4 As BooleanbX_4 = (nXStep = 4) And (bXStartEmpty And bXEndEmpty)bY_4 = (nYStep = 4) And (bYStartEmpty And bYEndEmpty)bXY_4 = (nXYStep = 4) And (bXYStartEmpty And bXYEndEmpty) bYX_4 = (nYXStep = 4) And (bYXStartEmpty And bYXEndEmpty) bX4 = (nXStep = 4) And (bXStartEmpty Or bXEndEmpty)bY4 = (nYStep = 4) And (bYStartEmpty Or bYEndEmpty)bXY4 = (nXYStep = 4) And (bXYStartEmpty Or bXYEndEmpty) bYX4 = (nYXStep = 4) And (bYXStartEmpty Or bYXEndEmpty) Dim bX_3 As BooleanDim bY_3 As BooleanDim bXY_3 As BooleanDim bYX_3 As BooleanDim bX3 As BooleanDim bY3 As BooleanDim bXY3 As BooleanDim bYX3 As BooleanbX_3 = (nXStep = 3) And (bXStartEmpty And bXEndEmpty)bY_3 = (nYStep = 3) And (bYStartEmpty And bYEndEmpty)bXY_3 = (nXYStep = 3) And (bXYStartEmpty And bXYEndEmpty) bYX_3 = (nYXStep = 3) And (bYXStartEmpty And bYXEndEmpty) bX3 = (nXStep = 3) And (bXStartEmpty Or bXEndEmpty)bY3 = (nYStep = 3) And (bYStartEmpty Or bYEndEmpty)bXY3 = (nXYStep = 3) And (bXYStartEmpty Or bXYEndEmpty) bYX3 = (nYXStep = 3) And (bYXStartEmpty Or bYXEndEmpty) Dim bX_2 As BooleanDim bY_2 As BooleanDim bXY_2 As BooleanDim bYX_2 As BooleanDim bX2 As BooleanDim bY2 As BooleanDim bXY2 As BooleanDim bYX2 As BooleanbX_2 = (nXStep = 2) And (bXStartEmpty And bXEndEmpty)bY_2 = (nYStep = 2) And (bYStartEmpty And bYEndEmpty)bXY_2 = (nXYStep = 2) And (bXYStartEmpty And bXYEndEmpty) bYX_2 = (nYXStep = 2) And (bYXStartEmpty And bYXEndEmpty) bX2 = (nXStep = 2) And (bXStartEmpty Or bXEndEmpty)bY2 = (nYStep = 2) And (bYStartEmpty Or bYEndEmpty)bXY2 = (nXYStep = 2) And (bXYStartEmpty Or bXYEndEmpty) bYX2 = (nYXStep = 2) And (bYXStartEmpty Or bYXEndEmpty) Dim bX_1 As BooleanDim bY_1 As BooleanDim bXY_1 As BooleanDim bYX_1 As BooleanbX_1 = (nXStep = 1) And (bXStartEmpty And bXEndEmpty)bY_1 = (nYStep = 1) And (bYStartEmpty And bYEndEmpty)bXY_1 = (nXYStep = 1) And (bXYStartEmpty And bXYEndEmpty) bYX_1 = (nYXStep = 1) And (bYXStartEmpty And bYXEndEmpty) Dim nXAdd As IntegerDim nYAdd As IntegerDim nXYAdd As IntegerDim nYXAdd As IntegernXAdd = 0nYAdd = 0nXYAdd = 0nYXAdd = 0If nXEndAdd >= nXStartAdd ThennXAdd = nXEndAddbXEndEmpty = bXEndEmpty1ElsenXAdd = nXStartAddbXStartEmpty = bXStartEmpty1End IfIf (nYEndAdd >= nYStartAdd) ThennYAdd = nYEndAddbYEndEmpty = bYEndEmpty1ElsenYAdd = nYStartAddbYStartEmpty = bYStartEmpty1End IfIf (nXYEndAdd >= nXYStartAdd) ThennXYAdd = nXYEndAddbXYEndEmpty = bXYEndEmpty1ElsenXYAdd = nXYStartAddbXYStartEmpty = bXYStartEmpty1End IfIf (nYXEndAdd >= nYXStartAdd) ThennYXAdd = nYXEndAddbYXEndEmpty = bYXEndEmpty1ElsenYXAdd = nYXStartAddbYXStartEmpty = bYXStartEmpty1End IfDim b1X_4 As BooleanDim b1Y_4 As BooleanDim b1XY_4 As BooleanDim b1YX_4 As BooleanDim b1X4 As BooleanDim b1Y4 As BooleanDim b1XY4 As BooleanDim b1YX4 As Booleanb1X_4 = (nXStep + nXAdd >= 4) And (bXStartEmpty And bXEndEmpty)b1Y_4 = (nYStep + nY Add >= 4) And (bYStartEmpty And bYEndEmpty)b1XY_4 = (nXYStep + nXYAdd >= 4) And (bXYStartEmpty And bXYEndEmpty) b1YX_4 = (nYXStep + nYXAdd >= 4) And (bYXStartEmpty And bYXEndEmpty) b1X4 = (nXStep + nXAdd >= 4) And (bXStartEmpty Or bXEndEmpty)b1Y4 = (nYStep + nY Add >= 4) And (bYStartEmpty Or bYEndEmpty)b1XY4 = (nXYStep + nXY Add >= 4) And (bXYStartEmpty Or bXYEndEmpty)b1YX4 = (nYXStep + nYXAdd >= 4) And (bYXStartEmpty Or bYXEndEmpty) Dim b1X_3 As BooleanDim b1Y_3 As BooleanDim b1XY_3 As BooleanDim b1YX_3 As Booleanb1X_3 = (nXStep + nXAdd >= 3) And (bXStartEmpty And bXEndEmpty)b1Y_3 = (nYStep + nY Add >= 3) And (bYStartEmpty And bYEndEmpty)b1XY_3 = (nXYStep + nXYAdd >= 3) And (bXYStartEmpty And bXYEndEmpty) b1YX_3 = (nYXStep + nYXAdd >= 3) And (bYXStartEmpty And bYXEndEmpty) m_nType = -1'////////If (nXStep >= 5) Or (nYStep >= 5) Or (nXYStep >= 5) Or (nYXStep >= 5) Then nGrade = 0m_nType = 0ElseIf (bX_4 Or bY_4 Or bXY_4 Or bYX_4) ThennGrade = 1m_nType = 1ElseIf ((bX4 And (bY4 Or bXY4 Or bYX4 Or b1Y4 Or b1XY4 Or b1YX4)) Or _(bY4 And (bX4 Or bXY4 Or bYX4 Or b1X4 Or b1XY4 Or b1YX4)) Or _(bXY4 And (bY4 Or bX4 Or bYX4 Or b1Y4 Or b1X4 Or b1YX4)) Or _(bYX4 And (bY4 Or bXY4 Or bX4 Or b1Y4 Or b1XY4 Or b1X4)) Or _(b1X4 And (bY4 Or bXY4 Or bYX4 Or b1Y4 Or b1XY4 Or b1YX4)) Or _(b1Y4 And (bX4 Or bXY4 Or bYX4 Or b1X4 Or b1XY4 Or b1YX4)) Or _(b1XY4 And (bY4 Or bX4 Or bYX4 Or b1Y4 Or b1X4 Or bYX4)) Or _(b1YX4 And (bY4 Or bXY4 Or bX4 Or b1Y4 Or b1XY4 Or b1X4))) Then nGrade = 2m_nType = 1ElseIf ((bX4 And (bY_3 Or bXY_3 Or bYX_3 Or b1Y_3 Or b1XY_3 Or b1YX_3)) Or _ (bY4 And (bX_3 Or bXY_3 Or bYX_3 Or b1X_3 Or b1XY_3 Or b1YX_3)) Or _(bXY4 And (bY_3 Or bX_3 Or bYX_3 Or b1Y_3 Or b1X_3 Or b1YX_3)) Or _(bYX4 And (bY_3 Or bXY_3 Or bX_3 Or b1Y_3 Or b1XY_3 Or b1X_3)) Or _(b1X4 And (bY_3 Or bXY_3 Or bYX_3 Or b1Y_3 Or b1XY_3 Or b1YX_3)) Or _(b1Y4 And (bX_3 Or bXY_3 Or bYX_3 Or b1X_3 Or b1XY_3 Or b1YX_3)) Or _(b1XY4 And (bY_3 Or bX_3 Or bYX_3 Or b1Y_3 Or b1X_3 Or b1YX_3)) Or _(b1YX4 And (bY_3 Or bXY_3 Or bX_3 Or b1Y_3 Or b1XY_3 Or b1X_3))) ThennGrade = 3m_nType = 1ElseIf ((bX_3 And (bY_3 Or bXY_3 Or bYX_3 Or b1Y_3 Or b1XY_3 Or b1YX_3)) Or _ (bY_3 And (bX_3 Or bXY_3 Or bYX_3 Or b1X_3 Or b1XY_3 Or b1YX_3)) Or _(bXY_3 And (bY_3 Or bX_3 Or bYX_3 Or b1Y_3 Or b1X_3 Or b1YX_3)) Or _(bYX_3 And (bY_3 Or bXY_3 Or bX_3 Or b1Y_3 Or b1XY_3 Or b1X_3)) Or _(b1X_3 And (bY_3 Or bXY_3 Or bYX_3 Or b1Y_3 Or b1XY_3 Or b1YX_3)) Or _(b1Y_3 And (bX_3 Or bXY_3 Or bYX_3 Or b1X_3 Or b1XY_3 Or b1YX_3)) Or _(b1XY_3 And (bY_3 Or bX_3 Or bYX_3 Or b1Y_3 Or b1X_3 Or b1YX_3)) Or _(b1YX_3 And (bY_3 Or bXY_3 Or bX_3 Or b1Y_3 Or b1XY_3 Or b1X_3))) ThennGrade = 4m_nType = 2ElseIf ((bXY4 And (bYX_2 Or bY_2 Or bX_2)) Or _(bYX4 And (bXY_2 Or bY_2 Or bX_2)) Or _(bX4 And (bXY_2 Or bYX_2 Or bY_2)) Or _(bY4 And (bXY_2 Or bYX_2 Or bX_2))) ThennGrade = 5m_nType = 1ElseIf ((bXY4 And (bYX3 Or bY3 Or bX3)) Or _(bYX4 And (bXY3 Or bY3 Or bX3)) Or _(bX4 And (bXY3 Or bYX3 Or bY3)) Or _(bY4 And (bXY3 Or bYX3 Or bX3))) Then nGrade = 6m_nType = 1ElseIf ((bXY4 And (bYX_1 Or bY_1 Or bX_1)) Or _(bYX4 And (bXY_1 Or bY_1 Or bX_1)) Or _(bX4 And (bXY_1 Or bYX_1 Or bY_1)) Or _(bY4 And (bXY_1 Or bYX_1 Or bX_1))) Then nGrade = 7m_nType = 2ElseIf ((bXY4 And (bYX2 Or bY2 Or bX2)) Or _(bYX4 And (bXY2 Or bY2 Or bX2)) Or _(bX4 And (bXY2 Or bYX2 Or bY2)) Or _(bY4 And (bXY2 Or bYX2 Or bX2))) Then nGrade = 8m_nType = 1ElseIf (bXY4 Or bYX4 Or bX4 Or bY4) ThennGrade = 9m_nType = 1ElseIf ((bXY_3 And (bYX_2 Or bY_2 Or bX_2)) Or _(bYX_3 And (bXY_2 Or bY_2 Or bX_2)) Or _(bX_3 And (bXY_2 Or bYX_2 Or bY_2)) Or _(bY_3 And (bXY_2 Or bYX_2 Or bX_2))) Then nGrade = 10m_nType = 2ElseIf ((bXY_3 And (bYX3 Or bY3 Or bX3)) Or _(bYX_3 And (bXY3 Or bY3 Or bX3)) Or _(bX_3 And (bXY3 Or bYX3 Or bY3)) Or _(bY_3 And (bXY3 Or bYX3 Or bX3))) Then nGrade = 11m_nType = 2ElseIf ((bXY_3 And (bYX_1 Or bY_1 Or bX_1)) Or _(bYX_3 And (bXY_1 Or bY_1 Or bX_1)) Or _(bX_3 And (bXY_1 Or bYX_1 Or bY_1)) Or _(bY_3 And (bXY_1 Or bYX_1 Or bX_1))) Then nGrade = 12m_nType = 2ElseIf ((bXY_3 And (bYX2 Or bY2 Or bX2)) Or _(bYX_3 And (bXY2 Or bY2 Or bX2)) Or _(bX_3 And (bXY2 Or bYX2 Or bY2)) Or _(bY_3 And (bXY2 Or bYX2 Or bX2))) ThennGrade = 13m_nType = 2ElseIf (bXY_3 Or bYX_3 Or bX_3 Or bY_3) ThennGrade = 14m_nType = 2ElseIf (bXY_2 Or bYX_2 Or bX_2 Or bY_2) ThennGrade = 16ElseIf (bXY3 Or bYX3 Or bX3 Or bY3) ThennGrade = 17ElseIf (bXY2 Or bYX2 Or bX2 Or bY2) ThennGrade = 18ElseIf (bXY_1 Or bYX_1 Or bX_1 Or bY_1) ThennGrade = 19ElsenGrade = 20End IfIf (nGrade > 15) ThenIf (((nX - 2) >= 0) And ((nY - 2) >= 0)) ThenIf ((m_Board(nX, nY - 1) = 0 Or m_Board(nX, nY - 1) = cValue) And _(m_Board(nX + 1, nY) = 0 Or m_Board(nX + 1, nY) = cValue) And _(m_Board(nX, nY + 1) = 0 Or m_Board(nX, nY + 1) = cValue) And _(m_Board(nX - 1, nY) = 0 Or m_Board(nX - 1, nY) = cValue) And _((nX + 2 < 15 And nY - 2 >= 0 And (m_Board(nX + 2, nY - 2) = 0 Or m_Board(nX + 2, nY - 2) = cValue) And _m_Board(nX, nY - 2) = cValue And m_Board(nX + 1, nY - 1) = cValue And m_Board(nX + 2, nY) = cValue) Or _(nX + 2 < 15 And nY + 2 < 15 And (m_Board(nX + 2, nY + 2) = 0 Or m_Board(nX + 2, nY + 2) = cValue) And _m_Board(nX, nY + 2) = cV alue And m_Board(nX + 1, nY + 1) = cValue And m_Board(nX + 2, nY) = cValue) Or _(nX - 2 >= 0 And nY + 2 < 15 And (m_Board(nX - 2, nY + 2) = 0 Or m_Board(nX - 2, nY + 2) = cValue) And _m_Board(nX, nY + 2) = cValue And m_Board(nX - 1, nY + 1) = cV alue And m_Board(nX - 2, nY) = cValue) Or _(nX - 2 >= 0 And nY - 2 >= 0 And (m_Board(nX - 2, nY - 2) = 0 Or m_Board(nX - 2, nY - 2) = cValue) And _m_Board(nX, nY - 2) = cV alue And m_Board(nX - 1, nY - 1) = cValue And m_Board(nX - 2, nY) = cValue))) ThennGrade = 15End IfEnd IfEnd IfiWho = cValueJudge = nGradeEnd FunctionPrivate Sub ring()Cells(17, 3) = Cells(17, 3) + 1If m_nType = 0 ThenIf iWho = 2 ThenIf Cells(17, 3) < 16 ThenMsgBox "Congratulation!! You win by only total " & Cells(17, 3) & " stones, you are cool!"ElseMsgBox "Congratulation!! You win by total " & Cells(17, 3) & " stones, still OK!"End IfElseIf Cells(17, 3) < 16 ThenMsgBox "Sorry!! Computer win by only total " & Cells(17, 3) & " stones, you are bad player!"ElseMsgBox "Sorry!! Computer win by total " & Cells(17, 3) & " stones, you need more practices!"End IfEnd IfCells(17, 1) = ""Cells(17, 3) = 0Range(Cells(17 + 1, 1), Cells(17 + 15, 15)).Value = 0EndEnd IfEnd Sub。

用Python3写一个中国象棋游戏

用Python3写一个中国象棋游戏

⽤Python3写⼀个中国象棋游戏⼀:⽬的就是为了熟悉Python语法⼆:效果三:使⽤⽅式1.⽤Python3运⾏⾥⾯的main.py即可;2.wdsa和上右下左键控制光标移动;空格键选中棋⼦,再按则是相当于移动棋⼦,如果在原地再按空格键取消选中;3.按q结束游戏,或者吃了主帅后结束游戏四:源码⽀持Linux和Windows(我这边⽤ubuntu18.04和Win10 Powershell测试的,如果是其他终端不能保证布局会像GIF中的那样整齐,但是功能肯定是没问题的)五:源码介绍1.⾸先需要⼀个能够实时获取按键的⼯具⽅法/⼯具类,否则每次按完上下左右等功能按键后都要按Enter键太不⽅便,代码如下:class Getch():""" ⽤来实现不需要按enter键读取输⼊字符 """def__init__(self):import platformsystem_name = platform.system()if system_name == 'Windows':self.impl = GetchWindows()else: # 默认是Linux(⽬前就⽀持Windows和Linux即可)self.impl = GetchUnix()def__call__(self): return self.impl()class GetchUnix:def__init__(self):passdef__call__(self):# 不要⽤import sys, tty这种逗号的⽅式导⼊import sysimport ttyimport termiosfd = sys.stdin.fileno()old_settings = termios.tcgetattr(fd)try:tty.setraw(sys.stdin.fileno())ch = sys.stdin.read(1)finally:termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)return chclass GetchWindows:def__init__(self):passdef__call__(self):import msvcrtreturn msvcrt.getch()通过getch()就能实时获取按下的按键2.通过⼀个公共模块来实现清屏和打印颜⾊⽂本的操作,代码如下:def printc(new_line, content, forecolor='', backcolor=''):if forecolor != '':forecolor = ';' + forecolorif backcolor != '':backcolor = ';' + backcolorflag = ''if new_line:flag = '\n'print('\033[0' + forecolor + backcolor + 'm' + content + '\033[0m', end=flag)def clear_console():import platformimport ossystem_name = platform.system()if system_name == 'Windows':os.system("cls")else: # 默认是Linux(⽬前就⽀持Windows和Linux即可)os.system("clear")3.定义⼀些常量,主要⽤于描述阵营,棋⼦类型(如象,⾺,⾞等),颜⾊常量,代码如下:CAMP_RED = '红⽅'CAMP_WHITE = '⽩⽅'CAMP_NONE = 'NONE'CAMP_CURSOR = 'CURSOR'FORE_RED = '31'FORE_YELLOW = '33'FORE_BLUE = '34'FORE_WHITE = '37'BACK_BLACK = '40'CHESS_CHE = 1CHESS_MA = 2CHESS_XIANG = 3CHESS_SHI = 4CHESS_BOSS = 5CHESS_PAO = 6CHESS_BING = 7# 普通的*CHESS_PIECE = 8CHESS_CURSOR = 94.然后我们需要定义棋⼦类,这⾥因为想熟悉Python语法,所以拆成了Chess和ChineseChess来做⽤来熟悉继承,代码如下:class Piece:""" 定义棋⼦基类 """def__init__(self, pic):self._pic = picdef show(self, new_line=False):if new_line:print(self._pic)else:print(self._pic, end='')# coding:utf-8import pieceimport constantsimport commonclass ChessPiece(piece.Piece):"""定义象棋棋⼦"""__camp = ''__type = ''def__init__(self, pic, camp):piece.Piece.__init__(self, pic)self.__camp = campdef get_camp(self):return self.__campdef get_pic(self):return self._picdef set_camp(self, camp):self.__camp = campdef set_pic(self, pic):self._pic = picdef set_type(self, chess_type):self.__type = chess_typedef get_type(self):return self.__typedef show(self, new_line=False):if self.__camp == constants.CAMP_RED:common.printc(new_line, self._pic, constants.FORE_RED)elif self.__camp == constants.CAMP_WHITE:common.printc(new_line, self._pic, constants.FORE_WHITE)elif self.__camp == constants.CAMP_CURSOR:common.printc(new_line, self._pic, constants.FORE_YELLOW)else:common.printc(new_line, self._pic, constants.FORE_BLUE)5.接下来就是游戏环境类了,这个类⽐较⼤,也是关键,线上代码后⾯会讲⼀下思路:# coding:utf-8import sysfrom chess_piece import ChessPieceimport constantsfrom getch import Getchimport chess_strategyimport commonclass GameContext:""" 游戏环境类 """game_over = Falsewinner = ''# 是否已经选中棋⼦piece_checked = False# 红⽅先⾏firster = constants.CAMP_RED_pieces = []_width = 9_height = 10_getch = Getch()# 字符串默认值可以是'',数组默认值是[],字典默认值是{},数值默认值是0,⽽对象默认值是None_cursor_original_backup = None_cursor_loc = {'x': 4, 'y': 1}# ⽤于记录checked后,被checked的piece的坐标,⽤于判定是否是取消checked_checked_loc = {}_checked = FalseCURSOR_CHECKED = ' 'CURSOR_UNCHECKED = ' 'PIECE_NONE = ' * 'strategies = Nonedef__init__(self, camp=constants.CAMP_RED):if camp == constants.CAMP_WHITE:self._cursor_loc['y'] = 8elif camp != constants.CAMP_RED:print('阵营参数错误,游戏退出')exit()self.firster = camp# init pieces# init NONE Campfor y in range(self._height):line = []for x in range(self._width):tmp = ChessPiece(self.PIECE_NONE, constants.CAMP_NONE)tmp.set_type(constants.CHESS_PIECE)line.append(tmp)self._pieces.append(line)del line# init RED Camp and Picfor idx in range(self._width):self._pieces[0][idx].set_camp(constants.CAMP_RED)self._pieces[0][0].set_pic(' ⾞ ')self._pieces[0][0].set_type(constants.CHESS_CHE)self._pieces[0][1].set_pic(' ⾺ ')self._pieces[0][1].set_type(constants.CHESS_MA)self._pieces[0][2].set_pic(' 象 ')self._pieces[0][2].set_type(constants.CHESS_XIANG)self._pieces[0][3].set_pic(' ⼠ ')self._pieces[0][3].set_type(constants.CHESS_SHI)self._pieces[0][4].set_pic(' 將 ')self._pieces[0][4].set_type(constants.CHESS_BOSS)self._pieces[0][5].set_pic(' ⼠ ')self._pieces[0][5].set_type(constants.CHESS_SHI)self._pieces[0][6].set_pic(' 象 ')self._pieces[0][6].set_type(constants.CHESS_XIANG)self._pieces[0][7].set_pic(' ⾺ ')self._pieces[0][7].set_type(constants.CHESS_MA)self._pieces[0][8].set_pic(' ⾞ ')self._pieces[0][8].set_type(constants.CHESS_CHE)# 上⾯的camp已经通过循环统⼀设置过了self._pieces[2][1].set_pic(' 炮 ')self._pieces[2][1].set_type(constants.CHESS_PAO)self._pieces[2][1].set_camp(constants.CAMP_RED)self._pieces[2][7].set_pic(' 炮 ')self._pieces[2][7].set_type(constants.CHESS_PAO)self._pieces[2][7].set_camp(constants.CAMP_RED)self._pieces[3][0].set_pic(' 卒 ')self._pieces[3][0].set_type(constants.CHESS_BING)self._pieces[3][0].set_camp(constants.CAMP_RED)self._pieces[3][2].set_pic(' 卒 ')self._pieces[3][2].set_type(constants.CHESS_BING)self._pieces[3][2].set_camp(constants.CAMP_RED)self._pieces[3][4].set_pic(' 卒 ')self._pieces[3][4].set_type(constants.CHESS_BING)self._pieces[3][4].set_camp(constants.CAMP_RED)self._pieces[3][6].set_pic(' 卒 ')self._pieces[3][6].set_type(constants.CHESS_BING)self._pieces[3][6].set_camp(constants.CAMP_RED)self._pieces[3][-1].set_pic(' 卒 ')self._pieces[3][-1].set_type(constants.CHESS_BING)self._pieces[3][-1].set_camp(constants.CAMP_RED)# init WHITE Camp and Picfor idx in range(self._width):self._pieces[-1][idx].set_camp(constants.CAMP_WHITE)self._pieces[-1][0].set_pic(' ⾞ ')self._pieces[-1][0].set_type(constants.CHESS_CHE)self._pieces[-1][1].set_pic(' ⾺ ')self._pieces[-1][1].set_type(constants.CHESS_MA)self._pieces[-1][2].set_pic(' 相 ')self._pieces[-1][2].set_type(constants.CHESS_XIANG)self._pieces[-1][3].set_pic(' 仕 ')self._pieces[-1][3].set_type(constants.CHESS_SHI)self._pieces[-1][4].set_pic(' 帥 ')self._pieces[-1][4].set_type(constants.CHESS_BOSS)self._pieces[-1][5].set_pic(' 仕 ')self._pieces[-1][5].set_type(constants.CHESS_SHI)self._pieces[-1][6].set_pic(' 相 ')self._pieces[-1][6].set_type(constants.CHESS_XIANG)self._pieces[-1][7].set_pic(' ⾺ ')self._pieces[-1][7].set_type(constants.CHESS_MA)self._pieces[-1][8].set_pic(' ⾞ ')self._pieces[-1][8].set_type(constants.CHESS_CHE)# 上⾯的camp已经通过循环统⼀设置过了self._pieces[-3][1].set_pic(' 砲 ')self._pieces[-3][1].set_type(constants.CHESS_PAO)self._pieces[-3][1].set_camp(constants.CAMP_WHITE)self._pieces[-3][7].set_pic(' 砲 ')self._pieces[-3][7].set_type(constants.CHESS_PAO)self._pieces[-3][7].set_camp(constants.CAMP_WHITE)self._pieces[-4][0].set_pic(' 兵 ')self._pieces[-4][0].set_type(constants.CHESS_BING)self._pieces[-4][0].set_camp(constants.CAMP_WHITE)self._pieces[-4][2].set_pic(' 兵 ')self._pieces[-4][2].set_type(constants.CHESS_BING)self._pieces[-4][2].set_camp(constants.CAMP_WHITE)self._pieces[-4][4].set_pic(' 兵 ')self._pieces[-4][4].set_type(constants.CHESS_BING)self._pieces[-4][4].set_camp(constants.CAMP_WHITE)self._pieces[-4][6].set_pic(' 兵 ')self._pieces[-4][6].set_type(constants.CHESS_BING)self._pieces[-4][6].set_camp(constants.CAMP_WHITE)self._pieces[-4][8].set_pic(' 兵 ')self._pieces[-4][8].set_type(constants.CHESS_BING)self._pieces[-4][8].set_camp(constants.CAMP_WHITE)# init cursorself._cursor_original_backup: ChessPiece = self._pieces[self._cursor_loc['y']][self._cursor_loc['x']] tmp = ChessPiece(self.cursor_pic(), constants.CAMP_CURSOR)tmp.set_type(constants.CHESS_CURSOR)self._pieces[self._cursor_loc['y']][self._cursor_loc['x']] = tmpdel tmpself.strategies = chess_strategy.ChessStrategy(self._pieces, True)def show_map(self):for y in range(self._height):for x in range(self._width):self._pieces[y][x].show()if y == 4:print()# 楚汉分割线print('***********************************')else:print('\n')def clear_map(self):return common.clear_console()def cursor_move(self, p_target):self._pieces[self._cursor_loc['y']][self._cursor_loc['x']] = self._cursor_original_backup self._cursor_original_backup = self._pieces[p_target['y']][p_target['x']]tmp = ChessPiece(self.cursor_pic(), constants.CAMP_CURSOR)tmp.set_type(constants.CHESS_CURSOR)self._pieces[p_target['y']][p_target['x']] = tmpself._cursor_loc = p_target# 刷新地图self.clear_map()self.show_map()# 参数类型限定和返回值类型限定可以不要【类似ts⾥可以不要】def can_move(self, direct: str) -> bool:if direct == 'w':if self._cursor_loc['y'] - 1 < 0:return Falseelif direct == 'd':if self._cursor_loc['x'] + 1 >= self._width:return Falseelif direct == 's':if self._cursor_loc['y'] + 1 >= self._height:return Falseelif direct == 'a':if self._cursor_loc['x'] - 1 < 0:return Falseelse:return Falsereturn Truedef cursor_pic(self) -> str:if self._checked:return self.CURSOR_CHECKEDelse:return self.CURSOR_UNCHECKED""" Python3⾥可以⼿动指定返回值类型,⽽且参数类型也是可以指定的 """def control(self) -> None:while True:ch = self._getch()# 清空之前的显⽰状态self.clear_map()# 重新绘制象棋布局self.show_map()if ch == 'w'or ch == 'A'or ch == b'w'or ch == b'H':if self.can_move('w'):self.cursor_move({'x': self._cursor_loc['x'], 'y': self._cursor_loc['y'] - 1}) print('↑', end='')elif ch == 'd'or ch == 'C'or ch == b'd'or ch == b'M':if self.can_move('d'):self.cursor_move({'x': self._cursor_loc['x'] + 1, 'y': self._cursor_loc['y']}) print('→', end='')elif ch == 's'or ch == 'B'or ch == b's'or ch == b'P':if self.can_move('s'):self.cursor_move({'x': self._cursor_loc['x'], 'y': self._cursor_loc['y'] + 1}) print('↓', end='')elif ch == 'a'or ch == 'D'or ch == b'a'or ch == b'K':if self.can_move('a'):self.cursor_move({'x': self._cursor_loc['x'] - 1, 'y': self._cursor_loc['y']}) print('←', end='')elif ch.lower() == 'q'or ch == b'q':print('game quit!')sys.stdout.flush()breakelif ch == ''or ch == b'':if not self._checked:self.do_check()print('选中', end='')else:self.do_release()print('释放', end='')# 判定游戏是否结束if self.game_over:print('\ngame over!, 胜利⽅是:' + self.winner)sys.stdout.flush()breakelse:print('⽆效按键', end='')# ⽴刻刷新输⼊流,否则getch()获取的字符不会⽴刻显⽰sys.stdout.flush()def can_check(self):tmp = self._cursor_original_backup.get_camp()if tmp != constants.CAMP_RED and tmp != constants.CAMP_WHITE:return Falseif self.firster == constants.CAMP_RED and tmp == constants.CAMP_WHITE:return Falseif self.firster == constants.CAMP_WHITE and tmp == constants.CAMP_RED:return Falsereturn Truedef do_check(self):if self.can_check():self._checked = ~self._checkedself._pieces[self._cursor_loc['y']][self._cursor_loc['x']].set_pic(self.cursor_pic())# 复制⼀份,和Java⼀样基础类型是值赋值,⽽对象是引⽤赋值self._checked_loc = self._cursor_loc.copy()self.clear_map()self.show_map()def do_release(self):# 判定是否是取消,是取消则不翻转当前选⼿if self._cursor_loc['x'] == self._checked_loc['x'] and self._cursor_loc['y'] == self._checked_loc['y']:self._checked = ~self._checkedself._pieces[self._cursor_loc['y']][self._cursor_loc['x']].set_pic(self.cursor_pic())self.clear_map()self.show_map()returnif self.can_release():self._checked = ~self._checked# 判断游戏是否结束if self._cursor_original_backup.get_camp() != constants.CAMP_NONE and self._cursor_original_backup.get_type() == constants.CHESS_BOSS: self.game_over = Trueself.winner = self.firster# 切换释放棋⼦后的布局self._cursor_original_backup = self._pieces[self._checked_loc['y']][self._checked_loc['x']]tmp = ChessPiece(self.PIECE_NONE, constants.CAMP_NONE)tmp.set_type(constants.CHESS_PIECE)self._pieces[self._checked_loc['y']][self._checked_loc['x']] = tmpself._pieces[self._cursor_loc['y']][self._cursor_loc['x']].set_pic(self.cursor_pic())self.clear_map()self.show_map()# 切换选⼿self.reverse_role()""" 策略层,TODO 待完善 """def can_release(self):# 初步判定,⾄少不能吃⾃⼰这边的⼦【Python⾥函数调⽤太坑了吧,刚才self._cursor_original_backup.get_camp这种⽅式居然不报错。

中国象棋(代码)

中国象棋(代码)

中国象棋(web版源代码)程序:using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;using System.Data.SqlClient;namespace WebApplication1{public partial class WebForm1 : System.Web.UI.Page{int tru = 20;int fals = 40;public ImageButton[,] _Image=new ImageButton[11,10];//将上一次点击点的坐标保存到数据库中的lastx和lastypublic void SaveToLast(){if (Session["user"].ToString() == "red" &&_GetUserState(Session["user"].ToString()) == 20){int x, y, lastx, lasty;x = Getpointx();y = Getpointy();lastx = x;lasty = y;Updatalastx(lastx);Updatalasty(lasty);}if (Session["user"].ToString() == "black" &&_GetUserState(Session["user"].ToString()) == 20){int x, y, lastx, lasty;x = Getpointx();y = Getpointy();lastx = x;lasty = y;Updatalastx(lastx);Updatalasty(lasty);}}//将棋盘上所有棋子图片显示到棋盘上private void _Drawqizi(){//_Init();int i,j,k;if (_GetUserState("red") != 0 && _GetUserState("black") != 0){if (Session["user"].ToString() == "red"){for (i = 1; i <= 10; i++)for (j = 1; j <= 9; j++){k = _GetDataQipan(i, j);_Image[i, j].ImageUrl = _GetImageAdd(k);}}if (Session["user"].ToString() == "black"){for (i = 1; i <= 10; i++)for (j = 1; j <= 9; j++){k = _GetDataQipan(i, j);_Image[11 - i, 10 - j].ImageUrl =_GetImageAdd(k);}}}//初始化:对_Image[,]赋值,对ImageButton进行编号private void _Init(){_Image[1, 1] = ImageButton1; _Image[1, 2] = ImageButton2; _Image[1, 3] = ImageButton3; _Image[1, 4] = ImageButton4; _Image[1, 5] = ImageButton5; _Image[1, 6] = ImageButton6; _Image[1, 7] = ImageButton7; _Image[1, 8] = ImageButton8; _Image[1, 9] = ImageButton9;_Image[2, 1] = ImageButton11; _Image[2, 2] = ImageButton12; _Image[2, 3] = ImageButton13; _Image[2, 4] = ImageButton14; _Image[2, 5] = ImageButton15; _Image[2, 6] = ImageButton16; _Image[2, 7] = ImageButton17; _Image[2, 8] = ImageButton18; _Image[2, 9] = ImageButton19;_Image[3, 1] = ImageButton21; _Image[3, 2] = ImageButton22; _Image[3, 3] = ImageButton23; _Image[3, 4] = ImageButton24; _Image[3, 5] = ImageButton25; _Image[3, 6] = ImageButton26; _Image[3, 7] = ImageButton27; _Image[3, 8] = ImageButton28; _Image[3, 9] = ImageButton29;_Image[4, 1] = ImageButton31; _Image[4, 2] = ImageButton32; _Image[4, 3] = ImageButton33; _Image[4, 4] = ImageButton34; _Image[4, 5] = ImageButton35; _Image[4, 6] = ImageButton36; _Image[4, 7] = ImageButton37; _Image[4, 8] = ImageButton38; _Image[4, 9] = ImageButton39;_Image[5, 1] = ImageButton41; _Image[5, 2] = ImageButton42; _Image[5, 3] = ImageButton43; _Image[5, 4] = ImageButton44; _Image[5, 5] = ImageButton45; _Image[5, 6] = ImageButton46; _Image[5, 7] = ImageButton47; _Image[5, 8] = ImageButton48; _Image[5, 9] = ImageButton49;_Image[6, 1] = ImageButton51; _Image[6, 2] = ImageButton52; _Image[6, 3] = ImageButton53; _Image[6, 4] = ImageButton54; _Image[6, 5] = ImageButton55; _Image[6, 6] = ImageButton56; _Image[6, 7] = ImageButton57; _Image[6, 8] = ImageButton58; _Image[6, 9] = ImageButton59;_Image[7, 1] = ImageButton61; _Image[7, 2] = ImageButton62; _Image[7, 3] = ImageButton63; _Image[7, 4] = ImageButton64; _Image[7, 5] = ImageButton65; _Image[7, 6] = ImageButton66; _Image[7, 7] = ImageButton67; _Image[7, 8] = ImageButton68; _Image[7, 9] = ImageButton69;_Image[8, 1] = ImageButton71; _Image[8, 2] = ImageButton72; _Image[8, 3] = ImageButton73; _Image[8, 4] = ImageButton74; _Image[8, 5] = ImageButton75; _Image[8, 6] = ImageButton76; _Image[8, 7] = ImageButton77; _Image[8, 8] = ImageButton78; _Image[8, 9] = ImageButton79;_Image[9, 1] = ImageButton81; _Image[9, 2] = ImageButton82; _Image[9, 3] = ImageButton83; _Image[9, 4] = ImageButton84; _Image[9, 5] = ImageButton85; _Image[9, 6] = ImageButton86; _Image[9, 7] = ImageButton87; _Image[9, 8] = ImageButton88; _Image[9, 9] = ImageButton89;_Image[10, 1] = ImageButton91; _Image[10, 2] = ImageButton92; _Image[10, 3] = ImageButton93; _Image[10, 4] = ImageButton94; _Image[10, 5] = ImageButton95; _Image[10, 6] = ImageButton96; _Image[10, 7] = ImageButton97; _Image[10, 8] = ImageButton98; _Image[10, 9] = ImageButton99;int i, j;for (i = 1; i <= 10; i++)for (j = 1; j <= 9; j++){_Image[i, j].ImageUrl = "~/image/back.gif";}}//初始化棋盘,将两方棋子放好位private void _InitQizi(){int i = 0, j = 0, k = 0;int[] initqipandata = new int[37];for (i = 1; i <= 10; i++)for (j = 1; j <= 9; j++){_UpdataQipan(i, j, k);}for (i = 0; i <= 36; i++)initqipandata[i] = i;_UpdataQipan(1, 1, initqipandata[8]); _UpdataQipan(1, 2, initqipandata[6]); _UpdataQipan(1, 3, initqipandata[4]); _UpdataQipan(1, 4, initqipandata[2]); _UpdataQipan(1, 5, initqipandata[1]); _UpdataQipan(1,6, initqipandata[3]); _UpdataQipan(1, 7, initqipandata[5]); _UpdataQipan(1, 8, initqipandata[7]); _UpdataQipan(1, 9, initqipandata[9]); _UpdataQipan(3, 2, initqipandata[10]); _UpdataQipan(3, 8, initqipandata[11]); _UpdataQipan(4, 1, initqipandata[12]); _UpdataQipan(4, 3, initqipandata[13]);_UpdataQipan(4, 5, initqipandata[14]); _UpdataQipan(4, 7,initqipandata[15]); _UpdataQipan(4, 9, initqipandata[16]);_UpdataQipan(10, 1, initqipandata[28]); _UpdataQipan(10, 2, initqipandata[26]); _UpdataQipan(10, 3, initqipandata[24]);_UpdataQipan(10, 4, initqipandata[22]); _UpdataQipan(10, 5,initqipandata[21]); _UpdataQipan(10, 6, initqipandata[23]);_UpdataQipan(10, 7, initqipandata[25]); _UpdataQipan(10, 8,initqipandata[27]); _UpdataQipan(10, 9, initqipandata[29]); _UpdataQipan(8, 2, initqipandata[30]); _UpdataQipan(8, 8, initqipandata[31]);_UpdataQipan(7, 1, initqipandata[32]); _UpdataQipan(7, 3,initqipandata[33]); _UpdataQipan(7, 5, initqipandata[34]); _UpdataQipan(7, 7, initqipandata[35]); _UpdataQipan(7, 9, initqipandata[36]);}//获取棋子图片地址private string _GetImageAdd(int xxx){string x="" ;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select add_image from qizi where(no_qizi='"+xxx+"');", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read())x = sr["add_image"].ToString();//Session["add_image"] = x;myconn.Close();return x;}//获取点击后的图片地址private string _GetImageDownAdd(int xxx){string x ="";SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select add_image_down from qizi where(no_qizi='" + xxx + "')", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read())x = sr["add_image_down"].ToString();myconn.Close();return x;}//读取鼠标点击点的坐标private int Getpointx(){int x = 0;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select x from zuobiao", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read()){x = int.Parse(sr["x"].ToString());}myconn.Close();return x;}private int Getpointy( ){int x = 0;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select y from zuobiao", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read()){x = int.Parse(sr["y"].ToString());}myconn.Close();return x;}private int Getpointlastx( ){int x = 0;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select lastx from zuobiao", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read()){x = int.Parse(sr["lastx"].ToString());}myconn.Close();return x;}private int Getpointlasty( ){int x = 0;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select lasty from zuobiao", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read()){x = int.Parse(sr["lasty"].ToString());}myconn.Close();return x;}//写入鼠标点击点的坐标private void Updatax(int xxx){SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("update zuobiao set x='" + xxx + "'", myconn);myconn.Open();int aa = cmd.ExecuteNonQuery();myconn.Close();}private void Updatay(int yyy){SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("update zuobiao set y='" + yyy + "'", myconn);myconn.Open();int aa = cmd.ExecuteNonQuery();myconn.Close();}private void Updatalastx(int lastxxx){SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("update zuobiao set lastx='"+lastxxx +"'" , myconn);myconn.Open();int aa = cmd.ExecuteNonQuery();myconn.Close();}private void Updatalasty(int lastyyy){SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("update zuobiao set lasty='"+ lastyyy +"'", myconn);myconn.Open();int aa = cmd.ExecuteNonQuery();myconn.Close();}//以上四个函数的集合,达到一次写入四个坐标值的目的private void _UpdataaZuobiao(int xxx, int yyy, int lastxxx, int lastyyy){Updatax(xxx);Updatay(yyy);Updatalastx(lastxxx);Updatalasty(lastyyy);}//保存当前坐标值到x和yprivate void _UpdatZuobiaoXY(int xxx, int yyy){if (Session["user"].ToString() == "red" &&_GetUserState(Session["user"].ToString()) == 20){Updatax(xxx);Updatay(yyy);}if (Session["user"].ToString() == "black" &&_GetUserState(Session["user"].ToString()) == 20){Updatax(xxx);Updatay(yyy);}}//读取棋盘上的棋子信息private int _GetDataQipan(int xxx, int yyy){int i,data=0;i = (xxx - 1) * 9 + yyy;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select data_qipan from qipan where(position='"+i+"')", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read())data = int.Parse(sr["data_qipan"].ToString());myconn.Close();return data;}//将棋子信息写入棋盘private void _UpdataQipan(int xxx, int yyy,int data){int i;i = (xxx - 1) * 9 + yyy;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("update qipan set data_qipan=" + data + "where (position='"+i+"')", myconn);myconn.Open();int aa = cmd.ExecuteNonQuery();myconn.Close();}//读出用户此时状态private int _GetUserState(string id){int data = 0;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select state from yonghu where(id='" + id + "')", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read())data = int.Parse(sr["state"].ToString());myconn.Close();return data;}//读出用户输赢状态 0表示在进行游戏 20表示赢 40表示输private int _GetUserWin(string id){int data = 0;SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("select winner from yonghu where(id='" + id + "')", myconn);myconn.Open();SqlDataReader sr = cmd.ExecuteReader();if (sr.Read())data = int.Parse(sr["winner"].ToString());myconn.Close();return data;}//写入用户状态private void _UpdataUserState(string id,int sta){SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("update yonghu set state="+ sta + "where (id='" + id + "')", myconn);myconn.Open();int aa = cmd.ExecuteNonQuery();myconn.Close();}//写入用户输赢状态 0表示在进行游戏 20表示赢 40表示输private void _UpdataUserWin(string id, int sta){SqlConnection myconn = newSqlConnection(ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRIN G"].ConnectionString);SqlCommand cmd = new SqlCommand("update yonghu set winner=" + sta + "where (id='" + id + "')", myconn);myconn.Open();int aa = cmd.ExecuteNonQuery();myconn.Close();}protected void Page_Load(object sender, EventArgs e){_Init();// _Test();}//测试程序函数private void _Test(){_UpdataUserState("red",tru);_UpdataUserState("black", tru);}private bool_IsAbleToPut()//********************************************************需要传递x,y,laastx,lasty{if (Session["user"].ToString() == "red" &&_GetUserState(Session["user"].ToString()) == 40)return false;if (Session["user"].ToString() == "black" &&_GetUserState(Session["user"].ToString()) == 40)return false;int x, y, lastx, lasty;int qipandata,lastqipandata;x = Getpointx();y = Getpointy();lastx = Getpointlastx();lasty = Getpointlasty();if (Session["user"].ToString() == "black"){x = 11 - x;y = 10 - y;lastx = 11 - lastx;lasty = 10 - lasty;}qipandata = _GetDataQipan(x, y);lastqipandata = _GetDataQipan(lastx, lasty);// if (lastqipandata==0)// return false;if(Session["user"].ToString() == "red"&&(lastqipandata <= 20 || qipandata >=20))//****************************************************************现以红方为对象return false;if (Session["user"].ToString() == "black" && ((lastqipandata == 0 || lastqipandata >= 20) || (qipandata > 0 && qipandata <= 20)))return false;int i, j, c;//将|帅if (lastqipandata == 1 || lastqipandata == 21){if ((x - lastx) * (y - lasty) != 0) return false;if(Math.Abs(x - lastx) > 1 || Math.Abs(y - lasty) > 1) return false;if (y < 4 || y > 6 || (x > 3 && x < 8)) return false;return true;}//士|仕if (lastqipandata == 2 || lastqipandata == 3 || lastqipandata == 22 || lastqipandata == 23){if ((x - lastx) * (y - lasty) == 0) return false;if(Math.Abs(x - lastx) > 1 || Math.Abs(y - lasty) > 1) return false;if (y < 4 || y > 6 || (x > 3 && x < 8)) return false;return true;}//象|相if (lastqipandata == 4 || lastqipandata == 5 || lastqipandata == 24 || lastqipandata == 25){if ((x - lastx) * (y - lasty) == 0) return false;if (Math.Abs(x - lastx) != 2 || Math.Abs(y - lasty) != 2) return false;if(Session["user"].ToString() == "red"&& x < 6) return false;if (Session["user"].ToString() == "black" && x > 5) return false;i = 0; j = 0;//i,j必须有初始值if (x - lastx == 2){i = x - 1;}if (x - lastx == -2){i = x + 1;}if (y - lasty == 2){j = y - 1;}if (y - lasty == -2){j = y + 1;}if (_GetDataQipan(i, j) != 0) return false;return true;}//马if (lastqipandata == 6 || lastqipandata == 7 || lastqipandata == 26 || lastqipandata == 27){if (Math.Abs(x - lastx) * Math.Abs(y - lasty) != 2)return false;if (x - lastx == 2){if (_GetDataQipan(x - 1, lasty) != 0)return false;}if (x - lastx == -2){if (_GetDataQipan(x + 1, lasty) != 0)return false;}if (y - lasty == 2){if (_GetDataQipan(lastx, y - 1) != 0)return false;}if (y - lasty == -2){if (_GetDataQipan(lastx, y + 1) != 0)return false;}return true;}//车if (lastqipandata == 8 || lastqipandata == 9 || lastqipandata == 28 || lastqipandata == 29){//判断是否直线if ((x - lastx) * (y - lasty) != 0) return false;//判断是否隔有棋子if (x != lastx){if (lastx > x) { int t = x; x = lastx; lastx = t; }for (i = lastx; i <= x; i += 1){if (i != x && i != lastx){if (_GetDataQipan(i, y) != 0)return false;}}}if (y != lasty){if (lasty > y) { int t = y; y = lasty; lasty = t; }for (j = lasty; j <= y; j += 1){if (j != y && j != lasty){if (_GetDataQipan(x, j) != 0)return false;}}}return true;}//炮if (lastqipandata == 10 || lastqipandata == 11 || lastqipandata == 30 || lastqipandata == 31){bool swapflagx = false;bool swapflagy = false;if ((x - lastx) * (y - lasty) != 0) return false;c = 0;if (x != lastx){if (lastx > x) { int t = x; x = lastx; lastx = t; swapflagx = true; }for (i = lastx; i <= x; i += 1){if (i != x && i != lastx){if (_GetDataQipan(i, y) != 0)c = c + 1;//IsAbleToPut = False: Exit Function}}}if (y != lasty){if (lasty > y) { int t = y; y = lasty; lasty = t; swapflagy = true; }for (j = lasty; j <= y; j += 1){if (j != y && j != lasty){if (_GetDataQipan(x, j) != 0)c = c + 1;//IsAbleToPut = False: Exit Function}}}if (c > 1) return false; //与目标处间隔1个以上棋子if (c == 0) //与目标处无间隔棋子{if(swapflagx == true) { int t = x; x = lastx; lastx = t; }if(swapflagy == true) { int t = y; y = lasty; lasty = t; }if (_GetDataQipan(x, y) != 0) return false;}if (c == 1)//与目标处间隔1个棋子{if(swapflagx == true) { int t = x; x = lastx; lastx = t; }if(swapflagy == true) { int t = y; y = lasty; lasty = t; }// if ((IsMyChess(qipan[x, y]) || qipan[x, y] == 0))//return false;//***********ismychess************************************************** ***************************if (qipandata == 0)return false;}return true;}//卒|兵if (lastqipandata == 12 || lastqipandata == 13 || lastqipandata == 14 || lastqipandata == 15 || lastqipandata == 16 || lastqipandata == 32 || lastqipandata == 33 || lastqipandata == 34 || lastqipandata == 35 || lastqipandata == 36){if ((x - lastx) * (y - lasty) != 0)return false;if(Math.Abs(x - lastx) > 1 || Math.Abs(y - lasty) > 1)return false;if (Session["user"].ToString() == "red" && (x >= 6 && (y - lasty) != 0)) return false;if(Session["user"].ToString() == "black"&& (x <= 5 && (y - lasty) != 0)) return false;if(Session["user"].ToString() == "red"&& (x - lastx > 0)) return false;if(Session["user"].ToString() == "black"&& (x - lastx < 0)) return false;return true;}return false;}//移动棋子private void _MoveChess()//********************************************************需要传递x,y,laastx,lasty{//如果能移动则移动棋子if (_IsAbleToPut()){int x, y, lastx, lasty,qipandata, lastqipandata, tr;tr = 0;x = Getpointx();y = Getpointy();lastx = Getpointlastx();lasty = Getpointlasty();if (Session["user"].ToString() == "black"){x = 11 - x;y = 10 - y;lastx = 11 - lastx;lasty = 10 - lasty;}qipandata = _GetDataQipan(x, y);lastqipandata = _GetDataQipan(lastx, lasty);_UpdataQipan(x, y, lastqipandata);_UpdataQipan(lastx, lasty, tr);if (Session["user"].ToString() == "red"){_UpdataUserState("red", fals);_UpdataUserState("black", tru);}if (Session["user"].ToString() == "black"){_UpdataUserState("red", tru);_UpdataUserState("black", fals);}if (qipandata == 1){Response.Write("<script language=javascript>alert('恭喜您,您赢啦');</script>");_UpdataUserState("red", fals);_UpdataUserState("black", fals);Button6.Enabled = true;_UpdataUserWin("red",20);_UpdataUserWin("black", 40);}if (qipandata == 21){Response.Write("<script language=javascript>alert('恭喜您,您赢啦');</script>");_UpdataUserState("red", fals);_UpdataUserState("black", fals);Button6.Enabled = true;_UpdataUserWin("red", 40);_UpdataUserWin("black", 20);}_UpdataaZuobiao(0, 0, 0, 0);}//如果不能移动则更换已方被点击棋子的背景图片}protected void ImageButton1_Click1(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 1; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton2_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 2; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton3_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 3; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton4_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 4; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton5_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 5; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton6_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 6; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton7_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 7; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton8_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 8; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton9_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 1; y = 9; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton11_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 1; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton12_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 2; _UpdatZuobiaoXY(x, y);_MoveChess(); _Drawqizi();}protected void ImageButton13_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 3; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton14_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 4; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton15_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 5; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton16_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 6; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton17_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 7; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton18_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 8; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton19_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 2; y = 9; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton21_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 1; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton22_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 2; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton23_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 3; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton24_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 4; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton25_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 5; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton26_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 6; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton27_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 7; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton28_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 8; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton29_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 3; y = 9; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton31_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 4; y = 1; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton32_Click(object sender,ImageClickEventArgs e){int x, y; SaveToLast(); x = 4; y = 2; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton33_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 4; y = 3; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton34_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 4; y = 4; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton35_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 4; y = 5; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton36_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 4; y = 6; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}protected void ImageButton37_Click(object sender, ImageClickEventArgs e){int x, y; SaveToLast(); x = 4; y = 7; _UpdatZuobiaoXY(x, y); _MoveChess(); _Drawqizi();}。

中国象棋游戏代码

中国象棋游戏代码

中国象棋游戏代码#include<stdio.h>#include<stdlib.h>#include<string.h>char x, y, z;int i, i1, j, j1, k, k1, ii, jj;int f(char X){if (X == '0')printf(" ");else{if (X >= 'a' || X <= 'g'){switch (X - 'a'){case 6:printf("兵");break;case 5:printf("包");break;case 4:printf("帅");break;case 3:printf("士");break;case 2:printf("相");break;case 1:printf("马");break;case 0:printf("车");}}if (X <= 'A' || X <= 'G'){switch (X - 'A'){case 6:printf("卒");break;case 5:printf("炮");break;case 4:printf("将");break;case 3:printf("仕");break;case 2:printf("象");break;case 1:printf("馬");break;case 0:printf("車");}}}}char f2(char **str2, int q){int m, n, o, p;char x1, x2, y2, y1, z1;if (q == 1)printf("\n轮到红子动!\n");elseprintf("\n轮到黑子动!\n");for (;;){if (q == 1)printf("\n攻(红)方:车(a) 马(b)\n");elseprintf("\n黑(守)方:将(E)\n");lm1:printf("请选择棋子代号:");scanf("%c", &x);scanf("%c", &x);if (q == 1 && x != 'a' && x != 'b'){printf("请按要求输入!\n");goto lm1;}if (q == 0 && x != 'E'){printf("请按要求输入!\n");goto lm1;}printf("(欲换棋子输入'0 0')请选择该子所在位置(行与列):");scanf("%d%d", &i, &j);if (i == 0 && j == 0)goto lm1;for (;;){if (i < 1 || i > 3 || j < 1 || j > 3){printf("请认真输入,位置应在棋盘内!\n再次输入:");scanf("%d%d", &i, &j);}elsebreak;}i--;j--;if (*(*(str2 + j) + i) == x)break;elseprintf("该位置没有该棋子!请认真输入!\n");}printf("请输入要下的位置(移动后位置):");label1:scanf("%d%d", &i1, &j1);for (;;){if (i1 < 1 || i1 > 3 || j1 < 1 || j1 > 3){printf("请认真输入,位置应在棋盘内!\n再次输入:");scanf("%d%d", &i1, &j1);}elsebreak;}i1--;j1--;y = *(*(str2 + j1) + i1);if (q == 1 && (y == 'a' || y == 'b')){printf("移动后位置有己方棋子\n重新输入下的位置:");goto label1;}else{if (i1 == i && j1 == j){printf("原地未动\n重新输入下的位置:");goto label1;}else{if (x == 'a'){if (i1 != i && j1 != j){printf("'车'应直走!\n重新输入下的位置:");goto label1;}else{if (i1 == i){if (j1 > j)for (k = j + 1; k < j1; k++){if (*(*(str2 + k) + i) != '0'){printf("中间有子挡\n重新输入下的位置:");goto label1;}}else{for (k = j1 + 1; k < j; k++){if (*(*(str2 + k) + i) != '0'){printf("中间有子挡\n重新输入下的位置:");goto label1;}}}}else{if (i1 > i)for (k = i + 1; k < i1; k++){if (*(*(str2 + j) + k) != '0'){printf("中间有子挡\n重新输入下的位置:");goto label1;}}else{for (k = i1 + 1; k < i; k++){if (*(*(str2 + j) + k) != '0'){printf("中间有子挡\n重新输入下的位置:");goto label1;}}}}}if (i1 != ii && j1 != jj){if (ii == 0){if ((jj == 0 || jj == 2)&& (*(*(str2 + 1) + 2) != 'b'|| ((*(*str2 + 1) + 2) == 'b' && *(*(str2 + 1) + 1) != '0'))) {printf("未将军!\n");goto lm1;}if (jj == 1&& (*(*(str2 + 0) + 2) != 'b'|| (*(*(str2 + 0) + 2) == 'b' && *(*(str2) + 1) != '0'))&& (*(*(str2 + 2) + 2) != 'b'|| (*(*(str2 + 2) + 2) == 'b' && *(*(str2 + 2) + 1) != '0'))) {printf("未将军!\n");goto lm1;}}if (ii == 1 && jj == 0&& (*(*(str2 + 2)) != 'b'|| (*(*(str2 + 2)) == 'b' && *(*(str2 + 1)) != '0'))&& (*(*(str2 + 2) + 2) != 'b'|| (*(*(str2 + 2) + 2) == 'b' && *(*(str2 + 1) + 2) != '0'))) {printf("未将军!\n");goto lm1;}if (ii == 1 && jj == 2&& (**str2 != 'b' || (**str2 == 'b' && *(*(str2 + 1)) != '0'))&& (*(*(str2) + 2) != 'b'|| (*(*(str2) + 2) == 'b' && *(*(str2 + 1) + 2) != '0'))) {printf("未将军!\n");goto lm1;}if (ii == 2){if ((jj == 0 || jj == 2)&& (*(*(str2 + 1)) != 'b'|| ((*(*str2 + 1)) == 'b' && *(*(str2 + 1) + 1) != '0'))) {printf("未将军!\n");goto lm1;}if (jj == 1&& (*(*(str2 + 0)) != 'b'|| (*(*(str2 + 0)) == 'b' && *(*(str2) + 1) != '0'))&& (*(*(str2 + 2)) != 'b'|| (*(*(str2 + 2)) == 'b' && *(*(str2 + 2) + 1) != '0'))) {printf("未将军!\n");goto lm1;}}}}if (x == 'b'){if (i1 == i + 1 || i1 == i - 1){if (j1 == j + 2){if (*(*(str2 + j + 1) + i) != '0'){printf("'马'撇腿!\n重新输入下的位置:");goto label1;}else{if (((i1 != ii + 1 || i1 != ii - 1)&& (j1 != jj + 2 || j1 != jj - 2)) && ((j1 != jj + 1|| j1 != jj - 1)&& (i1 != ii + 2|| i1 !=ii - 2))&& y != 'E'){printf("未将军\n");goto lm1;}goto la1;}}else{if (j1 == j - 2){if (*(*(str2 + j - 1) + i) != '0'){printf("'马'撇腿!\n重新输入下的位置:");goto label1;}else{if (((i1 != ii + 1 || i1 != ii - 1)&& (j1 != jj + 2 || j1 != jj - 2))&& ((j1 != jj + 1 || j1 != jj - 1)&& (i1 != ii + 2 || i1 != ii - 2)) && y != 'E'){printf("未将军\n");goto lm1;}goto la1;}}else{printf("'马'应走'日'\n重新输入下的位置:");goto label1;}}}else{if (i1 == i + 2 || i1 == i - 2){if (j1 == j + 1 || j1 == j - 1){if (*(*(str2 + j) + (i1 + i) / 2) != '0'){printf("'马'撇腿!\n重新输入下的位置:");goto label1;}else{if (((i1 != ii + 1 || i1 != ii - 1)&& (j1 != jj + 2 || j1 != jj - 2))&& ((j1 != jj + 1 || j1 != jj - 1)&& (i1 != ii + 2 || i1 != ii - 2)) && y != 'E'){printf("未将军\n");goto lm1;}goto la1;}}else{printf("'马'应走'日'\n重新输入下的位置:");goto label1;}}else{printf("'马'应走'日'\n重新输入下的位置:");goto label1;}}}if (x == 'E'){ii = i1;jj = j1;if ((i1 == i + 1 || i1 == i - 1) && j1 == j)goto la1;else{if (i1 == i && (j1 == j + 1 || j1 == j - 1))goto la1;else{printf("'帅'一次只(直)走一格\n重新输入下的位置:");goto label1;}}}}la1:*(*(str2 + j1) + i1) = x;*(*(str2 + j) + i) = '0';printf("\n");for (m = 0; m < 3; m++){for (n = 0; n < 3; n++){o = *(*(str2 + n) + m);f(o);}printf("\n\n");}}}char f1(char **str, int q){int m, n, o, p, o3;char x1, x2, y2, y1, z1;if (q == 1){x1 = 'a';x2 = 'A';y1 = 'g';y2 = 'G';o3 = 7;}else{x1 = 'A';x2 = 'a';y1 = 'G';y2 = 'g';o3 = 2;}if (q == 1)printf("\n轮到红子动!\n");elseprintf("\n轮到黑子动!\n");for (;;){if (q == 1)printf("\n红方:车(a) 马(b) 相(c) 士(d) 帅(e) 包(f) 兵(g)\n");elseprintf("\n黑方:車(A) 馬(B) 象(C) 仕(D) 将(E) 炮(F) 卒(G)\n"); lm:printf("请选择棋子代号:");scanf("%c", &x);scanf("%c", &x);if (x >= x2 && x <= y2){printf("请不要动对方棋子\n");goto lm;}else if (x > y1 || x < x1){printf("输入不合要求!\n");goto lm;}printf("(欲换棋子输入'0 0')请选择该子所在位置(行与列):");scanf("%d%d", &i, &j);if (i == 0 && j == 0)goto lm;for (;;){if (i < 1 || i > 10 || j < 1 || j > 9){printf("请认真输入,位置应在棋盘内!\n再次输入:");scanf("%d%d", &i, &j);}elsebreak;}i--;j--;if (*(*(str + j) + i) == x)break;elseprintf("该位置没有该棋子!请认真输入!\n");}printf("请输入要下的位置(移动后位置):");label:scanf("%d%d", &i1, &j1);for (;;){if (i1 < 1 || i1 > 10 || j1 < 1 || j1 > 9){printf("请认真输入,位置应在棋盘内!\n再次输入:");scanf("%d%d", &i1, &j1);}elsebreak;}i1--;j1--;y = *(*(str + j1) + i1);if (y >= x1 && y <= y1){printf("移动后位置有己方棋子\n重新输入下的位置:");goto label;}else{if (i1 == i && j1 == j){printf("原地未动\n重新输入下的位置:");goto label;}else{/*车的情况*/if (x == 'a' || x == 'A'){if (i1 != i && j1 != j){if (q == 1)printf("'车'应直走!\n");elseprintf("'車'应直走!\n重新输入下的位置:");goto label;}else{if (i1 == i){if (j1 > j)for (k = j + 1; k < j1; k++){if (*(*(str + k) + i) != '0'){printf("中间有子挡\n重新输入下的位置:");goto label;}}else{for (k = j1 + 1; k < j; k++){if (*(*(str + k) + i) != '0'){printf("中间有子挡\n重新输入下的位置:");goto label;}}}}else{if (i1 > i)for (k = i + 1; k < i1; k++){if (*(*(str + j) + k) != '0')printf("中间有子挡\n重新输入下的位置:");goto label;}}else{for (k = i1 + 1; k < i; k++){if (*(*(str + j) + k) != '0'){printf("中间有子挡\n重新输入下的位置:");goto label;}}}}}}/*车的情况*/ /*马的情况*/ if (x == 'b' || x == 'B'){if (i1 == i + 1 || i1 == i - 1){if (j1 == j + 2){if (*(*(str + j + 1) + i) != '0'){if (q == 1)printf("'马'撇腿!\n");elseprintf("'馬'撇腿!\n重新输入下的位置:");goto label;}elsegoto la;}else{if (j1 == j - 2){if (*(*(str + j - 1) + i) != '0'){if (q == 1)printf("'马'撇腿!\n");printf("'馬'撇腿!\n重新输入下的位置:");goto label;}elsegoto la;}else{if (q == 1)printf("'马'应走'日'\n");elseprintf("'馬'应走'日'\n重新输入下的位置:");goto label;}}}else{if (i1 == i + 2 || i1 == i - 2){if (j1 == j + 1 || j1 == j - 1){if (*(*(str + j) + (i1 + i) / 2) != '0'){if (q == 1)printf("'马'撇腿!\n");elseprintf("'馬'撇腿!\n重新输入下的位置:");goto label;}elsegoto la;}else{if (q == 1)printf("'马'应走'日'\n");elseprintf("'馬'应走'日'\n重新输入下的位置:");goto label;}}else{if (q == 1)printf("'马'应走'日'\n");elseprintf("'馬'应走'日'\n重新输入下的位置:");goto label;}}}/*马的情况*/ /*相的情况*/ if (x == 'c' || x == 'C'){if ((i1 == i + 2 || i1 == i - 2) && (j1 == j + 2 || j1 == j - 2)){if (*(*(str + (j + j1) / 2) + (i + i1) / 2) != '0'){if (q == 1)printf("'相'压田!\n");elseprintf("'象'压田!\n重新输入下的位置:");goto label;}elsegoto la;}else{if (q == 1)printf("'相'应飞'田'\n");elseprintf("'象'应飞'田'\n重新输入下的位置:");goto label;}}/*相的情况*/ /*士的情况*/ if (x == 'd' || x == 'D'){if (q == 1 && (j1 < 3 || j1 > 5 || i1 < o3)){printf("'士'不可出九宫格\n重新输入下的位置:");goto label;}else{if (q == 0 && (j1 < 3 || j1 > 5 || i1 > o3)){printf("'仕'不可出九宫格\n重新输入下的位置:");goto label;}else{if ((i1 == i + 1 || i1 == i - 1) && (j1 == j + 1 || j1 == j - 1))goto la;else{if (q == 1)printf("'士'应斜着走\n");elseprintf("'仕'应斜着走\n重新输入下的位置:");goto label;}}}}/*士的情况*/ /*帅的情况*/if (x == 'e' || x == 'E'){for (k = i1 - 1; k >= 0; k--){if (*(*(str + j1) + k) != '\0'){if (q == 1)z1 = 'E';elsez1 = 'e';if (*(*(str + j1) + k) == z1){printf("'将''帅' 照面\n重新输入下的位置:");goto label;}break;}}if (q == 1 && (j1 < 3 || j1 > 5 || i1 < o3)){printf("'帅'不可出九宫格\n重新输入下的位置:");goto label;}else{if (q == 0 && (j1 < 3 || j1 > 5 || i1 > o3)){printf("'将'不可出九宫格\n重新输入下的位置:");goto label;}else{if ((i1 == i + 1 || i1 == i - 1) && j1 == j)goto la;else{if (i1 == i && (j1 == j + 1 || j1 == j - 1))goto la;else{if (q == 1)printf("'帅'一次只(直)走一格\n");elseprintf("'将'一次只(直)走一格\n重新输入下的位置:");goto label;}}}}}/*帅的情况*/ /*包的情况*/ if (x == 'f' || x == 'F'){if (i1 != i && j1 != j){if (q == 1)printf("'包'应直走!\n");elseprintf("'炮'应直走!\n重新输入下的位置:");goto label;}else{if (i1 == i){if (j1 > j){for (p = 0, k = j + 1; k < j1; k++)if (*(*(str + k) + i) != '0')p++;if ((p == 0 && *(*(str + j1) + i1) != '0')|| (p == 1 && *(*(str + j1) + i1) == '0')){printf("有子挡\n重新输入下的位置:");goto label;}else{if (p > 1){printf("隔子太多\n重新输入下的位置:");goto label;}elsegoto la;}}else{for (p = 0, k = j1 + 1; k < j; k++)if (*(*(str + k) + i) != '0')p++;if ((p == 0 && *(*(str + j1) + i1) != '0')|| (p == 1 && *(*(str + j1) + i1) == '0')){printf("有子挡\n重新输入下的位置:");goto label;}else{if (p > 1){printf("隔子太多\n重新输入下的位置:");goto label;}elsegoto la;}}}else{if (i1 > i){for (p = 0, k = i + 1; k < i1; k++)if (*(*(str + k) + i) != '0')p++;if ((p == 0 && *(*(str + j1) + i1) != '0')|| (p == 1 && *(*(str + j1) + i1) == '0')){printf("有子挡\n重新输入下的位置:");goto label;}else{if (p > 1){printf("隔子太多\n重新输入下的位置:");goto label;}elsegoto la;}}else{for (p = 0, k = i1 + 1; k < i; k++)if (*(*(str + k) + i) != '0')p++;if ((p == 0 && *(*(str + j1) + i1) != '0')|| (p == 1 && *(*(str + j1) + i1) == '0')){printf("有子挡\n重新输入下的位置:");goto label;}else{if (p > 1){printf("隔子太多\n重新输入下的位置:");goto label;}elsegoto la;}}}}}/*包的情况*/ /*兵的情况*/if (x == 'g'){if (i1 > i){printf("'兵'不能后退\n重新输入下的位置:");goto label;}if (i1 == i && i1 > 5){printf("'兵'没过河不能横着走\n重新输入下的位置:");goto label;}else{if (i1 == i && (j1 == j + 1 || j1 == j - 1))goto la;else{if (j1 == j && i1 == i - 1)goto la;else{printf("'兵'一次只走一格\n重新输入下的位置:");goto label;}}}}/*兵的情况*/ /*卒的情况*/ if (x == 'G'){if (i1 < i){printf("'卒'不能后退\n重新输入下的位置:");goto label;}if (i1 == i && i1 < 5){printf("'卒'没过河不能横着走\n重新输入下的位置:");goto label;}else{if (i1 == i && (j1 == j + 1 || j1 == j - 1))goto la;else{if (j1 == j && i1 == i + 1)goto la;else{printf("'卒'一次只走一格\n重新输入下的位置:");goto label;}}}}/*卒的情况*/ la:*(*(str + j1) + i1) = x;*(*(str + j) + i) = '0';printf("\n");for (m = 0; m < 10; m++){for (n = 0; n < 9; n++){o = *(*(str + n) + m);f(o);}printf("\n\n");}}}}int main(){int i0, j0, k0, m, n, m1, n1, p1, p3, ww;char **str, **str2;char x0, str1[10];str = (char **)malloc(1600);for (i0 = 0; i0 < 11; i0++)*(str + i0) = (char *)malloc(40);str2 = (char **)malloc(144);for (i0 = 0; i0 < 4; i0++)*(str2 + i0) = (char *)malloc(12);ww1:printf("\n欢迎游戏!\n 中国象棋\n\n");printf("请选择游戏模式:\n1.双人大战!\n2.九宫象棋!\n请输入编号:");scanf("%d", &ww);if (ww != 1 && ww != 2){printf("请按要求输入!\n");goto ww1;}if (ww == 2){printf("\n游戏规则:\n攻(红)方先动棋子不可出九宫格,在步步将军的情况下最终吃将获胜!\n""守(黑)方一直逃,直到对方无法将死便获胜!\n""攻(红)方只有車,馬二子,走法同象棋\n\n");lma1:printf("\n");for (i0 = 0; i0 < 3; i0++){for (j0 = 0; j0 < 3; j0++)*(*(str2 + j0) + i0) = '0';}**str2 = 'a';**(str2 + 2) = 'b';*(*(str2 + 1) + 1) = 'E';*(*(str2) + 2) = 'b';*(*(str2 + 2) + 2) = 'a';for (i0 = 0; i0 < 3; i0++){for (j0 = 0; j0 < 3; j0++){x0 = *(*(str2 + j0) + i0);f(x0);}printf("\n\n");}ii = 1, jj = 1;}else{printf("\n游戏简介:本游戏与现实中象棋规则相同!为方便游戏运行,棋子将用字母替代\n\n""红方:车(a) 马(b) 相(c) 士(d) 帅(e) 包(f) 兵(g)\n""黑方:車(A) 馬(B) 象(C) 仕(D) 将(E) 炮(F) 卒(G)\n\n");lma:printf("\n");for (i0 = 0; i0 < 10; i0++)for (j0 = 0; j0 < 9; j0++)*(*(str + j0) + i0) = '0';**str = 'A';**(str + 1) = 'B';**(str + 2) = 'C';**(str + 3) = 'D';**(str + 4) = 'E';*(*(str + 1) + 2) = 'F';*(*(str) + 3) = 'G';*(*(str + 2) + 3) = 'G';*(*(str + 4) + 3) = 'G';*(*(str) + 6) = 'g';*(*(str + 2) + 6) = 'g';*(*(str + 4) + 6) = 'g';*(*(str + 1) + 7) = 'f';*(*(str) + 9) = 'a';*(*(str + 1) + 9) = 'b';*(*(str + 2) + 9) = 'c';*(*(str + 3) + 9) = 'd';*(*(str + 4) + 9) = 'e';for (i0 = 0; i0 < 10; i0++){for (j0 = 5; j0 < 9; j0++)*(*(str + j0) + i0) = *(*(str + 8 - j0) + i0);}for (i0 = 0; i0 < 10; i0++){for (j0 = 0; j0 < 9; j0++){x0 = *(*(str + j0) + i0);f(x0);}printf("\n\n");}}printf("Ready Go?(输入“start”开始):");scanf("%s", str1);for (;;){if (str1[0] == 's' && str1[1] == 't' && str1[2] == 'a' && str1[3] == 'r' && str1[4] == 't'&& str1[5] == '\0')break;elseprintf("请正确输入!{Not ready?)\n再次输入:");scanf("%s", str1);}printf("\n红子先动!\n\n是否开启悔棋功能\n""征求双方意见,同意输入1,反对输入0(将关闭悔棋功能)\n");l11:printf("红方意见:");scanf("%d", &m1);if (m1 != 0 && m1 != 1){printf("请按要求输入!\n");goto l11;}l12:printf("黑方意见:");scanf("%d", &n1);if (n1 != 0 && n1 != 1){printf("请按要求输入!\n");goto l12;}p3 = m1 * n1;for (m = 1;; m++){l3:m = m % 2;if (ww == 1)f1(str, m);elsef2(str2, m);if (p3 != 0){printf("是否悔棋\n征求双方意见,同意输入1,反对输入0,关闭悔棋功能输入2\n");l1:printf("红方意见:");scanf("%d", &m1);if (m1 != 0 && m1 != 1 && m1 != 2){printf("请按要求输入!\n");goto l1;}l2:printf("黑方意见:");scanf("%d", &n1);if (n1 != 0 && n1 != 1 && n1 != 2){printf("请按要求输入!\n");goto l2;}p1 = m1 * n1;if (p1 == 1 && m1 != 2 && n1 != 2){if (ww == 1){*(*(str + j) + i) = x;*(*(str + j1) + i1) = y;}else{*(*(str2 + j) + i) = x;*(*(str2 + j1) + i1) = y;}printf("\n");if (ww == 1){for (i0 = 0; i0 < 10; i0++){for (j0 = 0; j0 < 9; j0++){x0 = *(*(str + j0) + i0);f(x0);}printf("\n\n");}}else{for (i0 = 0; i0 < 3; i0++){for (j0 = 0; j0 < 3; j0++){x0 = *(*(str2 + j0) + i0);f(x0);}printf("\n\n");}}goto l3;}if (m1 == 2 || n1 == 2)p3 = 0;}if (ww == 1){if (y == 'E'){printf("红方胜\n");break;}if (y == 'e'){printf("黑方胜\n");break;}}else{if (y == 'E'){printf("攻(红)方胜\n");break;}}}ljl:printf("是否再来一局?是(Yes),否(No),返回主菜单(Return):");scanf("%s", str1);if (str1[0] == 'Y' && str1[1] == 'e' && str1[2] == 's' && str1[3] == '\0') {if (ww == 1)goto lma;if (ww == 2)goto lma1;}else{if (str1[0] == 'N' && str1[1] == 'o' && str1[2] == '\0')printf("Game Over!\n");else{if (str1[0] == 'R' && str1[1] == 'e' && str1[2] == 't' && str1[3] == 'u' && str1[4] == 'r' && str1[5] == 'n' && str1[6] == '\0')goto ww1;else{printf("请按要求输入!\n");goto ljl;}}}for (i0 = 0; i0 < 10; i0++)free(*(str + i0));free(str);for (i0 = 0; i0 < 3; i0++)free(*(str2 + i0));free(str2);system("PAUSE");return 0;}。

中国象棋C语言源代码

中国象棋C语言源代码

*--------------------chess.c----------------------*/ #include "dos.h"#include "stdio.h"/*----------------------------------------------------*/ #define RED 7#define BLACK 14#define true 1#define false 0#define SELECT 0#define MOVE 1#define RED_UP 0x1100#define RED_DOWN 0x1f00#define RED_LEFT 0x1e00#define RED_RIGHT 0x2000#define RED_DO 0x3900#define RED_UNDO 0x1000#define BLACK_UP 0x4800#define BLACK_DOWN 0x5000#define BLACK_LEFT 0x4b00#define BLACK_RIGHT 0x4d00#define BLACK_DO 0x1c00#define BLACK_UNDO 0x2b00#define ESCAPE 0x0100#define RED_JU 1#define RED_MA 2#define RED_XIANG 3#define RED_SHI 4#define RED_JIANG 5#define RED_PAO 6#define RED_BIN 7#define BLACK_JU 8#define BLACK_MA 9#define BLACK_XIANG 10#define BLACK_SHI 11#define BLACK_JIANG 12#define BLACK_PAO 13#define BLACK_BIN 14/*----------------------------------------------------*/ int firsttime=1;int savemode;char page_new=0,page_old=0;int finish=false,turn=BLACK,winner=0;int key;int redstate=SELECT,blackstate=SELECT;int board[10][9];/*----------------------------------------------------*/char *chessfile[15]={"","bmp\\rju.wfb", "bmp\\rma.wfb", "bmp\\rxiang.wfb","bmp\\rshi.wfb","bmp\\rjiang.wfb","bmp\\rpao.wfb","bmp\\rbin.wfb","bmp\\bju.wfb", "bmp\\bma.wfb", "bmp\\bxiang.wfb","bmp\\bshi.wfb","bmp\\bjiang.wfb","bmp\\bpao.wfb","bmp\\bbin.wfb"};char *boardfile[10][9]={{"bmp\\11.wfb","bmp\\1t.wfb","bmp\\1t.wfb","bmp\\14.wfb","bmp\\15.wfb","bmp\\16.wfb"," bmp\\1t.wfb","bmp\\1t.wfb","bmp\\19.wfb"},{"bmp\\21.wfb","bmp\\2c.wfb","bmp\\2c.wfb","bmp\\24.wfb","bmp\\25.wfb","bmp\\26.wfb"," bmp\\2c.wfb","bmp\\2c.wfb","bmp\\29.wfb"},{"bmp\\21.wfb","bmp\\3a.wfb","bmp\\3t.wfb","bmp\\34.wfb","bmp\\3t.wfb","bmp\\36.wfb"," bmp\\3t.wfb","bmp\\3a.wfb","bmp\\29.wfb"},{"bmp\\41.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","b mp\\4a.wfb","bmp\\4t.wfb","bmp\\49.wfb"},{"bmp\\51.wfb","bmp\\52.wfb","bmp\\5t.wfb","bmp\\54.wfb","bmp\\5t.wfb","bmp\\56.wfb"," bmp\\5t.wfb","bmp\\58.wfb","bmp\\59.wfb"},{"bmp\\61.wfb","bmp\\62.wfb","bmp\\6t.wfb","bmp\\64.wfb","bmp\\6t.wfb","bmp\\66.wfb"," bmp\\6t.wfb","bmp\\68.wfb","bmp\\69.wfb"},{"bmp\\71.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","b mp\\7a.wfb","bmp\\7t.wfb","bmp\\79.wfb"},{"bmp\\81.wfb","bmp\\8a.wfb","bmp\\8t.wfb","bmp\\84.wfb","bmp\\85.wfb","bmp\\86.wfb"," bmp\\8t.wfb","bmp\\8a.wfb","bmp\\89.wfb"},{"bmp\\91.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\95.wfb","bmp\\9t.wfb","b mp\\9t.wfb","bmp\\9t.wfb","bmp\\99.wfb"},{"bmp\\101.wfb","bmp\\102.wfb","bmp\\102.wfb","bmp\\104.wfb","bmp\\105.wfb","bmp\\10 6.wfb","bmp\\108.wfb","bmp\\108.wfb","bmp\\109.wfb"}};char cursor[14][14]={0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,255,255,255,255,255,255,255,0,0,1,1,1,1,0,255,255,255,255,255,255,0,0,1,1,1,1,1,0,255,255,255,255,255,255,0,0,1,1,1,1,1,0,255,255,255,255,255,255,255,0,0,1,1,1,1,0,255,255,255,255,255,255,255,255,0,0,1,1,1,0,255,255,255,255,255,255,255,255,255,0,0,1,1,0,255,255,0,255,255,255,255,255,255,255,0,0,1,0,255,0,1,1,0,255,255,255,255,255,255,255,0,0,0,1,1,1,1,0,255,255,255,255,255,0,1,0,1,1,1,1,1,1,0,255,255,255,0,1,1,1,1,1,1,1,1,1,1,0,255,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1};struct pos{int x;int y;}position[10][9],redcurpos,redtemppos,redoldpos,blackcurpos,blacktemppos,blackoldpos; /*----------------------------------------------------*/selectpage(register char page) /*换页函数*/{union REGS r;r.x.ax=0x4f05;r.x.bx=0;r.x.dx=page; /*选择页面*/int86(0x10,&r,&r);}unsigned char set_SVGA_mode(int vmode) /*设置SVGA屏幕模式*/{union REGS r;r.x.ax=0x4f02;r.x.bx=vmode;int86(0x10,&r,&r);return(r.h.ah);}unsigned int get_SVGA_mode() /*获取当前SVGA屏幕模式*/{union REGS r;r.x.ax=0x4f03;int86(0x10,&r,&r);return(r.x.bx);}drawbmp(int start_x,int start_y,char filename[]){char buffer[640];int i,j,k,n,r,g,b,width,length;long position;FILE *fp;if((fp=fopen(filename,"rb"))==NULL){printf("Error! Can't open file!");getch();return;}fseek(fp,28,SEEK_SET);fread(&i,2,1,fp);if(i!=8) /*检查是否为256色位图*/{puts("Error!Can't find bitmap!");fclose(fp);getch();exit(0);}fseek(fp,18,SEEK_SET);fread(&width,4,1,fp);fread(&length,4,1,fp);if(firsttime){fseek(fp,54,SEEK_SET);for(i=0;i<256;i++) /*按照该图片的DAC色表设置色彩寄存器*/{b=fgetc(fp);g=fgetc(fp);r=fgetc(fp); /*获取R、G、B分量*/outportb(0x3c8,i);outportb(0x3c9,r>>2); /*右移是要转化为VGA的6位寄存器形式*/ outportb(0x3c9,g>>2);outportb(0x3c9,b>>2);fgetc(fp);}}elsefseek(fp,300,SEEK_SET);k=(width%4)?(4-width%4):0; /*宽度修正值*/for(j=length-1+start_x;j>=start_x;j--){fread(buffer,width,1,fp);for(i=start_y,n=0;i<width+start_y;i++,n++){position=j*640l+i; /*计算要显示点的显存位置*/page_new=position/65536; /*计算显示页*/if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/{selectpage(page_new);page_old=page_new;}pokeb(0xa000,position%65536,buffer[n]); /*写到显存位置*/}fseek(fp,k,SEEK_CUR); /*每行绘制完后修正宽度*/}fclose(fp);}init(){savemode=get_SVGA_mode(); /*先保存原来的屏幕模式*/set_SVGA_mode(0x101); /*硬件无关性初始化屏幕为640*480 256色模式*/ }end(){set_SVGA_mode(savemode); /*恢复屏幕*/}/*----------------------------------------------------*/initpos(){int i,j;for(i=0;i<10;i++)for (j=0;j<9;j++){position[i][j].x=35+i*39;position[i][j].y=43+j*40;}}initchessmap(){board[0][0]=BLACK_JU;board[0][1]=BLACK_MA;board[0][2]=BLACK_XIANG;board[0][3]=BLACK_SHI;board[0][4]=BLACK_JIANG;board[0][5]=BLACK_SHI;board[0][6]=BLACK_XIANG;board[0][7]=BLACK_MA;board[0][8]=BLACK_JU;board[2][1]=BLACK_PAO;board[2][7]=BLACK_PAO;board[3][0]=BLACK_BIN;board[3][2]=BLACK_BIN;board[3][4]=BLACK_BIN;board[3][6]=BLACK_BIN;board[3][8]=BLACK_BIN;board[9][0]=RED_JU;board[9][1]=RED_MA;board[9][2]=RED_XIANG;board[9][3]=RED_SHI;board[9][4]=RED_JIANG;board[9][5]=RED_SHI;board[9][6]=RED_XIANG;board[9][7]=RED_MA;board[9][8]=RED_JU;board[7][1]=RED_PAO;board[7][7]=RED_PAO;board[6][0]=RED_BIN;board[6][2]=RED_BIN;board[6][4]=RED_BIN;board[6][6]=RED_BIN;board[6][8]=RED_BIN;}initdrawchess(){int i,j;;for(i=0;i<10;i++)for(j=0;j<9;j++){if(board[i][j])drawbmp(position[i][j].x,position[i][j].y,chessfile[board[i][j]]); }}drawcursor(struct pos p){int i,j,n,m,x,y;long thisposition;x=position[p.x][p.y].x+20;y=position[p.x][p.y].y+25;for(j=13-1+x,m=13;j>=x;j--,m--){for(i=y,n=0;i<13+y;i++,n++){thisposition=j*640l+i; /*计算要显示点的显存位置*/page_new=thisposition/65536; /*计算显示页*/if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/ {selectpage(page_new);page_old=page_new;}if(cursor[m][n]!=1)if(cursor[m][n]==0)pokeb(0xa000,thisposition%65536,0);elseif(turn==RED)pokeb(0xa000,thisposition%65536,153);elsepokeb(0xa000,thisposition%65536,255);}}}drawselecursor(struct pos p){int i,j,n,m,x,y;long thisposition;x=position[p.x][p.y].x+20;y=position[p.x][p.y].y+25;for(j=13-1+x,m=13;j>=x;j--,m--){for(i=y,n=0;i<13+y;i++,n++){thisposition=j*640l+i; /*计算要显示点的显存位置*/page_new=thisposition/65536; /*计算显示页*/if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/ {selectpage(page_new);page_old=page_new;}if(cursor[m][n]!=1)pokeb(0xa000,thisposition%65536,0);}}}/*----------------------------------------------------*/int getkey(){int press;while(bioskey(1) == 0);press=bioskey(0);press=press&0xff00;return(press);}/*--------------------红方操作--------------------*/int redcanselect(){int x,y;x=redcurpos.x;y=redcurpos.y;if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)return 1;elsereturn 0;}int redcanmove(){int i,j,min,max,oldx,oldy,x,y;oldx=redoldpos.x;oldy=redoldpos.y;x=redcurpos.x;y=redcurpos.y;/*case1 目标位置是否是自己人*/if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)return 0;/* 军、马、炮、相、士、将、卒的走法正确性的判断*/ switch(board[oldx][oldy]){case RED_BIN: /*完成*/if(oldx>=5){ if(y!=oldy||(oldx-x)!=1) return 0;}else{ if(x==(oldx-1)&&y==oldy) return 1;elseif(x==oldx&&y==(oldy+1)) return 1;elseif(x==oldx&&y==(oldy-1)) return 1;elsereturn 0;}break;case RED_JIANG: /*完成*/if(x!=oldx&&y!=oldy) return 0;if(x!=oldx)if((x-oldx)>1||(oldx-x)>1) return 0;else if(x<7) return 0;else if(y!=oldy)if((y-oldy)>1||(oldy-y)>1) return 0;else if(y<3||y>5) return 0;break;case RED_JU: /*完成*/if(x!=oldx&&y!=oldy) return 0;else if(x!=oldx){ min=(x>oldx)?oldx:x;max=(x>oldx)?x:oldx;for(i=min+1;i<max;i++)if(board[i][y]!=0) return 0;}else if(y!=oldy){ min=(y>oldy)?oldy:y;max=(y>oldy)?y:oldy;for(i=min+1;i<max;i++)if(board[x][i]!=0) return 0;}break;case RED_MA: /*完成*/if((x-oldx)==2&&((y-oldy)==1||(oldy-y)==1)) {if(board[oldx+1][oldy]!=0) return 0;}elseif((oldx-x)==2&&((y-oldy)==1||(oldy-y)==1)) {if(board[oldx-1][oldy]!=0) return 0;}elseif((y-oldy)==2&&((x-oldx)==1||(oldx-x)==1)) {if(board[oldx][oldy+1]!=0) return 0;}elseif((oldy-y)==2&&((x-oldx)==1||(oldx-x)==1)) {if(board[oldx][oldy-1]!=0) return 0;}elsereturn 0;break;case RED_PAO: /*完成*/if(x!=oldx&&y!=oldy) return 0;if(board[x][y]==0){if(x!=oldx){ min=(x>oldx)?oldx:x;max=(x>oldx)?x:oldx;for(i=min+1;i<max;i++)if(board[i][y]!=0) return 0; }else if(y!=oldy){ min=(y>oldy)?oldy:y; max=(y>oldy)?y:oldy;for(i=min+1;i<max;i++)if(board[x][i]!=0) return 0; }}else{if(x!=oldx){ min=(x>oldx)?oldx:x; max=(x>oldx)?x:oldx;for(i=min+1,j=0;i<max;i++) if(board[i][y]!=0) j++;if(j!=1) return 0;}else if(y!=oldy){ min=(y>oldy)?oldy:y; max=(y>oldy)?y:oldy;for(i=min+1,j=0;i<max;i++) if(board[x][i]!=0) j++;if(j!=1) return 0;}}break;case RED_SHI: /*完成*/if(oldx==9||oldx==7){if(x!=8||y!=4) return 0;} else if(oldx==8){if(x==9&&y==3) return 1; elseif(x==9&&y==5) return 1; elseif(x==7&&y==3) return 1; elseif(x==7&&y==5) return 1; else return 0;}else return 0;break;case RED_XIANG: /*完成*/ if(x<5) return 0;if(x!=oldx&&y!=oldy){if((x-oldx)==2&&(y-oldy)==2){i=oldx+1;j=oldy+1;}else if((x-oldx)==2&&(oldy-y)==2) {i=oldx+1;j=oldy-1;}else if((oldx-x)==2&&(y-oldy)==2) {i=oldx-1;j=oldy+1;}else if((oldx-x)==2&&(oldy-y)==2) {i=oldx-1;j=oldy-1;}else return 0;if(board[i][j]!=0) return 0;}else return 0;break;}return 1;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, Buttons,Unit2,Unit3;typeTForm1 = class(TForm)PaintBox1: TPaintBox;MainMenu1: TMainMenu;Game1: TMenuItem;NewGame1: TMenuItem;Eixt1: TMenuItem;Label1: TLabel;Label2: TLabel;Label3: TLabel;BitBtn1: TBitBtn;BitBtn3: TBitBtn;Label4: TLabel;s1: TMenuItem;N1: TMenuItem;N2: TMenuItem;N3: TMenuItem;N4: TMenuItem;N5: TMenuItem;N6: TMenuItem;N7: TMenuItem;N8: TMenuItem;GroupBox1: TGroupBox;PaintBox2: TPaintBox;BitBtn2: TBitBtn;BitBtn4: TBitBtn;BitBtn5: TBitBtn;BitBtn6: TBitBtn;GroupBox2: TGroupBox;Memo1: TMemo;BitBtn7: TBitBtn;N9: TMenuItem;N10: TMenuItem;N11: TMenuItem;N12: TMenuItem;N13: TMenuItem;RadioGroup1: TRadioGroup;RadioGroup2: TRadioGroup;procedure FormCreate(Sender: TObject);procedure PaintBox1Paint(Sender: TObject);procedure NewGame1Click(Sender: TObject);procedure Eixt1Click(Sender: TObject);procedure CrossPaint(x,y,i,j:integer); //自定义画兵格过程procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FindDrop(NowR,NowC:integer); //扫描可以走棋的点过程procedure PaintCMoveDrop(); //画出可走点过程procedure WhoWin(); //判断输赢过程procedure IsNextWin();//判断是否将军procedure RemHistory();//走棋记录procedure RepentChess(n:integer);procedure FindAGoodMove(); //寻找一个优秀的走法procedure AddPoint(row,column:integer);//加入一个相关点function Eveluate(nSide:integer):integer;//估值函数function Eveluate1(nSide:integer):integer;//测试估值函数function GetRelatePiece(row,column:integer):integer;//枚举一个位置上棋子所有相关的点function GetBingValue(row,column:integer):integer;//为兵返回附加值//创建可能的走法 nPly记录扫描的层数,nSide记录到那边走棋 0为红方,1为黑方 function CreatePossibleMove(nPly,nSide:integer):integer;function MakeMove(depth,n:integer):integer;//猜想过程中生产一个新局面procedure UnMakeMove(depth,n,nChessID:integer); //猜想过程中根据走法恢复一个棋盘function IsGameOver(depth:integer):integer;//猜想过程中判断给定局面是否结束 function AddMove(FormR,FormC,ToR,ToC,nPly:integer):integer;//在nMoveList中插入一个走法function NegaMax(depth:integer):integer; //深度优先搜索负极大技校function Alpha_Beta(depth,alpha,beta:integer):integer;//Alpha-Beta搜索算法 function ChessMoveLaw(NowR,NowC,ToR,ToC,nChessID:integer):boolean; //走棋规则函数function ChessMoveLawPos(NowR,NowC,ToR,ToC,nChessID:integer):boolean; //猜想过程走棋规则函数function CanTouch(NowR,NowC,ToR,ToC,nChessID:integer):boolean;//判断能不能到达目标点function ChessPutLaw(NowR,NowC,ToR,ToC:integer):boolean; //摆起规则函数function ChessMove(NowR,NowC,ToR,ToC:integer):boolean; //走棋函数function AIChessMove(NowR,NowC,ToR,ToC:integer):boolean; //电脑走棋procedure BitBtn1Click(Sender: TObject);procedure FormPaint(Sender: TObject);procedure BitBtn3Click(Sender: TObject);procedure N3Click(Sender: TObject);procedure N2Click(Sender: TObject);procedure N6Click(Sender: TObject);procedure N7Click(Sender: TObject);procedure PaintBox2Paint(Sender: TObject);procedure N8Click(Sender: TObject);procedure PaintBox2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);procedure BitBtn5Click(Sender: TObject);procedure BitBtn4Click(Sender: TObject);procedure BitBtn2Click(Sender: TObject);procedure BitBtn6Click(Sender: TObject);procedure BitBtn7Click(Sender: TObject);procedure N11Click(Sender: TObject);procedure N12Click(Sender: TObject);procedure N13Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;//棋盘格子单位大小mBit:integer;//棋子数组:所有棋子的数值mChess: array[1..14] of string =('车','马','相','士','帅','炮','兵','車','馬','象','仕','将','炮','卒');//===============================棋子价值==============================// //棋子的基础价值m_BaseValue: array[1..14] of integer=(500,350,250,250,10000,370,100,500,350,250,250,10000,370,100);//棋子灵活度基础价值m_Flexible:array[1..14] of integer=(6,12,1,1,0,6,15,6,12,1,1,0,6,15);//每一个位置上的棋子的灵活性即可走步数m_FlexibleNum:array[1..10,1..9]of integer;//每一个位置被威胁的信息m_AttackNum:array[1..10,1..9]of integer;//每一个位置被保护的信息m_GuardNum:array[1..10,1..9]of integer;//每一个棋子是总价值m_ChessValue:array[1..10,1..9]of integer;//红兵附加值矩阵mBing:array[1..10,1..9]of integer=((0,0,0,0,0,0,0,0,0),(90,90,110,120,120,120,110,90,90),(90,90,110,120,120,120,110,90,90),(70,90,110,110,110,110,110,90,70),(70,70,70,70,70,70,70,70,70),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0));//黑卒附加值矩阵mZhuzi:array[1..10,1..9]of integer=((0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(70,70,70,70,70,70,70,70,70),(70,90,110,110,110,110,110,90,70),(90,90,110,120,120,120,110,90,90),(90,90,110,120,120,120,110,90,90),(0,0,0,0,0,0,0,0,0));//===============================棋子价值==============================////棋盘两边的数表NumWord1:array[1..9] of string =('1','2','3','4','5','6','7','8','9');NumWord2:array[1..10] of string=('一','二','三','四','五','六','七','八','九','十');NumWord3:array[1..14] of integer=//摆子时盒子里剩余的棋子数量(2,2,2,2,1,2,5,2,2,2,2,1,2,5);//棋盘数组:记录什么位置有什么棋子有子地方为mChess里面的数值,无子为0 ChessBoard: array[1..10,1..9] of integer;//电脑猜想时棋盘数组:记录什么位置有什么棋子有子地方为mChess里面的数值,无子为0nPosition: array[1..10,1..9] of integer;//自定义棋盘盒子数组ChessBox:array[1..2,1..7]of integer;//定义导航点数组能走的坐标点存在数组中值为1,不能走为0CMoveDrop:array[1..10,1..9] of integer;//棋盘1拾子标志(True表示已经拾取一个棋子)mPickFlag : boolean;//棋盘2拾子标志(True表示已经拾取一个棋子)mPickFlag2:boolean;//在paintbox1拾起棋子的值mPickChess: integer;//在paintbox2拾起的棋子值mPickChess2:integer;//拾起棋子的行号mPickRow : integer;//拾起棋子的列号mPickColumn :integer;//最大价值棋子的行列MVCRow,MVCColumn:integer;//走棋规则,允许落子标志CanDropFlag : boolean;//鼠标在Paintbox1点中坐标MouseRow,MouseColumn:integer;//鼠标在paintbox2点中的坐标MouseR2,MouseC2:integer;//定义到谁走棋WhoPlay:string;//定义先手方FirstPlay:string;GameMode:integer; //定义游戏模式 1:人人对弈 2:人机对弈 3:自定义棋局 4:思考模式//拾起棋子为哪一方 1为红方,0为黑方mPWhoPlay:string;//判定是否移动棋子IsMove:boolean;//胜利Win : boolean;//走棋步数MCSteep:integer;//总的走法数mMoveCount:integer;//相关位置点的总数mPosCount:integer;//调用估值函数的次数useEveluateCount:integer;//搜索的最大深度mMaxDepth:integer;//Memo1当前加上的最后一行MemoMaxLine:integer;type //自定义记录类型用来记录走棋记录ChessRecord=recordChessBoard:array[1..10,1..9]of integer;Win:boolean;WhoPlay:string;end;varHistory:array[0..300]of ChessRecord;typeHaveNum=recordNumber:integer;end;var ChessHaveNum:array[1..14]of HaveNum; //自定义棋盘是摆起盒子里面剩余的棋子数typePoint=recordrow:integer;column:integer;end;varRelatePos:array[1..20]of Point; //与一个棋子相关的位置typeMoveList=record //走法列表FormR:integer;FormC:integer;ToR:integer;ToC:integer;end;varnMoveList:array[0..10,1..100]of MoveList; //走法列表nBestMove:MoveList;//最佳走法implementationend.implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); vari,j: integer;begin//设置棋盘格子单位大小,控制棋盘大小mBit:=50; //建议在45~55之间 50最佳//设置paintbox1的大小和位置paintbox1.Top:=65;paintbox1.Left:=10;paintbox1.Width:=10*mBit;paintbox1.Height:=11*mBit;//设置label1的大小和位置label1.Width:=150;label1.Height:=37;label1.Left:=15*mBit+15;label1.Top:=15;//设置label2的位置大小label2.Width:=115;label2.Height:=37;label2.Left:=13*mBit;label2.Top:=15;//设置label3的位置label3.Left:=30;label3.Top:=15;//初始化胜利提示label4.Caption:='';//设置form1的大小和颜色form1.Width:=19*mBit;form1.Height:=14*mBit;//初始化可走点for i:=1 to 10 dofor j:=1 to 9 doCMoveDrop[i,j]:=0;//初始化棋盘数组for i:=1 to 10 dofor j:=1 to 9 dobeginChessBoard[i,j]:=0;nPosition[i,j]:=0;end;//初始化先手FirstPlay:='';//初始化游戏模式GameMode:=0;//拾子标志为falsemPickFlag:=false;//能走棋标志为falseCanDropFlag:=false;//是否移动棋子为falseIsMove:=false;//初始化走棋步数MCSteep:=0;//初始化最大走法数mMoveCount:=0;//初始化相关位置数mPosCount:=0;//初始化游戏模式、先手方、电脑难度 GameMode:=2;N7.Checked:=true;FirstPlay:='红';N2.Checked:=true;mMaxDepth:=3;N12.Checked:=true;//胜利标志win:=false;end;procedure TForm1.PaintBox1Paint(Sender: TObject);vari,j:integer;beginlabel3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';//初始化胜利提示label4.Caption:='';:='宋体';label1.Font.Size:=25;label1.Caption:=WhoPlay+'方走棋';//<=========================画棋盘begin============================> paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clblack;paintbox1.Canvas.Brush.Color:=clSilver;//画出棋盘的外框paintbox1.Canvas.Rectangle(0,0,10*mBit,11*mBit); //棋盘外框for i:=1 to 9 do //棋盘边的行标和列标beginpaintbox1.Canvas.TextOut(i*mBit-3,10,NumWord1[i]);paintbox1.Canvas.TextOut(i*mBit-3,10*mBit+25,NumWord1[i]);end;for i:=1 to 10 dobeginpaintbox1.Canvas.TextOut(10,i*mBit-5,NumWord2[i]);paintbox1.Canvas.TextOut(9*mBit+25,i*mBit-5,NumWord2[i]);end;:='宋体';paintbox1.Canvas.font.Size:=mBit div 2;paintbox1.Canvas.TextOut(mBit+35,5*mBit+8,' 楚河汉界');//棋盘外边的字//棋盘两边的纵向直线paintbox1.Canvas.MoveTo(mBit,mBit);paintbox1.Canvas.LineTo(mBit,10*mBit); paintbox1.Canvas.MoveTo(9*mBit,mBit); paintbox1.Canvas.LineTo(9*mBit,10*mBit);//棋盘上面的横向直线for i:=1 to 10 dobeginpaintbox1.Canvas.MoveTo(mBit,i*mBit);paintbox1.Canvas.LineTo(9*mBit,i*mBit);end;//棋盘上的纵向直线for i:=2 to 8 dobeginpaintbox1.Canvas.MoveTo(i*mBit,mBit);paintbox1.Canvas.LineTo(i*mBit,5*mBit); paintbox1.Canvas.MoveTo(i*mBit,6*mBit); paintbox1.Canvas.LineTo(i*mBit,10*mBit); end;//棋盘上的田字格斜线paintbox1.Canvas.MoveTo(4*mBit,mBit); paintbox1.Canvas.LineTo(6*mBit,3*mBit); paintbox1.Canvas.MoveTo(4*mBit,3*mBit); paintbox1.Canvas.LineTo(6*mBit,mBit);paintbox1.Canvas.MoveTo(4*mBit,8*mBit); paintbox1.Canvas.LineTo(6*mBit,10*mBit); paintbox1.Canvas.MoveTo(4*mBit,10*mBit); paintbox1.Canvas.LineTo(6*mBit,8*mBit);//画兵格炮格i:=1;repeatCrossPaint(i*mBit,4*mBit,5,15);//黑方兵格 CrossPaint(i*mBit,7*mBit,5,15);//红方兵格 i:=i+2;until i>9;//黑方炮格CrossPaint(2*mBit,3*mBit,5,15);CrossPaint(8*mBit,3*mBit,5,15);//红方炮格CrossPaint(2*mBit,8*mBit,5,15);CrossPaint(8*mBit,8*mBit,5,15);//<=========================画棋盘end============================>//<=========================画棋子begin================================>for i:=1 to 10 dofor j:=1 to 9 doif ChessBoard[i,j]<> 0 thenbeginpaintbox1.Canvas.Brush.Color:=clBtnFace;//画出棋子if ChessBoard[i,j]<=7 thenbeginpaintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Ellipse(j*mBit-22,i*mBit-22,j*mBit+22,i*mBit+22);paintbox1.Canvas.Font.Size:=22;:='隶书';paintbox1.Canvas.Font.Color:=clred;paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]); endelsebeginpaintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clblack;paintbox1.Canvas.Ellipse(j*mBit-22,i*mBit-22,j*mBit+22,i*mBit+22);paintbox1.Canvas.font.Size:=22;:='隶书';paintbox1.Canvas.Font.Color:=clblack;paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]); endend;//<=========================画棋子end================================>end;procedure TForm1.FormPaint(Sender: TObject); //游戏界面beginform1.Canvas.Pen.Width:=2;form1.Canvas.Rectangle(10,10,19*mBit-15,55);//最上方外框form1.Canvas.Rectangle(11*mBit-30,mBit+15,19*mBit-15,12*mBit+15);end;procedure TForm1.NewGame1Click(Sender: TObject);vari,j:integer;beginif(FirstPlay<>'')and((GameMode=1)or(GameMode=2))thenbeginif(MessageDlg('确定要开始新游戏吗?',mtConfirmation,[mbYes,mbNo],0))=mrYes thenbeginGroupBox1.Visible:=false;//隐藏GroupBox1Memo1.Lines.Clear;Memo1.Lines.Add('新游戏开始!');MemoMaxLine:=Memo1.Lines.Add('由'+FirstPlay+'先走棋!');//拾子标志为falsemPickFlag:=false;//能走棋标志为falseCanDropFlag:=false;//胜利标志win:=false;//初始化走棋一方WhoPlay:=FirstPlay;if(WhoPlay='红')thenlabel1.Font.Color:=clred;if(WhoPlay='黑')thenlabel1.Font.Color:=clblack;:='宋体';label1.Font.Size:=25;label1.Caption:='红方走棋';//初始化胜利提示label4.Caption:='';//初始化走棋步数MCSteep:=0;label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';//初始化棋盘数组for i:=1 to 10 dofor j:=1 to 9 dobeginChessBoard[i,j]:=0;end;//(1'车',2'马',3'象',4'士',5'帅',6'炮','7兵',8'車',9'馬',10'相',11'仕',12'将',13'炮',14'卒');//设置黑方的棋子ChessBoard[1,1]:=8;ChessBoard[1,2]:=9;ChessBoard[1,3]:=10;ChessBoard[1,4]:=11;ChessBoard[1,5]:=12;ChessBoard[1,6]:=11;ChessBoard[1,7]:=10;ChessBoard[1,8]:=9;ChessBoard[1,9]:=8;ChessBoard[3,2]:=13;ChessBoard[3,8]:=13;ChessBoard[4,1]:=14;ChessBoard[4,3]:=14;ChessBoard[4,5]:=14;ChessBoard[4,7]:=14;ChessBoard[4,9]:=14;//设置红方的棋子ChessBoard[10,1]:=1;ChessBoard[10,2]:=2;ChessBoard[10,3]:=3;ChessBoard[10,4]:=4;ChessBoard[10,5]:=5;ChessBoard[10,6]:=4;ChessBoard[10,7]:=3;ChessBoard[10,8]:=2;ChessBoard[10,9]:=1;ChessBoard[8,2]:=6;ChessBoard[8,8]:=6;ChessBoard[7,1]:=7;ChessBoard[7,3]:=7;ChessBoard[7,5]:=7;ChessBoard[7,7]:=7;ChessBoard[7,9]:=7;refresh();//更新棋盘RemHistory();if(GameMode=2)and(FirstPlay='黑')then //人机对弈模式由黑方先手beginFindAGoodMove();AIChessMove(nBestMove.FormR,nBestMove.FormC,nBestMove.ToR,nBestMove.ToC);if(isMove=true)thenbeginRemHistory();//记录棋子移动WhoPlay:='红';label1.Font.Color:=clred;refresh();paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(nBestMove.FormC*mBit,nBestMove.FormR*mBit,2,8);//棋子起走点标记CrossPaint(nBestMove.ToC*mBit,nBestMove.ToR*mBit,2,8);//棋子落点标记 isMove:=false;end;end;end;//if(MessageDlg('确定要开始新游戏吗endelseMessageDlg('请设置游戏模式!',mtWarning,[mbOk],0);end;procedure TForm1.CrossPaint(x,y,i,j:integer); //画兵格过程beginif x<>mBit thenbegin//兵格坐标左上部paintbox1.Canvas.MoveTo(x-i,y-i);paintbox1.Canvas.LineTo(x-j,y-i);paintbox1.Canvas.MoveTo(x-i,y-i);paintbox1.Canvas.LineTo(x-i,y-j);//兵格坐标左下部paintbox1.Canvas.MoveTo(x-i,y+i);paintbox1.Canvas.LineTo(x-j,y+i);paintbox1.Canvas.MoveTo(x-i,y+i);paintbox1.Canvas.LineTo(x-i,y+j);end;if x<>9*mBit thenbegin//兵格坐标右上部paintbox1.Canvas.MoveTo(x+i,y-i);paintbox1.Canvas.LineTo(x+i,y-j);paintbox1.Canvas.MoveTo(x+i,y-i);paintbox1.Canvas.LineTo(x+j,y-i);//兵格坐标右下部paintbox1.Canvas.MoveTo(x+i,y+i);paintbox1.Canvas.LineTo(x+j,y+i);paintbox1.Canvas.MoveTo(x+i,y+i);paintbox1.Canvas.LineTo(x+i,y+j);end;end;procedure TForm1.Eixt1Click(Sender: TObject);beginif(MessageDlg('确定要退出游戏?',mtConfirmation,[mbYes,mbNo],0))=mrYes then close;end;procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);varrow,column:integer;//鼠标落点的行,列号Lcross : real;//鼠标落点到棋盘交叉点的距离i,j:integer;beginif GameMode=1 then//判断游戏模式begin//计算出鼠标落下的行,列号row:=Y div mBit;if Y mod mBit>= (mBit div 2)+1 thenrow:=row+1;column:= x div mBit;if X mod mBit>= (mBit div 2)+1 thencolumn:=column+1;//记录鼠标点下的坐标MouseColumn:=column;MouseRow:=row;//当前鼠标点中的棋子mPickChess:=ChessBoard[row,column];//当前选中棋子属于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:='红';//红方if(ChessBoard[row,column]>7)thenmPWhoPlay:='黑';//黑方//计算出鼠标落点到棋盘交叉点的距离Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if(win=false)then//判断输赢beginif (Button = mbLeft) thenbegin//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半 if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div 2)) thenbeginif (mPickFlag = false) thenbeginif (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;//选中棋子endelse //可以下子begin//调用ChessMove过程,移动棋子ChessMove(mPickRow,mPickColumn,MouseRow,MouseColumn);if(IsMove=false)then //如果没有移动beginrefresh();//更新棋盘mPickFlag:=false;//目标点不合法更新棋盘//继续点自己的棋子直接选中if (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22);paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;end;if(IsMove=true)then //目标点合法更新走棋方begin//MFindDrop(MouseRow,MouseColumn);//移动到目标后该棋子可走点refresh();//更新棋盘IsNextWin();//判断是否将军WhoWin(); //判断输赢if(Win=true)thenexit;if(WhoPlay='红')then //交换走棋方beginWhoPlay:='黑';label1.Font.Color:=clblack;endelsebeginWhoPlay:='红';label1.Font.Color:=clred;end;label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';refresh();//更新棋盘RemHistory();//记录棋子移动paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(mPickColumn*mBit,mPickRow*mBit,2,8);//棋子起走点标记CrossPaint(MouseColumn*mBit,MouseRow*mBit,2,8);//棋子落点标记IsMove:=false;mPickFlag:=false;end;end;end;end;end;//if(win=false)thenend;//if(GameMode=1)if(GameMode=2)then //人机对弈beginif(WhoPlay='红')then //红方走棋begin//计算出鼠标落下的行,列号row:=Y div mBit;if Y mod mBit>= (mBit div 2)+1 thenrow:=row+1;column:= x div mBit;if X mod mBit>= (mBit div 2)+1 thencolumn:=column+1;//记录鼠标点下的坐标MouseColumn:=column;MouseRow:=row;//当前鼠标点中的棋子mPickChess:=ChessBoard[row,column];//当前选中棋子属于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:='红';//红方if(ChessBoard[row,column]>7)thenmPWhoPlay:='黑';//黑方//计算出鼠标落点到棋盘交叉点的距离Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if(win=false)then//判断输赢beginif (Button = mbLeft) thenbegin//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半 if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div2)) thenbeginif (mPickFlag = false) thenbeginif (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;//选中棋子endelse //可以下子begin//调用ChessMove过程,移动棋子ChessMove(mPickRow,mPickColumn,MouseRow,MouseColumn);if(IsMove=false)then //如果没有移动beginrefresh();//更新棋盘mPickFlag:=false;//目标点不合法更新棋盘//继续点自己的棋子直接选中if (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;end;if(IsMove=true)then //目标点合法更新走棋方begin//MFindDrop(MouseRow,MouseColumn);//移动到目标后该棋子可走点refresh();//更新棋盘IsNextWin();//判断是否将军WhoWin(); //判断输赢if(Win=true)thenexit;//交换走棋方WhoPlay:='黑';label1.Font.Color:=clblack;label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';refresh();//更新棋盘RemHistory();//记录棋子移动paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(mPickColumn*mBit,mPickRow*mBit,2,8);//棋子起走点标记CrossPaint(MouseColumn*mBit,MouseRow*mBit,2,8);//棋子落点标记IsMove:=false;mPickFlag:=false;end;end;end;end;end;//if(win=false)thenend;//红方走棋if(WhoPlay='黑')then //黑方走棋beginif(win=false)thenbeginFindAGoodMove(); //寻找一个优秀的走法AIChessMove(nBestMove.FormR,nBestMove.FormC,nBestMove.ToR,nBestMove.ToC); if(isMove=true)thenbeginrefresh();IsNextWin();//判断是否将军WhoWin();//判断输赢if(Win=true)thenexit;WhoPlay:='红';RemHistory();//记录棋子移动label1.Font.Color:=clred;refresh();paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(nBestMove.FormC*mBit,nBestMove.FormR*mBit,2,8);//棋子起走点标记CrossPaint(nBestMove.ToC*mBit,nBestMove.ToR*mBit,2,8);//棋子落点标记isMove:=false;end;end;// if(win=false)thenend;//黑方走棋end;//人机对弈if(Win=true)thenshowmessage(WhoPlay+'方已获胜,本局结束,请重新开始!');if(GameMode=3)then //自定义棋盘模式begin//计算出鼠标落下的行,列号row:=Y div mBit;if Y mod mBit>= (mBit div 2)+1 thenrow:=row+1;column:= x div mBit;if X mod mBit>= (mBit div 2)+1 thencolumn:=column+1;//记录鼠标点下的坐标MouseColumn:=column;MouseRow:=row;//当前鼠标点中的棋子mPickChess:=ChessBoard[row,column];//当前选中棋子属于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:='红';//红方if(ChessBoard[row,column]>7)thenmPWhoPlay:='黑';//黑方//计算出鼠标落点到棋盘交叉点的距离Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if (Button = mbLeft) thenbegin//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div 2)) thenbeginif(mPickFlag2=true)thenbeginif(CMoveDrop[row,column]=1)thenbeginif(ChessHaveNum[mPickChess2].Number<>0)then//该子棋盒里面还有剩余beginMemo1.Lines.Add(mPWhoPlay+mChess[mPickChess2]+'摆在'+'('+inttostr(row)+','+inttostr(column)+')');ChessBoard[row,column]:=mPickChess2;//摆子以后该子剩余:ChessHaveNum[mPickChess2].Number:=ChessHaveNum[mPickChess2].Number-1;mPickFlag2:=false;refresh();GroupBox1.Refresh();endelseshowmessage('棋盘里能摆的“'+mChess[mPickChess2]+'”已经满了!');endelse //选中棋盒又点棋盘上不能摆子的地方beginmPickFlag2:=false;refresh();GroupBox1.Refresh();end;end;//当前没有选中棋子 mPickFlag2=falseif(mPickFlag2=false)and(mPickFlag=false)thenbeginif(ChessBoard[row,column]<>0)thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);mPickFlag:=true;exit;end;end;if(mPickFlag2=false)and(mPickFlag=true)thenbeginif(ChessBoard[row,column]<>0)thenbeginmPickFlag:=false;refresh();mPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);mPickFlag:=true;exit;end;end;end;end;end;// if(GameMode=3)thenend;//PaintBox1MouseDown//==================棋子走begin==================//function Tform1.ChessMoveLaw(NowR,NowC,ToR,ToC,nChessID:integer):boolean;vari,j:integer; //循环变量begincase nChessID of//------------------车走法begin--------------------------//1:beginif(ToC=NowC)then //竖走beginif(ToR>NowR)then //从上到下beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then beginfor i:=(NowR+1) to (ToR-1) doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;if(ToR<NowR)then //从下到上beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then beginfor i:=(ToR+1)to (NowR-1)doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;end;if(ToR=NowR)then //横着走beginif(ToC>NowC)then //从左到右beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then beginfor i:=(NowC+1) to (ToC-1) doif(ChessBoard[NowR,i]<>0)thenexit;CanDropFlag:=true;end;end;if(ToC<NowC)then //从右到左beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenbeginfor i:=(ToC+1)to (NowC-1)doif(ChessBoard[NowR,i]<>0)thenexit;CanDropFlag:=true;end;end;end;end;//------------------车走法end--------------------------////-------------------马走法begin----------------------//2:begin//马走日子if((abs(ToC-NowC)+abs(ToR-NowR))=3)and(ToC<>NowC)and(ToR<>NowR)thenbegin//竖日且无子当马脚if(abs(ToR-NowR)=2)and(ChessBoard[(NowR+ToR) div 2,NowC]=0)thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;//横日且无子当马脚if(abs(ToC-NowC)=2)and(ChessBoard[NowR,(NowC+ToC)div 2]=0)thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;end;end;//-------------------马走法end----------------------////-------------------相走法begin--------------------//3:begin//相走田if(ToR>5)and(abs(ToR-NowR)=2)and(abs(ToC-NowC)=2)thenif(ChessBoard[(ToR+NowR)div 2,(ToC+NowC)div 2]=0)then //田字格中间无子if(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then//目标点无子或不是己方CanDropFlag:=true;。

相关文档
最新文档