#include "windows.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#ifndef __cplusplus
#include <stdbool.h> /*包含bool、false */
#endif //__cplusplus
/*****************************************/
#define BOARD 16
COORD g_chessPos={38,18}; /*存储光标位置*/
short g_chessInfo[BOARD][BOARD]; /*g_chessInfo存储棋局信息,白子置为1,黑子为2,空则为0*/
/*****************************************/
void map(void); //绘制棋盘
void gotoxy(short,short);
void down(short,short); //落子
void play(int);
void run(void);
void showCursor(void); //显示光标
void clsCursor(void); //清除光标
void mark(int) ; //标记黑子或白子
void printInfo(void); //输出信息
bool isEmpty(void); //有棋子则为false
bool isWin(int); /*判断是否获胜,true为获胜,int参数为1白子 ,2为黑子*/
/*****************************************/
int main(int argc, char *argv[]) {
system("mode con lines=36 cols=100"); //设置控制台大小
system("color f0");
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; //隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
printInfo();
map();
showCursor();
run();
down(g_chessPos.X,g_chessPos.Y);
system("pause");
return 0;
}
void gotoxy(short x,short y)
{
HANDLE s_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord={x,y};
SetConsoleCursorPosition(s_hConsole,coord);
}
void map(void)
{
short x,y;
for( x=10;x<=70;x+=4)
{
for( y=2;y<=32;y+=2)
{
gotoxy(x,y); printf("╋━");
gotoxy(x,y+1); printf("┃");
}
}
/*清除棋盘多余部分*/
for(y=2;y<=32;y+=2)
{
gotoxy(70+2,y);printf(" ");
}
for(x=10;x<=70;x+=4)
{
gotoxy(x,32+1);printf(" ");
}
}
void printInfo(void)
{
gotoxy(76, 9);printf("控制:");
gotoxy(76,10);printf("↓ ↑ ← →控制移动");
gotoxy(76,11);printf("空格键落子");
gotoxy(76,12);printf("按Esc退出");
}
void down(short x,short y)
{
static int who=0;
gotoxy(x,y);
int t=who%2;
mark(t); //who是奇数为白子
if(t)
{
printf("○");
if(isWin(1)) //判断白棋是否获胜
{
gotoxy(38,18);printf("白子获胜");
system("pause");
}
gotoxy(76,16);printf("执黑子");
}
else
{
printf("●");
if(isWin(2)) //判断黑棋是否获胜
{
gotoxy(38,18);printf("黑子获胜");
system("pause");
}
gotoxy(76,16);printf("执白子");
}
who++;
}
void run(void)
{
gotoxy(76,16);printf("执黑子");
while(1)
if(_kbhit())
play(_getch());
}
bool isEmpty(void)
{
if(g_chessInfo[(g_chessPos.X-10)/4] [(g_chessPos.Y-2)/2])
return false;
return true;
}
void mark(int i)
{
/*i为1,白子置为1,i为0置黑子为2*/
g_chessInfo[(g_chessPos.X-10)/4] [(g_chessPos.Y-2)/2]=(i?1:2);
}
void play(int c)
{
clsCursor();
switch(c)
{
case 72: //上
if(g_chessPos.Y-2>=2) /*确保在棋盘内*/
g_chessPos.Y-=2;
break;
case 80: //下
if(g_chessPos.Y+2<=32)
g_chessPos.Y+=2;
break;
case 75: //左
if(g_chessPos.X-4>=10)
g_chessPos.X-=4;
break;
case 77: //右
if(g_chessPos.X+4<=70)
g_chessPos.X+=4;
break;
case 32: //空格落子
if(isEmpty())
down(g_chessPos.X,g_chessPos.Y);
break;
case 27: //Esc键
exit(1);
break;
}
showCursor();
}
void showCursor(void)
{
gotoxy(g_chessPos.X-2,g_chessPos.Y-1);printf("┏━┓");
gotoxy(g_chessPos.X-2,g_chessPos.Y+1);printf("┗━┛");
}
void clsCursor(void)
{
gotoxy(g_chessPos.X-2,g_chessPos.Y-1);printf(" ");
gotoxy(g_chessPos.X-2,g_chessPos.Y+1);printf(" ");
if(g_chessPos.Y!=2)
{
gotoxy(g_chessPos.X,g_chessPos.Y-1);
printf("┃");
}
if(g_chessPos.Y!=32)
{
gotoxy(g_chessPos.X,g_chessPos.Y+1);
printf("┃");
}
}
bool isWin(int t)
{
int i,j,num;
/*取出当前光标对应在棋盘数组中的位置*/
int x=(g_chessPos.X-10)/4;
int y=(g_chessPos.Y-2)/2;
/
i=x;j=y;num=0; //横向向右
while(i<BOARD&&t==g_chessInfo[i][j]){++num;++i;}
i=x-1; //横向向左
while(i>=0&&t==g_chessInfo[i][j]){++num;--i;}
if(num>=5) return true;
/
i=x;j=y;num=0; //纵向向下
while(j<BOARD&&t==g_chessInfo[i][j]){++num;++j;}
i=x;j=y-1; //纵向向上
while(j>=0&&t==g_chessInfo[i][j]){++num;--j;}
if(num>=5) return true;
/
i=x;j=y;num=0; //左斜向下
while(i<BOARD&&j<BOARD&&t==g_chessInfo[i][j]){++num;++i;++j;}
i=x-1;j=y-1; //左斜向上
while(i>=0&&j>=0&&t==g_chessInfo[i][j]){++num;--i;--j;}
if(num>=5) return true;
i=x;j=y;num=0; //右斜向下
while(i>=0&&j<BOARD&&t==g_chessInfo[i][j]){++num;--i;++j;}
i=x+1;j=y-1; //右斜向向上
while(j>=0&&i<BOARD&&t==g_chessInfo[i][j]){++num;++i;--j;}
if(num>=5) return true;
return false;
}
C语言版五子棋
最新推荐文章于 2023-02-05 13:20:36 发布
这是一个使用C语言编写的五子棋游戏程序,包括绘制棋盘、移动光标、落子等功能。玩家可以使用键盘方向键和空格键进行操作,程序会判断胜负并提供游戏提示。
摘要由CSDN通过智能技术生成