C语言大一课设——不会五子棋

Posted 老墨墨pro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言大一课设——不会五子棋相关的知识,希望对你有一定的参考价值。

大一课程设计——不会五子棋

在编写此次课程设计后,我了解到其实C语言不但可以在黑白色的命令提示符界面进行运行,还可以有很美观的窗口界面。课程设计中我完成了自学EasyX这一图形库内各种函数的使用,不仅掌握了如何学习课本之外的知识,更获得了通过交流论坛和查找资料解决实际应用中的问题的能力。对于这个初级的五子棋小游戏仍有许多可以改进的地方,比如写一个智能化程度更高的AI,亦或是写个电脑对战电脑的DLC,作为计算机专业的学生的乐趣也在于这种理解和创造的过程。

一.简单双人五子棋

简单的双人五子棋只需要克服绘制(插入)棋盘、放置棋子和判断胜负几个难点,可以用来熟悉EasyX的基本操作。
可以使用EasyX实现棋盘图片的插入(附上棋盘图片)。

代码展示:

#include <graphics.h>
#include <stdio.h>
#include <windows.h>
int chess[35][35];				  
int judge(int x, int y, int type) //左右上下斜判断

	// x = (x + 15) / 25;
	// y = (y + 15) / 25;
	int i = 0, number = 0;
	for (i = 0; i < 4; i++) //上
	
		if (chess[x][y - i - 1] == type && y - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //下
	
		if (chess[x][y + i + 1] == type)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //左
	
		if (chess[x - i - 1][y] == type && x - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //右
	
		if (chess[x + i + 1][y] == type)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //左上
	
		if (chess[x - i - 1][y - i - 1] == type && x - i - 1 >= 0 && y - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //右上
	
		if (chess[x + i + 1][y - i - 1] == type && y - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //左下
	
		if (chess[x - i - 1][y + i + 1] == type && x - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //右下
	
		if (chess[x + i + 1][y + i + 1] == type)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	return 0;


int make(int x, int y, int type)

	int x1, y1, n = 5;
	if (x < 15 || y < 15 || y >= 385 || x >= 385)
		return 0;
	else
	
		x = (x + 15) / 25;
		y = (y + 15) / 25;
		if (chess[x][y] != 0)
			return 0;
		else
		
			x1 = x * 25;
			y1 = y * 25;
			if (type == 1)
			
				setfillcolor(BLACK);
				chess[x][y] = 1;
			

			else
			
				setfillcolor(WHITE);
				chess[x][y] = 2;
			
			fillcircle(x1, y1, 5);
			n = judge(x, y, type);
			if (n == 1) //五子连珠
				return 2;
			else
				return 1;
		
	

int main()

	HWND my_consle = GetForegroundWindow();
	ShowWindow(my_consle, SW_SHOW);
	int choice = 0, n = 5;
	IMAGE img;
	MOUSEMSG m;
	loadimage(&img, L"五子棋棋盘.gif"); 
	int w, h;
	w = img.getwidth();
	h = img.getheight();
	initgraph(w, h);
	putimage(0, 0, &img);
	while (1)
	
	out:
		Sleep(5);
		m = GetMouseMsg();
		if (m.uMsg == WM_LBUTTONDOWN && choice == 0) //
		
			n = make(m.x, m.y, 1); 
			if (n == 1)
				choice = 1;
			else if (n == 2)
			
				settextstyle(20, 0, L"楷体");
				setbkmode(TRANSPARENT);
				settextcolor(RED);
				outtextxy(120, 150, L"黑方胜利");
				break;
			
			else
				goto out;
		
		else if (m.uMsg == WM_LBUTTONDOWN && choice == 1)
		
			n = make(m.x, m.y, 2); 
			if (n == 1)
			
				choice = 0;
			
			else if (n == 2)
			
				settextstyle(20, 0, L"楷体");
				setbkmode(TRANSPARENT); 
				settextcolor(RED);
				outtextxy(120, 150, L"白方胜利");
				break;
			
			else
				goto out;
		
		else
			continue;
	
	getchar();

1.judge函数

int judge(int x, int y, int type) //左右上下斜判断

	// x = (x + 15) / 25;
	// y = (y + 15) / 25;
	int i = 0, number = 0;
	for (i = 0; i < 4; i++) //上
	
		if (chess[x][y - i - 1] == type && y - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //下
	
		if (chess[x][y + i + 1] == type)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //左
	
		if (chess[x - i - 1][y] == type && x - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //右
	
		if (chess[x + i + 1][y] == type)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //左上
	
		if (chess[x - i - 1][y - i - 1] == type && x - i - 1 >= 0 && y - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //右上
	
		if (chess[x + i + 1][y - i - 1] == type && y - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //左下
	
		if (chess[x - i - 1][y + i + 1] == type && x - i - 1 >= 0)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	for (i = 0; i < 4; i++) //右下
	
		if (chess[x + i + 1][y + i + 1] == type)
		
			number++;
		
	
	if (number == 4)
		return 1;
	else
		number = 0;
	return 0;

judge函数判断先向上检索,若该方向上检索,若连续四个棋子颜色一致则number=4且返回返回值1,否则number依然为0并进行另一方向的检索直至八个方向结束或出现五子连珠。

2.make函数

int make(int x, int y, int type)

	int x1, y1, n = 5;
	if (x < 15 || y < 15 || y >= 385 || x >= 385)
		return 0;
	else
	
		x = (x + 15) / 25;
		y = (y + 15) / 25;
		if (chess[x][y] != 0)
			return 0;
		else
		
			x1 = x * 25;
			y1 = y * 25;
			if (type == 1)
			
				setfillcolor(BLACK);
				chess[x][y] = 1;
			

			else
			
				setfillcolor(WHITE);
				chess[x][y] = 2;
			
			fillcircle(x1, y1, 5);
			n = judge(x, y, type);
			if (n == 1) //五子连珠
				return 2;
			else
				return 1;
		
	

make函数用于绘制棋子,并为judge函数提供坐标以判断胜负

二.人机五子棋

1.内容提要

在初步还原了简单五子棋的实现方法后就可以尝试更高级的界面、更高级的AI,因此我选择五子棋作为课程设计。
本五子棋学习了https://blog.csdn.net/qq_45669199/article/details/101145656和https://blog.csdn.net/ChinaJane163/article/details/52599787两篇文章作为参考。
人机对战参考了用评估函数求评估值的方法实现电脑落子,评估函数的对象为(假设电脑为白子):
【1】多少白子连成线(因为越多白子练成线,对电脑越有利)
【2】多少将要连成线的黑子,被这个白子打断了(还要考虑填了这个子后,电脑对人所落的子的破坏)。
评估函数得到的值越大,电脑越倾向在那个位置落子。简单的说,就是此AI返回的是第一个评估值最高的位置。

2.设计内容

3.功能模块详细设计

3.1 游戏初始化

设置窗口大小与背景图片一致,让窗口名称变为“不会五子棋”并使用API函数修改窗口名称。加载多张图片以实现颜色的动态效果,通过鼠标移动和点击的位置实现背景的变化和交互。

void initgame()

	//设置窗口大小
	initgraph(500, 750);

	//让窗口名称变成不会五子棋
	// 获得窗口句柄
	HWND hWnd = GetHWnd();
	// 使用 API 函数修改窗口名称
	SetWindowText(hWnd, "不会五子棋");

B:;
	//加载图片
	IMAGE background;
	loadimage(&background, "back.jpg", 500, 750);
	putimage(0, 0, &background);

	//设置背景颜色
	setbkcolor(RGB(195, 195, 195)); //目的是为了让显示的文字看起来没有边框

	//设置五张图片来显示出颜色动态效果
	IMAGE ch1, ch2, ch3, ch4, ch5, ch6;
	loadimage(&ch1, "1.jpg", 500, 750);
	loadimage(&ch2, "2.jpg", 500, 750);
	loadimage(&ch3, "3.jpg", 500, 750);
	loadimage(&ch4, "4.jpg", 500, 750);

	//游戏界面选择
	MOUSEMSG m; // 定义鼠标消息

	while (true)
	
		// 获取鼠标消息
		m = GetMouseMsg();

		//清除鼠标缓存
		FlushMouseMsgBuffer();

		//放置背景避免黑屏
		C语言 学生管理系统

AI五子棋-利用最简单的C语言实现

AI五子棋第一篇-利用最简单的C语言实现

大一课设 消灭星星

C语言学生管理系统中有点疑问

C语言实现五子棋简单功能