哈哈哈哈,作为一个大一刚刚接触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;
}