#include <iostream>
#include <graphics.h>//使用前需要下载安装easyx
#include <string>
#include <stdio.h>
void init_play_window();//创建界面
void start_playing();
int winner(int record[9][9]);
int winner2(int record[9][9]);
void main(std::string args[]) {
while (1) {
init_play_window();
start_playing();
}
//卡屏
/*int record[9][9] = {
{ 0, 0, 0, 0, 0, 0, 1, 2, 0},
{ 0, 0, 0, 0, 0, 0, 1, 2, 0},
{ 0, 0, 0, 0, 2, 0, 1, 2, 0},
{ 0, 0, 1, 2, 1, 1, 1, 2, 0},
{ 0, 0, 0, 1, 1, 2, 1, 2, 0},
{ 0, 0, 2, 1, 2, 1, 2, 0, 0},
{ 0, 2, 1, 2, 1, 2, 0, 0, 0},
{ 0, 0, 0, 1, 1, 2, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
for (int i = 0;i < 9;i++) {
for (int j = 0;j < 9;j++) {
std::cout << record[i][j] << " ";
}
std::cout << std::endl;
}*/
//winner(record);
getchar();
//return 1;
}
void init_play_window() {
//创建界面
initgraph(600, 500,SHOWCONSOLE);
//图片输入
IMAGE img;
loadimage(&img, "fallback-image.jpg");
putimage(-400,-500, &img);
//绘制棋盘
for (int i = 1;i < 20;i++) {
if (i % 2 == 0) {
setlinecolor(YELLOW);
}
else {
setlinecolor(BLACK);
}
line(25, 25 * i, 475, 25 * i);
line(25 * i, 25, 25 * i, 475);
}
setbkmode(0);//文字默认背景为黑色,设置为透明
settextcolor(BLACK);
settextcolor(BLACK);
outtextxy(505, 25, "玩家1:白");
outtextxy(505, 50, "玩家2:黑");
}
void start_playing() {
//获取鼠标点击事件 ,范围(x,y)(25,25)~(475,25),(475,25)~(475,475)
MOUSEMSG mMsg;//事件变量
int chess_x, chess_y;
int flag = 1;//白子为先
int record[9][9] = { 0 };
while (1) {
mMsg = GetMouseMsg();//鼠标信息获取
if (mMsg.uMsg == WM_LBUTTONDOWN) {//右键
chess_x = 50 * (int)((mMsg.x + 25) / 50);
chess_y = 50 * (int)((mMsg.y + 25) / 50);
std::cout << "out:x:" << chess_x << "y:" << chess_y << std::endl;
std::cout << "右键x:" << mMsg.x << "y:" << mMsg.y << std::endl;
if (chess_x <= 475 && chess_x>=25 && chess_y <= 475 && chess_y >= 25) {
if (record[chess_y / 50 - 1][chess_x / 50 - 1] == 0) {
solidcircle(chess_x, chess_y, 20);
if (flag == 1) {
record[chess_y / 50 - 1][chess_x / 50 - 1] = 1;
flag = 0;
setfillcolor(BLACK);
}
else if (flag == 0) {
flag = 1;
record[chess_y / 50 - 1][chess_x / 50 - 1] = 2;
setfillcolor(WHITE);
}
}
for (int i = 0;i < 9;i++) {
for (int j = 0;j < 9;j++) {
std::cout << record[i][j] << " ";
}
std::cout << std::endl;
}
}
if (winner2(record) > 0) {
if (winner(record) == 2) {
MessageBox(NULL,"黑棋胜利","Game Over",MB_OK);
std::cout << "黑棋胜利" << std::endl;
//outtextxy(505, 100, "黑棋胜利");
}
else if (winner(record) == 1) {
MessageBox(NULL, "白棋胜利", "Game Over", MB_OK);
std::cout << "白棋胜利" << std::endl;
//outtextxy(505, 100, "白棋胜利");
}
break;
};
}
else if (mMsg.uMsg == WM_RBUTTONDOWN) {//左键
std::cout << "左键x:" << mMsg.x << "y:" << mMsg.y << std::endl;
}
//优化点位
}
}
int winner2(int record[9][9]) {//winner优化
int flag1_col = 0, flag2_col = 0;//横向
int flag1_line = 0, flag2_line = 0;//竖向
int flag1_xy = 0, flag2_xy = 0;//右上左下向
int flag1_yx = 0, flag2_yx = 0;//左上右下下向
for (int i = 0;i < 9;i++) {//横向,竖向
flag1_col = 0, flag2_col = 0;//横向
flag1_line = 0, flag2_line = 0;//竖向
for (int j = 0;j < 5;j++) {
if (record[i][j] == 1) {
flag1_col += 1;
flag1_line += 1;
for (int m = 1;m < 5;m++) {////横向
if (record[i][j + m] == 1) {
flag1_col += 1;
}
else {
flag1_col = 0;
}
if (record[i + m][j] == 1) {//竖向
flag1_line += 1;
}
else {
flag1_line = 0;
}
}
}
else if (record[i][j] == 2) {
flag2_col += 1;
flag2_line += 1;
for (int m = 1;m < 5;m++) {
if (record[i][j + m] == 2) {
flag2_col += 1;
}
else {
flag2_col = 0;
}
if (record[i + m][j] == 2) {//竖向
flag2_line += 1;
}
else {
flag2_line = 0;
}
}
}
if (flag2_col == 5 || flag1_col == 5 || flag2_line == 5 || flag1_line == 5) {
break;
}
}
if (flag2_col == 5 || flag1_col == 5 || flag2_line == 5 || flag1_line == 5) {
break;
}
}
if (flag2_col == 5 || flag2_line == 5) {
//std::cout << "黑棋胜利" << std::endl;
return 2;
}
else if (flag1_col == 5 || flag1_line == 5) {
//std::cout << "白棋胜利" << std::endl;
return 1;
}
//斜向,右上至左下
for (int i = 0;i < 9;i++) {
flag1_xy = 0;
flag2_xy = 0;
for (int j = 4;j < 9;j++) {
if (record[i][j] == 1) {
flag1_xy += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j - m] == 1) {
flag1_xy += 1;
}
else {
flag1_xy = 0;
break;
}
}
}
else if (record[i][j] == 2) {
flag2_xy += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j - m] == 2) {
flag2_xy += 1;
}
else {
flag2_xy = 0;
break;
}
}
}
if (flag2_xy == 5 || flag1_xy == 5) {
break;
}
}
if (flag2_xy == 5 || flag1_xy == 5) {
break;
}
}
if (flag2_xy == 5) {
//std::cout << "黑棋胜利" << std::endl;
return 2;
}
else if (flag1_xy == 5) {
//std::cout << "白棋胜利" << std::endl;
return 1;
}
//斜向,左上至右下
for (int i = 0;i < 5;i++) {
flag1_yx = 0;
flag2_yx = 0;
for (int j = 0;j < 5;j++) {
if (record[i][j] == 1) {
flag1_yx += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j + m] == 1) {
flag1_yx += 1;
}
else {
flag1_yx = 0;
break;
}
}
}
else if (record[i][j] == 2) {
flag2_yx += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j + m] == 2) {
flag2_yx += 1;
}
else {
flag2_yx = 0;
break;
}
}
}
if (flag2_yx == 5 || flag1_yx == 5) {
break;
}
}
if (flag2_yx == 5 || flag1_yx == 5) {
break;
}
}
if (flag2_yx == 5) {
//std::cout << "黑棋胜利" << std::endl;
return 2;
}
else if (flag1_yx == 5) {
//std::cout << "白棋胜利" << std::endl;
return 1;
}
return 0;
}
int winner(int record[9][9]) {
//横向
int flag1 = 0;
int flag2 = 0;
for (int i = 0;i < 9;i++) {
flag1 = 0;
flag2 = 0;
for (int j = 0;j < 5;j++) {
if (record[i][j]==1 ) {
flag1 += 1;
for (int m = 1;m < 5;m++) {
if (record[i][j+m] == 1) {
flag1 += 1;
}
else {
flag1 = 0;
break;
}
}
}
else if (record[i][j] == 2) {
flag2 += 1;
for (int m = 1;m < 5;m++) {
if (record[i][j + m] == 2) {
flag2 += 1;
}
else {
flag2 = 0;
break;
}
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5 ) {
//std::cout << "黑棋胜利" << std::endl;
return 2;
}
else if(flag1 == 5){
//std::cout << "白棋胜利" << std::endl;
return 1;
}
//竖向
for (int i = 0;i < 5;i++) {
flag1 = 0;
flag2 = 0;
for (int j = 0;j < 9;j++) {
if (record[i][j] == 1) {
flag1 += 1;
for (int m = 1;m < 5;m++) {
if (record[i+m][j] == 1) {
flag1 += 1;
}
else {
flag1 = 0;
break;
}
}
}
else if (record[i][j] == 2) {
flag2 += 1;
for (int m = 1;m < 5;m++) {
if (record[i+m][j] == 2) {
flag2 += 1;
}
else {
flag2 = 0;
break;
}
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5) {
//std::cout << "黑棋胜利" << std::endl;
return 2;
}
else if (flag1 == 5) {
//std::cout << "白棋胜利" << std::endl;
return 1;
}
//斜向,右上至左下
for (int i = 0;i < 9;i++) {
flag1 = 0;
flag2 = 0;
for (int j = 4;j < 9;j++) {
if (record[i][j] == 1) {
flag1 += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j-m] == 1) {
flag1 += 1;
}
else {
flag1 = 0;
break;
}
}
}
else if (record[i][j] == 2) {
flag2 += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j-m] == 2) {
flag2 += 1;
}
else {
flag2 = 0;
break;
}
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5) {
//std::cout << "黑棋胜利" << std::endl;
return 2;
}
else if (flag1 == 5) {
//std::cout << "白棋胜利" << std::endl;
return 1;
}
//斜向,左上至右下
for (int i = 0;i < 5;i++) {
flag1 = 0;
flag2 = 0;
for (int j = 0;j < 5;j++) {
if (record[i][j] == 1) {
flag1 += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j + m] == 1) {
flag1 += 1;
}
else {
flag1 = 0;
break;
}
}
}
else if (record[i][j] == 2) {
flag2 += 1;
for (int m = 1;m < 5;m++) {
if (record[i + m][j + m] == 2) {
flag2 += 1;
}
else {
flag2 = 0;
break;
}
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5 || flag1 == 5) {
break;
}
}
if (flag2 == 5) {
//std::cout << "黑棋胜利" << std::endl;
return 2;
}
else if (flag1 == 5) {
//std::cout << "白棋胜利" << std::endl;
return 1;
}
return 0;
}
运行后结果如下: