#include "windows.h"
#include "stdio.h"
#define up 'w'
#define left 'a'
#define down 's'
#define right 'd'
#define lz 'p'
#define cls 'q'
struct stu //定义位置记录结构体
{
int x;
int y;
}weizhi;
int player=1;
int Q[20][20]={0}; //定义数组以记录落子情况
void gotoxy(int x, int y) //建立坐标函数
{
COORD c;
c.X=2*x;
c.Y=y;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); //修改当前光标的位置
}
void drawqipan() //绘制棋盘及数据初始化
{
int i,j;
system("cls"); //清除屏幕
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
Q[i][j]=0;
printf("十");
}
printf("\n");
}
weizhi.x=0;weizhi.y=0; //程序数据初始化
gotoxy(0,0);
}
void jilu() //记录落子情况
{
Q[weizhi.x][weizhi.y]=player+1;
if(player)
{
player=0; //玩家变换
return;
}
player=1;
}
int cluozi(int x,int y) //由电脑落子时调用
{
weizhi.x=x;weizhi.y=y;
gotoxy(weizhi.x,weizhi.y);
if(Q[weizhi.x][weizhi.y]==0) //判断当前位置是否已经落子
{
jilu();
printf("○");
gotoxy(weizhi.x,weizhi.y);
}
}
void luozi() //玩家落子
{
if(Q[weizhi.x][weizhi.y]==0) //判断当前位置是否已经落子
{
if(player)
{
jilu();
printf("●");
}
else
{
jilu();
printf("○");
}
gotoxy(weizhi.x,weizhi.y);
}
}
int checkWin() //检查游戏是否有输赢
{
int p;
int r,c,rr,cc,count=0;
p=player==0?2:1;
for(c=0;c<20;c++)
{
for(r=0;r<20;r++)
{
if(Q[r][c]!=p)
continue;
//检查列
rr=r;cc=c;
while(--cc>=0 &&Q[rr][cc]==p)count++; cc=c;
while(++cc<20 &&Q[rr][cc]==p)count++; cc=c;
if(count+1>=5)
return p;
//检查行
count=0;
while(--rr>=0 &&Q[rr][cc]==p)count++; rr=r;
while(++rr<20 &&Q[rr][cc]==p)count++; rr=r;
if(count+1>=5)
return p;
//检查反斜边
count=0;
cc--;rr--;
while((cc>=0||rr>=0) &&Q[rr][cc]==p){count++;cc--;rr--;} rr=r;cc=c;
cc++;rr++;
while((cc<20||rr<20) &&Q[rr][cc]==p){count++;cc++;rr++;} rr=r;cc=c;
if(count+1>=5)
return p;
count=0;
//检查正斜边
count=0;
cc++;rr--;
while((cc<20||rr>=0) &&Q[rr][cc]==p){count++;cc++;rr--;} rr=r;cc=c;
cc--;rr++;
while((cc>=0||rr<20) &&Q[rr][cc]==p){count++;cc--;rr++;} rr=r;cc=c;
if(count+1>=5)
return p;
count=0;
}
}
return 0;
}
void Keypress(char n) //光标位置移动
{
switch(n)
{
case up:if(weizhi.y<=0)weizhi.y=19;else weizhi.y--;gotoxy(weizhi.x,weizhi.y);break;
//向上移动光标
case left:if(weizhi.x<=0)weizhi.x=19;else weizhi.x--;gotoxy(weizhi.x,weizhi.y);break;
//向左移动光标
case right:if(weizhi.x>=19)weizhi.x=0;else weizhi.x++;gotoxy(weizhi.x,weizhi.y);break;
//向右移动光标
case down:if(weizhi.y>=19)weizhi.y=0;else weizhi.y++;gotoxy(weizhi.x,weizhi.y);break;
//向下移动光标
case lz:luozi();break;
//开始落子操作
case cls:drawqipan();break;
//重新开始
}
}
main()
{
char press;
int winer=0;
system("color 2f");
l: drawqipan();
press=getch();
while(1)
{
Keypress(press);
if(press=='p')
winer=checkWin();
if(winer!=0)
gotoxy(0,20);
if(winer==2)
printf("the side of ● wins\n");
else if(winer==1)
printf("the side of ○ wins\n");
else
{
// if(player==0)
// {
// //cluozi(1,2); //此处落子由电脑控制
// }
press=getch();
continue;
}
printf("do you want to play again?(y/n):");
p: press=getch();
if(press=='n')
break;
else if(press=='y')
{
winer=0;
goto l;
}
else
goto p;
}
}
枫蜜柚子茶
- 粉丝: 8966
- 资源: 5351
最新资源
- 【java毕业设计】springboot医学电子技术线上课堂系统(springboot+vue+mysql+说明文档).zip
- java 输入任意字符串找回文
- NewModel_3.2.2(1).zip
- 上海交通大学版 asp.NET第152页-运用ADO.NET访问数据库(注册账号并在网站中查询)
- 【源码+数据库】利用Java Swing框架与Socket技术开发的即时通讯系统,系统分为客户端和服务端,类似于qq聊天
- 计算机科学与技术数据结构实践考核要求.ppt
- 【java毕业设计】springboot中医院问诊系统的设计与实现(springboot+vue+mysql+说明文档).zip
- MATLAB大数计算工具箱及其用法
- 基于 python 实现的微博的数据挖掘与社交舆情分析
- Screenshot_20241105_140450.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈