基于c语言编写的五子棋小游戏

《程序设计与算法综合训练》课程设计(4人团队合作作品)

//程序名:源.cpp
//功能:五子棋游戏人人对战
#include <stdio.h>//定义输入输出函数
#include<graphics.h>//图形库的头文件
#include<math.h>//说明要用常用的一些数学运算
#include<windows.h>//添加背景音乐的前提
#include<mmsystem.h>//添加背景音乐
#pragma comment(lib,"winmm.lib")//添加背景音乐
void initgame();//定义游戏界面的函数
void playchess();//定义五子棋游戏的函数
int judgeWin(int a, int b);//定义游戏胜负判断规则
#define N 20 //把棋盘抽象为二维数组
int board[N][N] = { 0 };
int whoseturn = 0;//两个人轮流落子
HWND  hWnd;

int main()
{
	//黑窗口//借用操作系统的dos窗口	//创建一个自己的窗口
	initgame();
	playchess();
	getchar();//防闪退
	return 0;
}

//初始化游戏界面
void initgame()
{
	initgraph(650,600);//创建一个自己的窗口宽650,高600
PlaySound(TEXT("F:\\五子棋\\2.wav"), NULL, SND_FILENAME|SND_ASYNC);
//加载背景音乐
	loadimage(NULL, _T("D:\\1.jpg"));//加载图片
	for(int i = 1;i < 20; i++)
	{
		setlinecolor(BLACK);//设置线条颜色为黑色
		line(i * 25, 0, i * 25, 500);//添加线条(初始点横纵坐标,结束点横纵坐标)
		line(0, i * 25, 500, i * 25);
	}
	setlinestyle(PS_SOLID, 2);//设置线条样式加粗
	line(500, 0, 500, 500);

	outtextxy( 510, 50, L"黑棋:玩家一");//输出文字(横纵坐标,文字内容)
	outtextxy( 510, 80, L"白棋:玩家二");
}
void playchess()
{
	int i, j;
	int a = 0, b = 0;
	int x=0 , y=0 ;
	MOUSEMSG m;//定义鼠标类型,结构体,取名为m
	hWnd=GetHWnd();//获取窗口的handle(索引)即位置
	while(1)
	{
		m= GetMouseMsg();//获取鼠标消息
		for (i = 1;i < 20; i++)
		{
			for(j = 1; j <20; j++)
			{
				if(abs(i * 25 - m.x) < 12.5&&abs(j *25 - m.y)<12.5)//绝对值 abs() 
				{
					x = i * 25;//把数组下标转换成坐标
					y = j * 25;
					a = i;
					b = j;
				}
			}
		}
		if (m.uMsg == WM_LBUTTONDOWN)//确定是鼠标左键获取的信息
		{
		    if(board[a][b] != 0)//有棋子		
	{
				MessageBox(hWnd, L"这里已经有棋子了", L"请重新选择落棋点", MB_OK);//判断鼠标选择的点是否有棋子
				continue;
			}
			if(whoseturn % 2 == 0)//判断轮到谁的回合
			{
			   outtextxy(505, 200, L"请玩家二落子”);
			   setfillcolor(BLACK);//落子颜色为黑色
			   solidcircle(x, y, 10);//以(x,y)为圆心画一个半径为10的圆
			   board[a][b] = 1;//该落子点为玩家1
			}
			else
			{
               outtextxy(505, 200, L"请玩家一落子”);
			   setfillcolor(WHITE);//落子颜色为白色
			   solidcircle(x, y, 10);//以(x,y)为圆心画一个半径为10的圆
			   board[a][b] = 2;//该落子点为玩家2
			}
			whoseturn++;
		}
    if (judgeWin(a, b))
		{
			if (whoseturn % 2 == 1)
			{
				MessageBox(hWnd, L"玩家一胜利", L"游戏结束", MB_OK);
				exit(0);//退出程序
			}
			else
			{
				MessageBox(hWnd, L"玩家二胜利", L"游戏结束", MB_OK);
				exit(0);//退出程序
			}
		}
	}
}
//判断输赢
int judgeWin(int a, int b)
{
	int i, j;
	int t = 2 - whoseturn % 2;//判断是哪个玩家
	for(i = a - 4 , j =b; i <= a; i++)
	{
		if(i >= 1 && i <= 15 && 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 <= b; j++)
	{
		if(j >= 1 && j <= 15 && 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 ; j <= b, i <= a ; j++ , i++)
	{
		if(i >= 1 && i <= 15 && j >= 1 && j <= 15 && 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 >= 1 ; j--, i++)
	{
		if(i >= 1 && i <= 15 && j >= 1 && j <= 15 && 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;
	}//向上斜五子连线
	return 0;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里是一个简单的五子棋人机对战的 C 代码,可以供您参考。 ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 15 #define COL 15 char board[ROW][COL]; // 棋盘 // 初始化棋盘 void InitBoard() { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = ' '; } } } // 打印棋盘 void PrintBoard() { int i, j; printf(" "); for (i = 0; i < ROW; i++) { printf("%d ", i); } printf("\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { printf("%c|", board[i][j]); } printf("\n"); } } // 判断胜负 int IsWin(char c) { int i, j, k; // 横向判断 for (i = 0; i < ROW; i++) { for (j = 0; j < COL - 4; j++) { for (k = 0; k < 5; k++) { if (board[i][j+k] != c) { break; } } if (k == 5) { return 1; } } } // 纵向判断 for (i = 0; i < ROW - 4; i++) { for (j = 0; j < COL; j++) { for (k = 0; k < 5; k++) { if (board[i+k][j] != c) { break; } } if (k == 5) { return 1; } } } // 斜向判断 for (i = 0; i < ROW - 4; i++) { for (j = 0; j < COL - 4; j++) { for (k = 0; k < 5; k++) { if (board[i+k][j+k] != c) { break; } } if (k == 5) { return 1; } } } // 反斜向判断 for (i = 4; i < ROW; i++) { for (j = 0; j < COL - 4; j++) { for (k = 0; k < 5; k++) { if (board[i-k][j+k] != c) { break; } } if (k == 5) { return 1; } } } return 0; } // 人下棋 void PlayerMove() { int x, y; while (1) { printf("请输入坐标(x y):"); scanf("%d %d", &x, &y); if (x < 0 || x >= ROW || y < 0 || y >= COL || board[x][y] != ' ') { printf("坐标输入有误,请重新输入!\n"); } else { board[x][y] = '*'; break; } } } // 电脑下棋 void ComputerMove() { int x, y; srand((unsigned int)time(NULL)); while (1) { x = rand() % ROW; y = rand() % COL; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } // 主函数 int main() { InitBoard(); PrintBoard(); while (1) { PlayerMove(); PrintBoard(); if (IsWin('*')) { printf("恭喜你,你赢了!\n"); break; } ComputerMove(); PrintBoard(); if (IsWin('#')) { printf("很遗憾,你输了!\n"); break; } } return 0; } ``` 这个代码实现了一个简单的五子棋人机对战,人执黑子,电脑执白子。电脑下棋使用了随机策略,没有使用更加智能的算法。如果您想要提高电脑的水平,可以尝试使用更加高级的算法,比如 Alpha-Beta 剪枝、蒙特卡罗树搜索等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值