*声明:*这是我第一次发博客,我是大一新生,只学习了谭浩强著作的C语言程序设计,水平有限,有不足的地方,欢迎社区大佬指点。
设计原因
这个五子棋是c语言结课后要求我们制作的小游戏,开始一点思路也没有,借助优快云我学习到了一些思路(借助出处已标明),也有我原创的部分(统计棋子数,判断优先级,人机判定)。说实话优快云上真的有很多五子棋的设计,但是对于浅学C语言的我来说有些看不懂,所以我想设计一个初学者可以看得懂的小程序。
借用,改写出处
感谢社区大佬们的展示,分享
void Board_print();(借用原出处48-146行)
原作者:行者三个石
出处:https://blog.youkuaiyun.com/qq_33706673/article/details/78702710?utm_source=app&app_version=4.5.2
遵循 CC 4.0 BY-SA 版权协议
void getKey();(借用原出处239-311行)
void setPos(int x,int y);(借用原出处115-123行)
原作者:Tjohn9
出处:https://blog.youkuaiyun.com/Tjohn9/article/details/104487442?utm_source=app&app_version=4.5.2
遵循 CC 4.0 BY-SA 版权协议
程序运行展示
编译器
VS2010学习版,运行系统win10
win7棋盘显示会有问题,删除Board_print()函数中各字符后的空格即可
游戏说明
程序运行后请开大写键。
玩家1:方向键控制,回车下棋
玩家2:WASD控制,空格下棋
Backspace键:返回主菜单
Q:退出游戏
R:重新开始游戏
T:悔棋(人机对战悔棋请连续按两次)
V:定位光标在棋盘中央
流程图
菜单界面:
人机模式:
玩家对战:
机器判断代码
void robot()//值越小,优先级越高
{
int M=5,c=0,MD=5,u=0;
int jiluh,jilul,jiluc,jiluhh,jilull;
jiluc=Color;
//if(m<=4) 加上if语句限定,人机难度降低,但计算量大大减小
//{
Color=(Color+1)%2;//先判断玩家的优先级
m=5;
for(h=0;h<=(H-1);h++)//遍历一行棋盘
{
for(l=0;l<=(L-1);l++)//遍历一列棋盘
{
if(Color==qipan[h-1][l]||Color==qipan[h+1][l]||Color==qipan[h][l+1]||Color==qipan[h][l-1]||Color==qipan[h-1][l-1]||Color==qipan[h+1][l+1]||Color==qipan[h-1][l+1]||Color==qipan[h+1][l-1])//只有当附近有颜色相同的棋子时才会被输出,减少计算量
{
if(2==qipan[h][l])
{
if((h-1)>=0&&(h+1)<=(H-1)&&(l-1)>=0&&(l+1)<=(L-1))
{
qipan[h][l]=Color;
judge();
qipan[h][l]=2;
if(MD>=m)//取玩家的最高优先级
{
MD=m;
jiluhh=h;
jilull=l;
u=1;
}
}
}
}
}
}
//}
m=5;
Color=(Color+1)%2;//再判断自己的优先级
for(h=0;h<=(H-1);h++)
{
for(l=0;l<=(L-1);l++)
{
if(Color==qipan[h-1][l]||Color==qipan[h+1][l]||Color==qipan[h][l+1]||Color==qipan[h][l-1]||Color==qipan[h-1][l-1]||Color==qipan[h+1][l+1]||Color==qipan[h-1][l+1]||Color==qipan[h+1][l-1])
{
if(2==qipan[h][l])
{
if((h-1)>=0&&(h+1)<=(H-1)&&(l-1)>=0&&(l+1)<=(L-1))
{
qipan[h][l]=Color;
judge();
qipan[h][l]=2;
if(M>=m)//取本方的最高优先级
{
M=m;
jiluh=h;
jilul=l;
}
}
}
}
}
}
if(MD<M)//对手的优先级高于本方
{
m=MD;
h=jiluhh;
l=jilull;
Color=jiluc;
}
else if(MD>M)//对手的优先级低于本方
{
m=M;
h=jiluh;
l=jilul;
Color=jiluc;
}
else if(MD==M)//对手优先级等于本方
{
if(X==1)//机器先手
{
m=M;
h=jiluh;
l=jilul;
Color=jiluc;
}
else if(X==0)//玩家先手
{
if(u==0)//玩家此时无合适的棋子
{
m=M;
h=jiluh;
l=jilul;
Color=jiluc;
}
else if(u==1)//玩家有合适的棋子
{
m=MD;
h=jiluhh;
l=jilull;
Color=jiluc;
}
}
}
//printf("%d,%d",h,l);检查输出结果
//getchar();
}
头文件game.h
void Board_print();//打印棋盘
void Player();//显示当前哪个玩家下棋
void Board_initialize();//棋盘的初始化
void setting();//设置
void Board_setting();//棋盘规模设置
void menu();//菜单
void menu_choice()//菜单选择界面;
void color();//更改控制窗颜色
void game();//人人对战模式
void judge();//判断全局局势,判断输赢
void judge_shangxia();//统计纵向棋子数,判断纵向输赢
void judge_zuoyou();//统计横向棋子数,判断横向输赢
void judge_zuoshangyouxia();//统计从左上到右下棋子数,判断左上到右下输赢
void judge_youshangzuoxia();//统计从右上到左下棋子数,判断右上到左下输赢
void getKey();//获取用户下棋的位置
void huiqi();//悔棋
void setPos(int x,int y);//控制光标移动
void AIgame();//人机对战游戏
void robot();//机器判断
void robot_first();//机器先手
void player_first();//玩家先手
全部代码
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#include"game.h"
#define A 20//设置默认棋盘规模行
#define B 20//设置默认棋盘规模列
int h=0,l=0;
int H=0,L=0;
int d = 0;
int o = 0;
char qipan[200][200];
int Color=1;//棋子颜色
int k;
int m=5;//总优先级
int MM=5;//小范围的优先级
int I=0,J=0;//光标位置
int key,ch,get;
int zuo1=0,you1=0,shang1=0,xia1=0;
int zuo2=0,you2=0,shang2=0,xia2=0;
int zuoshang1=0,zuoshang2=0,youxia1=0,youxia2=0;
int youshang1=0,youshang2=0,zuoxia1=0,zuoxia2=0;
int hang[1000],lie[1000];//悔棋函数记录的步骤
int g=0,e=0,j=0;//悔棋函数记录
int b=0;
int X=0;
int youxi=0;//游戏模式记录
char a1[]="###### *AI GObang* ######";//菜单打印
char a2[]="####################################";//菜单打印
char a3[]=" ####################################";//菜单打印
void menu()
{
int right=strlen(a2)-1;
int left=0;
int i=0;
while(left+5<=right-5)
{
a2[right-5]=a1[right-5];
a2[left+5]=a1[left+5];
left++;
right--;
printf("\n\n\n\n\n\n\n");
printf("%s\n",a3);
printf(" ");
printf("%s\n",a2);
printf(" ###### ######\n");
printf(" ###### 1.人机对战 ######\n");
printf(" ###### 2.双人对弈 ######\n");
printf(" ###### 3.游戏设置 ######\n");
printf(" ###### 0.退出游戏 ######\n");
printf("%s\n",a3);
printf("%s\n",a3);
printf(" ################# MADE BY ##########\n");
printf(" ######################### 高三金 ##\n");
printf("%s\n\n\n",a3);
printf(" ***PS:本程序所有指令皆按回车键确认***\n");
printf(" *********制作时间:2021.3.10**********\n\n");
Sleep(100);
i++;
if(i<13)
{
system("cls");
}
}
printf("快选择呀:");
menu_choice();
}
/*
####################################
##### *AIbang* #######
##### #######
##### 1.人机对战 #######
##### 2.双人对弈 #######
##### 3.游戏设置 #######
##### 0.退出游戏 #######
####################################
####################################
################# MADE BY ##########
######################### 高三金 ##
####################################*/
void menu_choice()
{
int x=0;
scanf("%d",&x);
switch(x)
{
case 1:
Board_initialize();
AIgame();break;
case 2:
getchar();
Board_initialize();
game();break;
case 3:
setting();break;
case 0:
system("exit");break;
default:
printf("摇摇脑袋,有没有听见大海的声音?有这个选项吗?\n");
printf("请重新输入:");
menu_choice();
break;
}
}
void Board_initialize()
{
Color=1;
for(h=0;h<H;h++)
for(l=0;l<L;l++)
qipan[h][l]=2;
}
void color()
{
char a[11] = "\"color 02\"";
a[7] = a[7]+d;
a[8] = a[8]+o;
if(a[7]>57)
{
a[7]=a[7]+7;
}
if(a[7]>70)
{
a[7]=a[7]-23;
d=0;
}
if(a[8]>57)
{
a[8]=a[8]+7;
}
if(a[8]>70)
{
a[8]=a[8]-23;
o=0;
}
//printf("%s\n", a); 检查输出颜色字号
system(a);
printf("\n颜色已更改为色号%s\n 继续游戏请按回车键\n",a);
o++;
d++;
}
void setting()
{
int y=0;
printf("1.更改颜色 2.棋盘规模(默认20*20) 3.返回主菜单\n");
scanf("%d",&y);
switch(y)
{
case 1:
color();
while(1)
{
if(getchar()=='\n')
{
setting();
break;
}
}
break;
case 2:
Board_setting();
<