基于EasyX 的五子棋小游戏。
Posted bosaidongmomo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于EasyX 的五子棋小游戏。相关的知识,希望对你有一定的参考价值。
EasyX下载地址
// 五子棋.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include<windows.h>
#include <time.h>
#include <string>
#pragma warning(disable:4996)
enum ChessPieceColor {
white = 1,
blue = 2,
/* any your want color here */
};
int x = 25, y = 25; //初始坐标
int board[21][21] = { 0 }; //棋盘占位数组
void InitGame() //棋盘初始化
{
initgraph(600, 500);
setlinecolor(RED);
for (int i = 0; i < 20; i++)
{
line(0, i * 25, 500, i * 25);
line(i * 25, 0, i * 25, 500);
}
setlinestyle(PS_SOLID, 2); //画实线 宽度2
line(500, 0, 500, 500);
outtextxy(512, 60, _T("玩家1:白棋"));
outtextxy(512, 180, _T("W,A,S,D移动"));
outtextxy(512, 210, _T("G键下棋子"));
outtextxy(512, 120, _T("玩家2:蓝棋"));
setfillcolor(WHITE); //棋盘白字初始位置
board[1][1] = 1;
solidcircle(x, y, 12);
}
int flag = 1; //标记下棋状态
char key; //检测键盘按键
void InitMove() //棋子移动初步判断部分
{
switch (key) {
case 'w': //上
y -= 25;
break;
case 's': //下
y += 25;
break;
case 'a'://左
x += 25;
break;
case 'd': //右
x -= 25;
break;
default:
break;
}
if (x < 0)x = 500;
if (y > 500)y = 0;
if (x > 500)x = 0;
if (y < 0)y = 500;
}
//判断获胜条件
int judge(int a, int b)
{
int i, j;
int t = 2 - flag % 2;
for ((i = a - 4) && (j = b); i <= a; i++) //横向
{
if (i >= 1 && i < 16 && t == board[i][j] && t == board[i + 1][j] && t == board[i + 2][j] && t == board[i + 3][j] && t == board[i + 4][j])
return 1;
}
for ((i = a) && (j = b - 4); j <= a; j++) //竖向
{
if (j >= 1 && j < 16 && t == board[i][j] && t == board[i][j + 1] && t == board[i][j + 2] && t == board[i][j + 3] && t == board[i][j + 4])
return 1;
}
for ((i = a - 4) && (j = b - 4); ((i <= a) && (j >= b)); i++, j++) //斜下
{
if (i >= 1 && i < 16 && j >= 1 && j < 16 && t == board[i][j] && t == board[i + 1][j + 1] && t == board[i + 2][j + 2] && t == board[i + 3][j + 3] && t == board[i + 4][j + 4])
return 1;
}
for ((i = a - 4) && (j = b + 4); ((i <= a) && (j >= b)); i++, j--) //斜上
{
if (i >= 1 && i < 16 && j >= 1 && j < 16 && t == board[i][j] && t == board[i + 1][j - 1] && t == board[i + 2][j - 2] && t == board[i + 3][j - 3] && t == board[i + 4][j - 4])
return 1;
}
}
// 棋子的英文怎么拼 baby
void DrawChessPieces(short x, short y, ChessPieceColor color) {
switch (color) {
case ChessPieceColor::blue: {
setfillcolor(BLUE);
break;
}
case ChessPieceColor::white: {
setfillcolor(WHITE);
break;
}
}
solidcircle(x, y, 12);
}
//void Move() //棋子移动,以及该位置是否有棋子检测,并按G下棋
//{
// setfillcolor(BLACK); //消除上一步光标
// solidcircle(x, y, 12);
// key = getchar();
// InitMove();
// while (board[x / 25][y / 25] = 1)InitMove();//如果已经有棋子则跳转到下一个位置
// if (flag % 2 == 1) { setfillcolor(WHITE); };//根据flag数判断棋子颜色
// if (flag % 2 == 0) { setfillcolor(BLUE); };
// solidcircle(x, y, 12);
// if (getchar() == 'g' || 'G')
// {
// board[x / 25][y / 25] = 1;
// if (judge(x / 25, y / 25)) //每下完一次之后进行胜负判断
// {
// if (1 == flag % 2)
// {
// outtextxy(512, 400, _T("玩家2胜利"));
//
// return;
// }
// else
// {
// outtextxy(512, 60, _T("玩家胜利"));
// return;
// }
// }
// //如果没有结束,跳转到下一个棋子的位置
// InitMove();
// while (board[x / 25][y / 25] = 1)InitMove();
// }
//
//
//
//
// flag++;
// if (flag % 2 == 1) { setfillcolor(WHITE); };//根据flag数判断棋子颜色
// if (flag % 2 == 0) { setfillcolor(BLUE); };
// solidcircle(x, y, 12);
//
//}
MOUSEMSG m; int k;
bool judgeEdge(int x, int y) {
if (x >= 1 && x < 19 && y >= 1 && y < 19) {
return true;
}
else {
return false;
}
}
bool judgeWin(int x,int y, ChessPieceColor color) {
int judgeX = x;
int judgeY = y;
int ChessPieces = 1;
bool flag = false;
{
{
int judgeX = x;
int judgeY = y;
// 横向 向左
judgeX--;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeX--;
}
// 不满足直接退出
else {
break;
}
}
// 横向 向右
judgeX = x + 1;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeX++;
}
// 不满足直接退出
else {
break;
}
}
if (ChessPieces >= 5) {
flag = true;
}
else {
ChessPieces = 1;
}
}
{
// 横向 向左
judgeY--;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeY--;
}
// 不满足直接退出
else {
break;
}
}
// 横向 向右
judgeY = y + 1;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeY++;
}
// 不满足直接退出
else {
ChessPieces = 1;
}
}
if (ChessPieces >= 5) {
flag = true;
}
else {
ChessPieces = 1;
}
}
{
int judgeX = x;
int judgeY = y;
// 横向 向左
judgeY--;
judgeX--;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeY--;
judgeX--;
}
// 不满足直接退出
else {
break;
}
}
// 横向 向右
judgeY = y + 1;
judgeX = x + 1;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeY++;
judgeX++;
}
// 不满足直接退出
else {
ChessPieces = 1;
}
}
if (ChessPieces >= 5) {
flag = true;
}
else {
ChessPieces = 1;
}
}
{
int judgeX = x;
int judgeY = y;
// 横向 向左
judgeY++;
judgeX--;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeY++;
judgeX--;
}
// 不满足直接退出
else {
break;
}
}
// 横向 向右
judgeY = y - 1;
judgeX = x + 1;
while (board[judgeX][judgeY] == color) {
ChessPieces++;
// 如果满足边界
if (judgeEdge(judgeX, judgeY)) {
judgeY--;
judgeX++;
}
// 不满足直接退出
else {
ChessPieces = 1;
}
}
if (ChessPieces >= 5) {
flag = true;
}
else {
ChessPieces = 1;
}
}
}
return flag;
}
void Move() //鼠标点击下棋
{
int x, y;
m = GetMouseMsg();
if (m.mkLButton == 1) //点击下棋
{
char msg[200];
sprintf(msg, "x=%d,y=%d", m.x, m.y);
// MessageBoxA(NULL, msg, "鼠标在哪儿", NULL);
/*MessageBoxA(NULL, msg, "鼠标在哪儿", NULL);*/
/* 被你气死得 for什么for*/
// x=0,y=0 x=25,y=25
/*int x = m.x % 25 >12;
int y = m.y % 25;*/
int x = m.x / 25;
int y = m.y / 25;
int offsetX = m.x % 25 <= 12 ? 0 : 25;
int offsetY = m.y % 25 <= 12 ? 0 : 25;
x *= 25;
y *= 25;
x += offsetX;
y += offsetY;
if (x <= 500 && y <= 500 && x >= 0 && y >= 0) {
int boardX = x / 25;
int boardY = y / 25;
if (!board[boardX][boardY]) {
if (flag) {
DrawChessPieces(x, y, ChessPieceColor::blue);
board[boardX][boardY] = ChessPieceColor::blue;
bool winFlag = judgeWin(boardX, boardY, ChessPieceColor::blue);
if (winFlag) {
MessageBoxA(NULL, "WIN", "", NULL);
}
flag = false;
}
else {
DrawChessPieces(x, y, ChessPieceColor::white);
board[boardX][boardY] = ChessPieceColor::white;
bool winFlag = judgeWin(boardX, boardY, ChessPieceColor::white);
if (winFlag) {
MessageBoxA(NULL, "WIN", "", NULL);
}
flag = true;
}
}
}
/*if (m.x >= x && m.x <= (x + 25) && m.y >= y && y <= (y + 25))*/
//for (x = 12; x < 600; x += 25)
// for (y = 12; y < 500; y += 25)
// {
// if (m.x >= x && m.x <= (x + 25) && m.y >= y && y <= (y + 25))
// {
// if (board[(x + 13) / 25][(y + 13) / 25] = 0) //判断该位置是否有棋子
// {
// if (flag % 2 == 1) { setfillcolor(WHITE); };//根据flag数判断棋子颜色
// if (flag % 2 == 0) { setfillcolor(BLUE); };
// solidcircle(x + 13, y + 13, 12);
// board[(x + 13) / 25][(y + 13) / 25] = 1;
// flag++;
// }
// }
// }
}
FlushMouseMsgBuffer();
//if (judge(x / 25, y / 25)) //每下完一次之后进行胜负判断
//{
// if (1 == flag % 2)
// {
// k = 1;
// outtextxy(512, 400, _T("玩家2胜利"));
// return;
// }
// else
// {
// k = 1;
// outtextxy(512, 60, _T("玩家胜利"));
// return;
// }
//}
}
void main()
{
InitGame();
while (1)
Move();
}
以上是关于基于EasyX 的五子棋小游戏。的主要内容,如果未能解决你的问题,请参考以下文章