五子棋代码C语言实现(数据结构实训)
这是我大一时候组队合作写的五子棋小游戏代码,实现了人人对战,人机对战,悔棋(该功能真正做到不可多步悔棋,每次只能悔棋一步),音乐开关功能,当看到界面实现的那一刻,我掉落的头发都是值得的!!!下面贴上源代码(顺便附上我的美工之后的界面图嘻嘻嘻)
实现界面如下:
主界面
游戏说明界面
五子棋界面
人机对战
悔棋功能
代码如下:
#include<graphics.h>//图形库头文件
#include<math.h>
#include<mmsystem.h>//倒入声音头文件
#pragma comment(lib,"winmm.lib")//播放音乐库头文件
#include<windows.h>;
int flag = 0;//表示下棋次数
int board[15][15] = {
0 };//初始化棋盘的状态
int score[15][15] = {
0 };//初始化棋盘的分数
int rrhuiqi[2];
int rjhuiqi[2][2];
int judge(int a, int b);
void Chess_ai_naive(int& x, int& y);//电脑获取最优解位置
void evaluate_naive();
void youxishuoming();
void manvsmanplayChess();
void manvsaiplayChess();
void ChessBorad();
//游戏大厅设计
void initGame()
{
HWND hWnd = GetHWnd();//获取窗口句柄,即窗口的唯一标识符
SetWindowText(hWnd, "五子棋游戏");//改变窗口标题
IMAGE backgrand;//创建一个图像对象
loadimage(&backgrand, "背景1.jpg", 700, 700);//装载光标,图标,位图,此为装载游戏大厅背景图
putimage(0, 0, &backgrand);//在屏幕上输出一个位图
MOUSEMSG m; // 定义鼠标消息
while (true)
{
// 获取一条鼠标消息
m = GetMouseMsg();
//避免黑屏
//putimage(0, 0, &backgrand);
switch (m.uMsg)
{
case WM_LBUTTONDOWN: //当在“客户区”按下鼠标的消息
if (m.x >= 250 && m.x <= 450 && m.y >= 270 && m.y <= 340) //玩家对战区域
{
ChessBorad(); //棋盘界面初始化
manvsmanplayChess();//人人对战
}
if (m.x >= 250 && m.x <= 450 && m.y >= 370 && m.y <= 440) //人机对战区域
{
ChessBorad();
manvsaiplayChess();//人机对战
}
if (m.x >= 430 && m.x <= 620 && m.y >= 520 && m.y <= 575) //音乐开区域
{
mciSendString("open 音乐.mp3", 0, 0, 0);//设置背景音乐 多媒体控制接口
mciSendString("play 音乐.mp3", 0, 0, 0);
}
if (m.x >= 430 && m.x <= 620 && m.y >= 590 && m.y <=650) //音乐关区域
{
mciSendString("pause 音乐.mp3", NULL, 0, NULL);
}
if (m.x >= 150 && m.x <= 350 && m.y >= 520 && m.y <= 580) {
//游戏说明
youxishuoming();
}
if (m.x >= 150 && m.x <= 350 && m.y >= 600 && m.y <= 700) {
//退出游戏
exit(0);
}
}
}
}
//游戏说明函数
void youxishuoming() {
IMAGE h2;
loadimage(&h2, "背景3.jpg", 700, 700);
putimage(0, 0, &h2);
MOUSEMSG mg;
while (true) {
mg = GetMouseMsg();
//避免黑屏
putimage(0, 0, &h2);
switch (mg.uMsg)
{
case WM_LBUTTONDOWN:
if (mg.x >= 400 && mg.x <= 660 && mg.y >= 450 && mg.y <= 600)//返回大厅界面区域
{
initGame();
}
}
}
}
//初始化游戏棋盘界面
void ChessBorad() {
loadimage(NULL, "背景2.jpg", 700, 700);
setlinecolor(BLACK);//画线条为黑色
for (int i = 175; i <550; i += 25)//循环画线
{
line(i, 175, i, 525);//画线函数,画竖线:第一个点(i,175),第二个点(i,525)
line(175, i, 525, i);//画横线,第一个点(175,i),第二个点(525,i)
setfillcolor(BLACK);
solidcircle(350, 350, 3);
solidcircle(250, 250, 3);
solidcircle(450, 250, 3);
solidcircle(250, 450, 3);
solidcircle(450, 450, 3);
}
}
//人人对决函数
void manvsmanplayChess()
{
MOUSEMSG m;//保存鼠标消息
int x, y;
int a =