欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

easyx游戏编程:五子棋(C语言游戏开发)

程序员文章站 2022-04-07 17:22:45
...

easyx游戏编程:五子棋(C语言游戏开发)

五子棋:

本游戏用到了图形界面库graphics.h,图形界面库下载安装:

下载链接: https://easyx.cn/downloads/.
下方有源码。

功能实现:

玩家对战,人机对战,音乐播放,重开,悔棋,投降等。
easyx游戏编程:五子棋(C语言游戏开发)
所以要完成上面的功能,我们要:

  • 欢迎界面和游戏界面
  • 游戏场景绘制(棋盘绘画)
  • 玩家操作
  • 游戏功能(重开,悔棋等)
  • 对战模式(人机和双人)
  • AI算法

具体实现:

界面:

我们先设置窗口背景颜色,清理画布,然后设置文字颜色,设置窗口透明,设置文字大小,字体与内容
欢迎界面:

void hello() 
{
	initgraph(800, 600);    	//设置窗口大小
	setbkcolor(WHITE);		//设置背景为白色
	cleardevice();			//清理画布

	mciSendString(TEXT(" open 音乐.mp3 alias mysong"), NULL, 0, NULL);	//选择音乐
	mciSendString(TEXT("play mysong"), NULL, 0, NULL);			//播放音乐
}

游戏界面:

 initgraph(600, 800);
 cleardevice();
 settextcolor(RED);     			//设置文字颜色
 setbkmode(TRANSPARENT);    			//设置窗口透明
 settextstyle(128, 0, "宋体");  			//设置字体大小、宽度、字体
 outtextxy(100, 100, "五子棋");
 setlinecolor(RED);
 rectangle(150, 300, 450, 650);
 rectangle(160, 310, 440, 640);
 line(160, 420, 440, 420);
 line(160, 530, 440, 530);
 settextstyle(65, 0, "华文琥珀");
 outtextxy(170, 340, "人机大战");
 outtextxy(170, 450, "双人对战");
 outtextxy(170, 560, "联系作者");
 setlinecolor(WHITE);
 settextcolor(WHITE);
 settextstyle(23, 0, "华文琥珀");
 outtextxy(527, 37, "音乐");
 circle(550, 50, 25);

棋盘:

绘画出棋盘
棋盘绘制:

void board()
{
initgraph(1200, 800);			//设置窗口大小
setbkcolor(BLACK);
cleardevice();
setlinecolor(WHITE);
for (int i = 50; i <= 750; i += 50)	//使用for循环绘制棋盘
{
 	line(i, 50, i, 750);
  	line(50, i, 750, i);
}
for (int i = 200; i < 800; i += 400)
{
 	for (int j = 200; j < 800; j += 400)
	 fillcircle(i, j, 5);
}
}

棋子绘制:

setrop2(R2_COPYPEN); 		//二元光栅操作码:R2_COPYPEN当前颜色
setfillcolor(RED);		//红方棋子
fillcircle(m.x, m.y, 20);
setfillcolor(WHITE);		//白方棋子
fillcircle(m.x, m.y, 20);

玩家操作:

定义鼠标,使用鼠标来模拟落子操作

MOUSEMSG m; 			// 定义鼠标消息
m = GetMouseMsg();		//获取鼠标消息
if (m.uMsg == WM_LBUTTONDOWN)   // 使用鼠标左键进行操作
{
	int x,y;
	if (x >= 25)			//锁定鼠标,使落子在棋盘中心
  		m.x = m.x - x + 50;
  	else
  	 	m.x = m.x - x;
   	if (y >= 25)
  		m.y = m.y - y + 50;
  	else
  	  	m.y = m.y - y;

}

游戏功能:

重开:
即重绘棋盘,调用绘画棋盘函数board()即可。
悔棋:
使用数组定义落子位置,记录每次上次落子的位置,重新绘制即可。

	int red[15][15],white[15][15],stick[15][15];		//设置红方落子,白方落子以及该位置是否落子
	board();

投降:
判断现在是哪一方落子,点击投降即该方落败。
音乐播放/暂停:

int cont=0if (cont % 2 == 0)
    {
     mciSendString(TEXT("pause mysong"), NULL, 0, NULL);
     cont++;		//暂停音乐
    }
    else
    {
     mciSendString(TEXT("resume mysong"), NULL, 0, NULL);
     cont++;		//播放音乐
    }

胜利判断:
因为开始使用数组进行标记,由返回值判断五子是否连成一线。

int success(int x[15][15])
{
 int m, n;
 for (m = 0; m < 15; m++)
 {
  for (n = 0; n < 15; n++)
  {
   if (x[m][n] == 1 && x[m][n + 1] == 1 && x[m][n + 2] == 1 && x[m][n + 3] == 1 && x[m][n + 4] == 1)return 1;
   if (x[m][n] == 1 && x[m + 1][n] == 1 && x[m + 2][n] == 1 && x[m + 3][n] == 1 && x[m + 4][n] == 1)return 1;
   if (x[m][n] == 1 && x[m + 1][n + 1] == 1 && x[m + 2][n + 2] == 1 && x[m + 3][n + 3] == 1 && x[m + 4][n + 4] == 1)return 1;
   if (n > 3 && x[m][n] == 1 && x[m + 1][n - 1] == 1 && x[m + 2][n - 2] == 1 && x[m + 3][n - 3] == 1 && x[m + 4][n - 4] == 1)return 1;
  }
 }
 return 0;
}

人机算法:

我这个AI的算法只是比较简单的,或者说是呆,如果大家想写一些NB一点的,对五子棋感兴趣的可以使用权值判断来编写人机代码。

源码