1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<easyx.h> 5 6 #define ROW 15 7 #define COL 15 8 #define SIZE 40 9 /* 10 11 1. 五子棋的规则 棋盘上 黑白棋走 12 13 棋盘--->二维数组 旗子 黑-1 白1 空白0 14 15 判断输赢 连成5个 判断落子附近有没有成5个就行 16 17 下棋 先白 然后黑 写一个函数 鼠标点击的位置 转换成数组的下标 18 对应的元素有没有值 不赋值 视为无效操作 19 否则 下棋 20 21 22 23 悔棋 记录每一步的操作 24 判断棋盘满--->步数>=棋盘大小 25 记录当前棋盘 存档 读档 26 认输 可以设置一个键 按下这个键就认输 27 28 29 游戏结束 1.一方成了5 30 2.格子满了 无法放新的棋 31 32 33 34 返回值只能返回一个数据 --->返回多个 数组?堆内存可以 或者结构体 35 36 */ 37 typedef struct coor 38 { 39 int x; 40 int y; 41 }COOR; 42 43 void drawMap(int map[][COL]); 44 COOR play(int map[][COL],int flag); 45 int judge(int map[][COL], int x, int y); 46 47 int main() 48 { 49 int map[ROW][COL] = { 0 }; 50 51 initgraph(COL * SIZE, ROW * SIZE); 52 COOR add;//得到点击的位置 53 54 int flag = 1; 55 while (1) 56 { 57 drawMap(map); 58 add=play(map,flag); 59 60 //判断游戏是否结束 61 if (judge(map, add.x, add.y) == 1) 62 { 63 drawMap(map); 64 //游戏结束 65 if (flag == 1) //白赢了 66 { 67 MessageBox(0, L"白win", L"good", MB_OK); 68 break; 69 } 70 else 71 { 72 MessageBox(0, L"黑win", L"good", MB_OK); 73 break; 74 } 75 } 76 77 78 79 flag = -flag; 80 } 81 82 getchar(); 83 closegraph(); 84 return 0; 85 } 86 87 void drawMap(int map[][COL]) 88 { 89 BeginBatchDraw(); 90 setbkcolor(RGB(32, 178, 170)); 91 cleardevice(); 92 // 竖着 20,20 20,20+40*COL 93 for (int i = 0; i < ROW; ++i)//画横线 94 { 95 line(SIZE / 2 , SIZE / 2+ i*SIZE, SIZE*ROW- SIZE / 2 ,SIZE/2+i*SIZE); 96 } 97 for (int j = 0; j <= COL; ++j) 98 { 99 line(j*SIZE-SIZE/2, SIZE/2, j*SIZE-SIZE/2, SIZE*COL -SIZE/2); 100 } 101 102 for (int i = 0; i < ROW; ++i) 103 { 104 for (int j = 0; j < COL; ++j) 105 { 106 switch (map[i][j]) 107 { 108 case -1://黑棋 109 setfillcolor(BLACK); 110 solidcircle(j*SIZE+SIZE/2, i*SIZE+SIZE/2, SIZE / 3); 111 break; 112 case 1://白棋 113 setfillcolor(WHITE); 114 solidcircle(j*SIZE + SIZE / 2, i*SIZE + SIZE / 2, SIZE / 3); 115 break; 116 default: 117 break; 118 } 119 } 120 } 121 EndBatchDraw(); 122 } 123 124 COOR play(int map[][COL], int flag)//如果是黑 -1 如果是白 1 125 { 126 MOUSEMSG msg; 127 while (1) 128 { 129 msg = GetMouseMsg(); 130 switch (msg.uMsg) 131 { 132 case WM_LBUTTONDOWN: 133 // msg.y/SIZE-->行下标 134 // msg.x/SIZE-->列下标 135 if (map[msg.y / SIZE][msg.x / SIZE] == 0) 136 { 137 map[msg.y / SIZE][msg.x / SIZE] = flag; 138 COOR add = { msg.y / SIZE, msg.x / SIZE }; 139 return add;//返回点击的位置 140 } 141 142 break; 143 } 144 } 145 } 146 147 148 int judge(int map[][COL], int x, int y) 149 { 150 //判断有没有成5的 151 int arr[4] = { 0 };//四个方向 152 //判断上下 153 int i = 1; 154 while (x - i >= 0 && map[x - i][y] == map[x][y]){ ++i, arr[0]++; } 155 i = 1; 156 while (x+i<ROW&&map[x + i][y] == map[x][y]){ ++i, arr[0]++; } 157 158 //左右 159 i = 1; 160 while (y - i >= 0 && map[x][y - i] == map[x][y]){ ++i, arr[1]++; } 161 i = 1; 162 while (y + i<COL&&map[x ][y+ i] == map[x][y]){ ++i, arr[1]++; } 163 164 //左上 右下 165 i = 1; 166 while (x - i >= 0&&y-i>=0&& map[x - i][y-i] == map[x][y]){ ++i, arr[2]++; } 167 i = 1; 168 while (x + i<ROW&&y+i<COL&&map[x + i][y+i] == map[x][y]){ ++i, arr[2]++; } 169 170 //左下右上 171 i = 1; 172 while (x - i >= 0 && y + i <COL && map[x - i][y + i] == map[x][y]){ ++i, arr[3]++; } 173 i = 1; 174 while (x + i<ROW&&y - i>=0&&map[x + i][y - i] == map[x][y]){ ++i, arr[3]++; } 175 176 for (int i = 0; i < 4; ++i) 177 { 178 if (arr[i] >= 4) return 1;//表示结束 赢 179 } 180 return 0;//没有赢 181 }