用超级简单的C语言实现人机五子棋(键盘控制)

本文介绍了作者作为大一新生,使用C语言设计的一个简单五子棋游戏。游戏包括人机对战和玩家对战模式,采用VS2010学习版编译,支持悔棋和返回主菜单等功能。程序借鉴了优快云上的部分代码,并进行了原创改进,如统计棋子数和机器判断。文章提供了流程图、菜单界面和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*声明:*这是我第一次发博客,我是大一新生,只学习了谭浩强著作的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();
		<
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值