以前写过一个,只不过写的比较繁琐,这个能简单实现,去掉了各种花里胡哨(虽然都是简单的知识),本来是打算用c++实现的,发现还是c写起来好理解,毕竟学艺不精,哈哈哈
代码风格偏奇葩,接触编程时间不长,还有许多可以优化的地方,例如下方显示文字可以使用内联函数疯狂调用之类。
注释有的地方不太明确,如有bug可以反馈。
本人使用vs2017,如有编译错误,可修改项目属性
项目->属性->常规->字符集->多字节字符集;
此处修改为outtextxy输出文字函数中的第三个参数在调用时出错。
#include<graphics.h>
#include<iostream>
#include<Windows.h>
#include<string>
#include<vector>
#include<conio.h>
#define MAX 1000
using namespace std;
//全局变量存储棋盘的属性
struct G_chess {
int CHESS_R = 10;//每个棋子的半径
int CHESS_R_C = 5;//五个点的半径
int ROW = 35;//棋盘的行的长度
int COLOMU = 35;//棋盘列的长度
int start = 50;//棋盘的起始位置
int menu_start_x = start + 14 * COLOMU + 10;//菜单栏的x轴开始位置
int menu_start_y = start;//菜单栏的y轴开始位置
}G;
//每个棋子的位置属性
struct chess {
int map_x;//棋子所在行的位置
int map_y;//棋子所在列的位置
};
//棋盘上的各个棋子属性
class chess_piece {
public:
//初始化棋盘上的棋子个数
chess_piece() {
buffer = MAX;
}
//每下一个棋子,获取所下棋子的信息,收入棋子的属性中
void play(int x, int y) {
chess temp;
temp.map_x = x;
temp.map_y = y;
play_chess.push_back(temp);
}
friend ostream &operator<< (ostream& os, chess a);
//每下一个棋子,画出棋子
void down(int x, int y, int color) {
setfillcolor(color);
setlinecolor(color);
fillcircle(x, y, G.CHESS_R);
play(x, y);
}
void drow_back_line(vector<chess>& play_chess);//悔棋后,将棋盘复原
//每悔一次棋,将所下的棋子删除
void back() {
if (play_chess.empty()) {
setbkmode(TRANSPARENT);
settextstyle(30, 0, _T("楷体"));
outtextxy(G.start + 3 * G.COLOMU, G.start + 14 * G.COLOMU + 1, _T("请落子后再进行操作"));
return;
}
drow_back_line(play_chess);
play_chess.pop_back();
}
~chess_piece() { }
private:
int buffer;
vector<chess> play_chess;
};
int flag = BLACK;
void map();//生成地图
int mouse();//鼠标操作
inline int mouse_menu(MOUSEMSG &mou);//菜单处的鼠标操作
void drow_menu(int x, int y, const char *name, int UOD);//菜单框
bool judge(int x, int y);//判断游戏是否有一方获胜
int main()
{
int s = 1;
while (s) {
s = mouse();
}
closegraph();
return 0;
}
ostream & operator<<(ostream & os, chess a)
{
os << a.map_x << " " << a.map_y;
return os;
}
void map() {
chess_piece a;
initgraph(700, 640);
setfillcolor(RGB(172, 81, 24));
setfillstyle(BS_SOLID);
fillrectangle(0, 0, 700, 640);
setlinecolor(BLUE);
for (int i = 0; i <= G.start + 13 * G.COLOMU; i = i + G.COLOMU)
{
line(G.start + i, G.start, G.start + i, G.start + G.COLOMU * 14);
line(G.start, G.start + i, G.start + G.COLOMU * 14, G.start + i);
}
setfillcolor(GREEN);
fillcircle(G.start + 7 * G.COLOMU, G.start + 7 * G.COLOMU, G.CHESS_