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语言 学生管理系统