小白的棋局

哈哈哈哈,作为一个大一刚刚接触C语言编程的小白还是有点兴奋,第一次在CSDN上写博客。话说其实在入大学之前完全完全没有想过要进入软件工程这个专业,当时还报了(西班牙语...)。但是其实也很喜欢这个专业,谁小时候没有一个黑客梦或者做做自己的小游戏呢?

以前初中的时候没事干和同学下五子棋,后来觉得无聊就一起想了一个棋类游戏(我将其命名为:战略棋)。drang,drang!

游戏规则:

自己任取两个对角开始下,下一步只能在存在自棋子周围的8个方格下棋。

下的棋子会将其周围的8个对手已下的棋子转换成自己的棋子。

直到所有的格子下满,即为胜利。

(注意不要下在同一个地方,好像这个bug没有改....)(还有有个橡皮檫功能被擦除)

还有游戏会出现以下死局:

 

 

空的地方白色就不能下了,因为不符合紧邻这个条件。

算子的时候就计为黑色。

(毕竟是第一次写这些TAT,下次加油把这些都改好!)

 

下面是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define MAXLEN 11//棋盘大小;
#define CORE 26//总子数;
typedef struct posy
{
	int flag;
	int x;
	int y;
}POS;
POS loc[CORE];//注意下标是从1开始记录的;
int Cx, Cy;
int offset=1;//换出手方;(回合数)
int Count(int m);//记棋子数;
int Record(int count,int count1,int l,int k);
void Table (int count,int count1);
int Put(int count,int count1);
void Search();//黑白翻转;
int Judge(int count,int count1);
int main ()
{

	Cx=Cy=(MAXLEN+1)/2;
	//橡皮擦标志;
	char ch='n';
	int count1=0;//记录白方下子个数;
	int count=0;//记录成功下子的个数;
	int input;
	system("title War Chess made by:Tianwei");
	system("color F8");
	while(1)
	{
		system("cls");
		Table(count,count1);
		if(offset==CORE)
		while(ch!='y') {Judge(count,count1);
			printf("\n你还想进行下一局游戏吗?输入'Y'或'y'开始下一局\n");
			scanf("%c",&ch);
			printf("哈哈怎么可能再来一局(滑稽),这个系统可是一次性的");
			exit(0);}
		input=getch();//等待键盘按下一个字符
		if(input==0xE0)//如果按下的是方向键,会填充两次输入,第一次为0xE0(这里是asc码的扩展表)表示按下的是控制键【方向键记录】
		{
			input=getch();//获得第二次输入信息
			switch(input)//判断方向键方向并移动光标位置
			{
				case 0x4B:Cy--;break;
				case 0x48:Cx--;break;
				case 0x4D:Cy++;break;
				case 0x50:Cx++;break;
			}
			if(Cy>MAXLEN) Cy-=MAXLEN;
			if(Cx>MAXLEN) Cx-=MAXLEN;
			if(Cy<0) Cy+=MAXLEN;
			if(Cx<0) Cx+=MAXLEN;//边界控制
		}
		else if(input==0x20)//如果是空格则走子;
		{
			if(Put(count,count1))//判断走子是否合法;
			{
				if(offset%2!=0)//
				{
                    loc[offset].flag=1;//黑子为flag=1;
                    loc[offset].x=Cx;
                    loc[offset].y=Cy;
				}
				if(offset%2==0)
				{
					loc[offset].flag=-1;//白子为flag=-1;
					loc[offset].x=Cx;
					loc[offset].y=Cy;
				}
				offset++;
				Search();//在合法输入后黑白翻转;
				count=Count(1);//黑子个数;
				count1=Count(-1);
				
			}


		}

	}
}
void Table (int count,int count1)//制棋盘;
{
	int ret;
	int i;//行
	int k;//列;
	for(i=1;i<=MAXLEN;i++)
	{
		for(k=1;k<=MAXLEN+1;k++)
		{
			ret=0;
			if(i==Cx&&k==Cy){ if(offset%2!=0) {printf("& "); continue;} else {printf("$ "); continue;}}//光标模拟
			if(k==MAXLEN+1) { printf("\n"); continue; }
			if(i==1&&k==1) printf("┏");
			if(i==1&&k==MAXLEN) printf("┓");
			if(i==MAXLEN&&k==MAXLEN) printf("┛");
			if(i==MAXLEN&&k==1) printf("┗");
			if((k%2!=0&&(k>1&&k<MAXLEN))&&i==1) printf("┯");
			if((i%2!=0&&(i>1&&i<MAXLEN))&&k==1) printf("┣");
			if((i%2!=0&&(i>1&&i<MAXLEN))&&(k%2!=0&&(k>1&&k<MAXLEN))) printf("╋");
			if(k==MAXLEN&&(i%2!=0&&(i>1&&i<MAXLEN))) printf("┫");
			if((k%2!=0&&(k>1&&k<MAXLEN))&&i==MAXLEN) printf("┷");
			if(i%2==0&&k%2==0) printf("  ");
			if(i%2==0&&k%2!=0) printf("┃");
			if(i%2!=0&&k%2==0) printf("━");
			ret=Record(count,count1,i,k);
			switch(ret)
			{
				case 1: {printf("\b\b●"); break;}
				case -1: {printf("\b\b○"); break;}
			
			}
//已经记录的棋子;
		}
	}
	printf("游戏规则为:\n1:'&'代表黑方下棋,'$'代表白方下棋\n2:下满整个棋盘后比子数,子数多的一方获胜\n3:空格键下棋");
	printf("\n4:双方从两个对角开始下,每一步必须在自己棋子的周围8个格子内\n5:在下棋后该棋周围的8个棋子将会通化成本方的棋子");
	printf("\n第%d回合\t\tmaker :(Tianwei天为)拒绝盗版!!!",offset);
	printf("\n黑子个数%d,白子个数%d",count,count1);
	return ;
}
int Record(int count,int count1,int l,int k)
{
		int i;
 	for(i=1;i<=offset;i++)//在offset个数以内
		{
			if(loc[i].x==l&&loc[i].y==k) return loc[i].flag;
		}
	return 0;
}
int Put (int count,int count1)//合法数据的检测;
{
	int flag=0;
	int i;
	if(offset%2!=0)//黑色下子的合法判断;
	{

		if(count==0)
		{
			if((Cx%2!=0||Cy%2!=0)) return 0;
			else return 1;
		}
		for(i=0;i<count;i++)
		{
			if((Cx%2!=0||Cy%2!=0)||(Cx==loc[i].x&&Cy==loc[i].y)) flag=1;//重复位置不记录;
		}
		if(flag==0) return 1;
		else return 0;
	}
	if(offset%2==0)
	{

		if(count1==0)
		{
			if((Cx%2!=0||Cy%2!=0)) return 0;
			else return 1;
		}
		for(i=0;i<count1;i++)
		{
			if((Cx%2!=0||Cy%2!=0)||(Cx==loc[i].x&&Cy==loc[i].y)) flag=1;
		}
		if(flag==0) return 1;
		else return 0;
	}
}
int Judge(int count,int count1)
{
	if(count>count1) { printf("黑房获胜!!\nThe Winner is black!!");};
	if(count<count1) {printf("白房获胜!!\nThe Winner is white!!");};
	if(count==count1) { printf("不愧是两个菜鸡,这都能打平");};
}
void Search()//黑白翻转;
{
	int flag;
	int m;
	int i;
	int k;
	if(offset%2==0) flag=1;
	else flag=-1;
	for(i=-2;i<=2;i+=2)
	{
		for(k=-2;k<=2;k+=2)
		{
			for(m=1;m<=offset;m++)//在offset个数以内
			{
				if(loc[m].x==i+Cx&&loc[m].y==k+Cy) loc[m].flag=flag;
			}
		}
	}
}
int Count (int m)
{
	int i;
	int ret=0;
	for(i=1;i<=offset;i++)
	{
 		if(m==loc[i].flag) ret++;
	}
	return ret;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值