今年秋上了大一,开始接触c语言,开始写程序。感觉还不错的,总比上大物,数分神马的强多了。期末了,花了点时间写了个五子棋出来。其中的ai思考了很久,还是采用了书本上提供的方式写了。
代码写的有点乱,大家别见怪,原谅初学者的知识不足啊。
#include <iostream>
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<string.h>
#define qx1num 27 //防御棋形的数量
#define qx2num 26 //攻击棋形的数量
#define TEXTS 7; //文本颜色
#define BLACKCHESS 48; //黑棋颜色 ,因图案本身黑色,故设置于棋盘颜色相同
#define WHITECHESS 63 //白棋颜色
#define CURSOR 96; //光标颜色
#define BCHESSBOARD 125 //棋盘背景颜色
#define CHESSBOARD 48 //棋盘颜色
#define MENU 124 //菜单颜色
int resultcheck(int x,int y,int player);
void huiqi();
void ai();
void stepp(int st);
void again();
void output(int i,int j);
void showboard();
void textcolor(int color);
void gotoxy(int x,int y);
void huiqi2();
void showplayer(int);
void board();
int x;
int y;
int player; //玩家标志
int step=0; //记录下棋的步数
int status[16][16]; //棋盘中一个位置所处的状态 ,1表示该位置已经被玩家一下棋,2表示该位置已经被玩家二下棋,0表示该位置还未下子。
int x1,y1;
int px1,py1; //用于记录前一个下棋位置,以便悔棋
int px2,py2; //用于记录电脑前一个下棋位置,以便悔棋
int attackrend;
int defentrend;
int computer=0;
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
struct Cursor{
int x;
int y;
}cursor;
struct QIXING{
char qx[8]; //棋形
int value; //棋形的权值
};
/*棋形 qx1为防御棋形,qx2为攻击棋形*/
QIXING qx1[qx1num]={
{"x1111",2000000},{"1x111",2000000},{"11x11",2000000},
{"0x1110",6000},{"01x110",6000},{"101x101",6000},
{"0x111",1100},{"x0111",1100},{"0x1011",1100},{"0x1101",1100},
{"01x11",1100},{"011x1",1100},{"1x011",1100},{"10x11",1100},
{"11x01",1100},{"1x101",1100},
{"x011102",250},{"0x110",250},{"01x10",250},{"0x01102",240},{"0x101",240},
{"0x112",20},{"01x12",10},{"011x2",20},{"1x12",10},{"0x10",20},{"0x010",5}};
/*防御棋形的基本棋形以及权值,0为空,1为对手,2为自己,x为下棋的位置*/
QIXING qx2[qx2num]={
{"x1111",3000000},{"1x111",3000000},{"11x11",3000000},
{"0x1110",3000000},{"01x110",3000000},{"101x101",24000},
{"0x111",2000},{"x0111",1900},{"0x1011",1900},{"0x1101",2000},
{"01x11",2000},{"011x1",2000},{"1x011",1900},{"10x11",2000},{"1x101",2000},
{"x01112",2000},{"1x011",850},{"0x110",850},{"0x0110",850},{"0x101",850},
{"0x112",125},{"01x12",125},{"011x2",115},{"1x12",115},
{"0x10",125},{"0x010",110}
/*攻击棋形的基本棋形以及权值,0为空,1为自己,2为对手,x为下棋位置*/
};
int direction[8][2]={
{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,1},{-1,1},{1,-1}};/*定义八个方向*/
/*更改颜色的函数*/
void textcolor(int color)
{
SetConsoleTextAttribute(hOutput,color);
}
/*将光标移至坐标(x,y)处*/
void gotoxy(int x,int y)
{
COORD coordScreen={0,0};
coordScreen.X=x;
coordScreen.Y=y;
SetConsoleCursorPosition(hOutput,coordScreen);
}
char map[15][15][3]; //棋盘的大小 因所采用的符号属于字符串 故采用**数组
void board() //棋盘上各个位置符号的填入 ,这是和书上不同的,我是采用**数组存储棋盘符号,较为简单明了
{
int i,j,k;
strcpy(map[0][0],"┌"); //采用三维数组定义棋盘的原因是符号 ┌占了并不是一个字符,而是占了两个字符的位置,相当于字符串
strcpy(map[14][14],"┘");
strcpy(map[14][0],"└");
strcpy(map[0][14],"┐");
for(i=1;i<14;i++)
{strcpy(map[i][0],"├");strcpy(map[i][14],"┤");}
for(j=1;j<14;j++)
{strcpy(map[0][j],"┬");strcpy(map[14][j],"┴");}
for(i=1;i<14;i++)
for(j=1;j<14;j++)
strcpy(map[i][j],"┼");
}
/*显示首菜单*/
int showmenu()
{
int i;
system("cls");
textcolor(BCHESSBOARD); //更改颜色
for(i=0;i<300;i++) //输出空白字符,形成背景。图形界面编程还不会做,所以采用这种方式构成背景
printf("/t");
textcolor(MENU);
gotoxy(26,2);
printf("欢迎使用五子棋");
gotoxy(22,4);
printf("★ 1:Two Person Games");
gotoxy(22,6);
printf(" (人人对战)");
gotoxy(22,8);
printf("★ 2:Person Vs Computer");
gotoxy(22,10);
printf(" (人机对战)");
gotoxy(22,12);
printf("★ 3:Exit(退出)");
gotoxy(22,14);
printf("请按Up,Down 和Enter键进行选择选择");
textcolor(4);