网上有关我来教你麻将开挂方法有挂吗(详细开挂教程)

06-27 30阅读

网上有关“怎样用c语言编写五子棋的棋盘”话题很是火热,小编也是针对怎样用c语言编写五子棋的棋盘寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

您好:手机麻将有挂是真的吗这款游戏可以开挂,确实是有挂的,咨询加微信【】很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到其他人的牌一样。所以很多小伙伴就怀疑这款游戏是不是有挂,实际上这款游戏确实是有挂的
http://www.boyicom.net/sheng/1.jpg
1.手机麻将有挂是真的吗这款游戏可以开挂,确实是有挂的,通过添加客服微信 2.咨询软件加微信【】在"设置DD功能DD微信手麻工具"里.点击"开启". 3.打开工具.在"设置DD新消息提醒"里.前两个选项"设置"和"连接软件"均勾选"开启"(好多人就是这一步忘记做了) 4.打开某一个微信组.点击右上角.往下拉."消息免打扰"选项.勾选"关闭"(也就是要把"群消息的提示保持在开启"的状态.这样才能触系统发底层接口)

棋盘如果没有界面,那种有线和框的,就用0放在每个位置,当作一个位置,玩家1如果放下子的话,就将0变成1,玩家2放下棋子,0变成2

复杂的界面,就去找MFC、QT吧

struct?stu//定义位置记录结构体

{

int?x;

int?y;

}weizhi;

int?player=1;

int?Q[20][20]={0};?//定义数组以记录落子情况

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);

}

求一个c语言写的五子棋程序,要有人机对战和人人对战两种模式,可以选择棋盘大小,最好带禁手,和图形化

#include <stdio.h>

#include <bios.h>

#include <ctype.h>

#include <conio.h>

#include <dos.h>

#define CROSSRU 0xbf /*右上角点*/

#define CROSSLU 0xda /*左上角点*/

#define CROSSLD 0xc0 /*左下角点*/

#define CROSSRD 0xd9 /*右下角点*/

#define CROSSL 0xc3 /*左边*/

#define CROSSR 0xb4 /*右边*/

#define CROSSU 0xc2 /*上边*/

#define CROSSD 0xc1 /*下边*/

#define CROSS 0xc5 /*十字交叉点*/

/*定义棋盘左上角点在屏幕上的位置*/

#define MAPXOFT 5

#define MAPYOFT 2

/*定义1号玩家的操作键键码*/

#define PLAY1UP 0x1157/*上移--'W'*/

#define PLAY1DOWN 0x1f53/*下移--'S'*/

#define PLAY1LEFT 0x1e41/*左移--'A'*/

#define PLAY1RIGHT 0x2044/*右移--'D'*/

#define PLAY1DO 0x3920/*落子--空格键*/

/*定义2号玩家的操作键键码*/

#define PLAY2UP 0x4800/*上移--方向键up*/

#define PLAY2DOWN 0x5000/*下移--方向键down*/

#define PLAY2LEFT 0x4b00/*左移--方向键left*/

#define PLAY2RIGHT 0x4d00/*右移--方向键right*/

#define PLAY2DO 0x1c0d/*落子--回车键Enter*/

/*若想在游戏中途退出, 可按 Esc 键*/

#define ESCAPE 0x011b

/*定义棋盘上交叉点的状态, 即该点有无棋子 */

/*若有棋子, 还应能指出是哪个玩家的棋子 */

#define CHESSNULL 0 /*没有棋子*/

#define CHESS1 'O'/*一号玩家的棋子*/

#define CHESS2 'X'/*二号玩家的棋子*/

/*定义按键类别*/

#define KEYEXIT 0/*退出键*/

#define KEYFALLCHESS 1/*落子键*/

#define KEYMOVECURSOR 2/*光标移动键*/

#define KEYINVALID 3/*无效键*/

/*定义符号常量: 真, 假 --- 真为1, 假为0 */

#define TRUE 1

#define FALSE 0

/**********************************************************/

/* 定义数据结构 */

/*棋盘交叉点坐标的数据结构*/

struct point

{

int x,y;

};

/**********************************************************/

/*自定义函数原型说明 */

void Init(void);

int GetKey(void);

int CheckKey(int press);

int ChangeOrder(void);

int ChessGo(int Order,struct point Cursor);

void DoError(void);

void DoOK(void);

void DoWin(int Order);

void MoveCursor(int Order,int press);

void DrawCross(int x,int y);

void DrawMap(void);

int JudgeWin(int Order,struct point Cursor);

int JudgeWinLine(int Order,struct point Cursor,int direction);

void ShowOrderMsg(int Order);

void EndGame(void);

/**********************************************************/

/**********************************************************/

/* 定义全局变量 */

int gPlayOrder; /*指示当前行棋方 */

struct point gCursor; /*光标在棋盘上的位置 */

char gChessBoard[19][19];/*用于记录棋盘上各点的状态*/

/**********************************************************/

/**********************************************************/

/*主函数*/

void main()

{

int press;

int bOutWhile=FALSE;/*退出循环标志*/

Init();/*初始化图象,数据*/

while(1)

{

press=GetKey();/*获取用户的按键值*/

switch(CheckKey(press))/*判断按键类别*/

{

/*是退出键*/

case KEYEXIT:

clrscr();/*清屏*/

bOutWhile = TRUE;

break;

/*是落子键*/

case KEYFALLCHESS:

if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/

DoError();/*落子错误*/

else

{

DoOK();/*落子正确*/

/*如果当前行棋方赢棋*/

if(JudgeWin(gPlayOrder,gCursor)==TRUE)

{

DoWin(gPlayOrder);

bOutWhile = TRUE;/*退出循环标志置为真*/

}

/*否则*/

else

/*交换行棋方*/

ChangeOrder();

ShowOrderMsg(gPlayOrder);

}

break;

/*是光标移动键*/

case KEYMOVECURSOR:

MoveCursor(gPlayOrder,press);

break;

/*是无效键*/

case KEYINVALID:

break;

}

if(bOutWhile==TRUE)

break;

}

/*游戏结束*/

EndGame();

}

/**********************************************************/

/*界面初始化,数据初始化*/

void Init(void)

{

int i,j;

char *Msg[]=

{

"Player1 key:",

" UP----w",

" DOWN--s",

" LEFT--a",

" RIGHT-d",

" DO----space",

"",

"Player2 key:",

" UP----up",

" DOWN--down",

" LEFT--left",

" RIGHT-right",

" DO----ENTER",

"",

"exit game:",

" ESC",

NULL,

};

/* 先手方为1号玩家 */

gPlayOrder = CHESS1;

/* 棋盘数据清零, 即棋盘上各点开始的时候都没有棋子 */

for(i=0;i<19;i++)

for(j=0;j<19;j++)

gChessBoard[i][j]=CHESSNULL;

/*光标初始位置*/

gCursor.x=gCursor.y=0;

/*画棋盘*/

textmode(C40);

DrawMap();

/*显示操作键说明*/

i=0;

textcolor(BROWN);

while(Msg[i]!=NULL)

{

gotoxy(25,3+i);

cputs(Msg[i]);

i++;

}

/*显示当前行棋方*/

ShowOrderMsg(gPlayOrder);

/*光标移至棋盘的左上角点处*/

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

}

/*画棋盘*/

void DrawMap(void)

{

int i,j;

clrscr();

for(i=0;i<19;i++)

for(j=0;j<19;j++)

DrawCross(i,j);

}

/*画棋盘上的交叉点*/

void DrawCross(int x,int y)

{

gotoxy(x+MAPXOFT,y+MAPYOFT);

/*交叉点上是一号玩家的棋子*/

if(gChessBoard[x][y]==CHESS1)

{

textcolor(LIGHTBLUE);

putch(CHESS1);

return;

}

/*交叉点上是二号玩家的棋子*/

if(gChessBoard[x][y]==CHESS2)

{

textcolor(LIGHTBLUE);

putch(CHESS2);

return;

}

textcolor(GREEN);

/*左上角交叉点*/

if(x==0&&y==0)

{

putch(CROSSLU);

return;

}

/*左下角交叉点*/

if(x==0&&y==18)

{

putch(CROSSLD);

return;

}

/*右上角交叉点*/

if(x==18&&y==0)

{

putch(CROSSRU);

return;

}

/*右下角交叉点*/

if(x==18&&y==18)

{

putch(CROSSRD);

return;

}

/*左边界交叉点*/

if(x==0)

{

putch(CROSSL);

return;

}

/*右边界交叉点*/

if(x==18)

{

putch(CROSSR);

return;

}

/*上边界交叉点*/

if(y==0)

{

putch(CROSSU);

return;

}

/*下边界交叉点*/

if(y==18)

{

putch(CROSSD);

return;

}

/*棋盘中间的交叉点*/

putch(CROSS);

}

/*交换行棋方*/

int ChangeOrder(void)

{

if(gPlayOrder==CHESS1)

gPlayOrder=CHESS2;

else

gPlayOrder=CHESS1;

return(gPlayOrder);

}

/*获取按键值*/

int GetKey(void)

{

char lowbyte;

int press;

while (bioskey(1) == 0)

;/*如果用户没有按键,空循环*/

press=bioskey(0);

lowbyte=press&0xff;

press=press&0xff00 + toupper(lowbyte);

return(press);

}

/*落子错误处理*/

void DoError(void)

{

sound(1200);

delay(50);

nosound();

}

/*赢棋处理*/

void DoWin(int Order)

{

sound(1500);delay(100);

sound(0); delay(50);

sound(800); delay(100);

sound(0); delay(50);

sound(1500);delay(100);

sound(0); delay(50);

sound(800); delay(100);

sound(0); delay(50);

nosound();

textcolor(RED+BLINK);

gotoxy(25,20);

if(Order==CHESS1)

cputs("PLAYER1 WIN!");

else

cputs("PLAYER2 WIN!");

gotoxy(25,21);

cputs("\n");

getch();

}

/*走棋*/

int ChessGo(int Order,struct point Cursor)

{

/*判断交叉点上有无棋子*/

if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL)

{

/*若没有棋子, 则可以落子*/

gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);

textcolor(LIGHTBLUE);

putch(Order);

gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);

gChessBoard[Cursor.x][Cursor.y]=Order;

return TRUE;

}

else

return FALSE;

}

/*判断当前行棋方落子后是否赢棋*/

int JudgeWin(int Order,struct point Cursor)

{

int i;

for(i=0;i<4;i++)

/*判断在指定方向上是否有连续5个行棋方的棋子*/

if(JudgeWinLine(Order,Cursor,i))

return TRUE;

return FALSE;

}

/*判断在指定方向上是否有连续5个行棋方的棋子*/

int JudgeWinLine(int Order,struct point Cursor,int direction)

{

int i;

struct point pos,dpos;

const int testnum = 5;

int count;

switch(direction)

{

case 0:/*在水平方向*/

pos.x=Cursor.x-(testnum-1);

pos.y=Cursor.y;

dpos.x=1;

dpos.y=0;

break;

case 1:/*在垂直方向*/

pos.x=Cursor.x;

pos.y=Cursor.y-(testnum-1);

dpos.x=0;

dpos.y=1;

break;

case 2:/*在左下至右上的斜方向*/

pos.x=Cursor.x-(testnum-1);

pos.y=Cursor.y+(testnum-1);

dpos.x=1;

dpos.y=-1;

break;

case 3:/*在左上至右下的斜方向*/

pos.x=Cursor.x-(testnum-1);

pos.y=Cursor.y-(testnum-1);

dpos.x=1;

dpos.y=1;

break;

}

count=0;

for(i=0;i<testnum*2+1;i++)/*i<testnum*2-1*/

{

if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18)

{

if(gChessBoard[pos.x][pos.y]==Order)

{

count++;

if(count>=testnum)

return TRUE;

}

else

count=0;

}

pos.x+=dpos.x;

pos.y+=dpos.y;

}

return FALSE;

}

/*移动光标*/

void MoveCursor(int Order,int press)

{

switch(press)

{

case PLAY1UP:

if(Order==CHESS1&&gCursor.y>0)

gCursor.y--;

break;

case PLAY1DOWN:

if(Order==CHESS1&&gCursor.y<18)

gCursor.y++;

break;

case PLAY1LEFT:

if(Order==CHESS1&&gCursor.x>0)

gCursor.x--;

break;

case PLAY1RIGHT:

if(Order==CHESS1&&gCursor.x<18)

gCursor.x++;

break;

case PLAY2UP:

if(Order==CHESS2&&gCursor.y>0)

gCursor.y--;

break;

case PLAY2DOWN:

if(Order==CHESS2&&gCursor.y<18)

gCursor.y++;

break;

case PLAY2LEFT:

if(Order==CHESS2&&gCursor.x>0)

gCursor.x--;

break;

case PLAY2RIGHT:

if(Order==CHESS2&&gCursor.x<18)

gCursor.x++;

break;

}

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

}

/*游戏结束处理*/

void EndGame(void)

{

textmode(C80);

}

/*显示当前行棋方*/

void ShowOrderMsg(int Order)

{

gotoxy(6,MAPYOFT+20);

textcolor(LIGHTRED);

if(Order==CHESS1)

cputs("Player1 go!");

else

cputs("Player2 go!");

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

}

/*落子正确处理*/

void DoOK(void)

{

sound(500);

delay(70);

sound(600);

delay(50);

sound(1000);

delay(100);

nosound();

}

/*检查用户的按键类别*/

int CheckKey(int press)

{

if(press==ESCAPE)

return KEYEXIT;/*是退出键*/

else

if

( ( press==PLAY1DO && gPlayOrder==CHESS1) ||

( press==PLAY2DO && gPlayOrder==CHESS2)

)

return KEYFALLCHESS;/*是落子键*/

else

if

( press==PLAY1UP || press==PLAY1DOWN ||

press==PLAY1LEFT || press==PLAY1RIGHT ||

press==PLAY2UP || press==PLAY2DOWN ||

press==PLAY2LEFT || press==PLAY2RIGHT

)

return KEYMOVECURSOR;/*是光标移动键*/

else

return KEYINVALID;/*按键无效*/

}

高分求一个C语言的五子棋程序

# include<stdio.h>

# include<string.h>

# include<stdlib.h>

# define SPA 0

# define MAN 1

# define COM 2 /* 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 */

int qipan[15][15]; /* 15*15的棋盘 */

int a,b,c,d,x; /* a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置*/

void start(); /* 程序的主要控制函数 */

void draw(); /* 画棋盘 */

int win(int p,int q); /* 判断胜利 p q为判断点坐标 */

void AI(int *p,int *q); /* 电脑下子 p q返回下子坐标 */

int value(int p,int q); /* 计算空点p q的价值 */

int qixing(int n,int p,int q); /* 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 */

void yiwei(int n,int *i,int *j); /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */

void main()

{

char k;

do{

x=225;

start();

printf("还要再来一把吗?输入y或n:"); getchar(); scanf("%c",&k);

while(k!='y'&&k!='n'){

printf("输入错误,请重新输入\n"); scanf("%c",&k); }

system("cls"); }while(k=='y'); printf("谢谢使用!\n");

}

void start()

{

int i,j,a1,b1,c1,d1,choice; /* a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 */

char ch;

printf("\t╔══════════════════════════════╗\n"); printf("\t║ ║\n"); printf("\t║ 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 ║\n"); printf("\t║ ║\n"); printf("\t║ ._______________________. ║\n"); printf("\t║ | _____________________ | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I 五 子 棋 I | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I made by 晓之蓬 I | ║\n"); printf("\t║ | I___________________I | ║\n"); printf("\t║ !_______________________! ║\n"); printf("\t║ ._[__________]_. ║\n"); printf("\t║ .___|_______________|___. ║\n"); printf("\t║ |::: ____ | ║\n"); printf("\t║ | ~~~~ [CD-ROM] | ║\n"); printf("\t║ !_____________________! ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 寒 星 溪 月 疏 星 首,花 残 二 月 并 白 莲。 ║\n"); printf("\t║ 雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。 ║\n"); printf("\t║ 星 月 长 峡 恒 水 流,白 莲 垂 俏 云 浦 岚。 ║\n"); printf("\t║ 黑 玉 银 月 倚 明 星,斜 月 明 月 堪 称 朋。 ║\n"); printf("\t║ 二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星。 ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 1.人机对战 2.人人对战 ║\n"); printf("\t║ ║\n"); printf("\t╚═══════════════════════════ ══╝\n"); printf("\t\t\t请输入1或2:");

scanf("%d",&choice); /* 选择模式:人机或人人 */

while(choice!=1&&choice!=2) {

printf("输入错误,请重新输入:"); scanf("%d",&choice); }

if(choice==1){ /* 人机模式 */

system("cls");

printf("欢迎使用五子棋人机对战!下子请输入坐标(如13 6)。悔棋请输入15 1 5。\n\n\n");

for(j=0;j<15;j++)

for(i=0;i<15;i++)

qipan[j][i]=SPA; /* 置棋盘全为空 */

draw();

printf("先下请按1,后下请按2:"); scanf("%d",&i);

while(i!=1&&i!=2) { printf("输入错误,请重新输入:"); scanf("%d",&i); }

if(i==1) { /* 如果玩家先手下子 */

printf("请下子:"); scanf("%d%d",&a,&b);

while((a<0||a>14)||(b<0||b>14)) {

printf("坐标错误!请重新输入:"); scanf("%d%d",&a,&b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

}

while(x!=0){

if(x==225) {

c=7; d=7; qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑先下就下在7 7 */

else { AI(&c,&d); qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑下子 */

c1=c; d1=d; /* 储存电脑上手棋型 */

if(win(c,d)){ /* 电脑赢 */

printf("要悔棋吗?请输入y或n:"); getchar(); scanf("%c",&ch);

while(ch!='y'&&ch!='n') { printf("输入错误,请重新输入:");

scanf("%c",&ch); }

if(ch=='n') {

printf("下不过电脑很正常,请不要灰心!!!\n"); return; }

else { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA;

system("cls"); draw(); } /* 悔棋 */

}

printf("电脑下在%d %d\n请输入:",c,d);

scanf("%d%d",&a,&b); /* 玩家下子 */

if(a==15&&b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls"); draw();

printf("请输入:"); scanf("%d%d",&a,&b); } /* 悔棋 */

while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",&a,&b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

if(win(a,b)){ printf("电脑神马的都是浮云!!!\n");

return; } /* 玩家赢 */

}

printf("和局\n");

}

if(choice==2){

system("cls");

printf("欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 15。 \n\n\n");

for(j=0;j<15;j++)

for(i=0;i<15;i++)

qipan[j][i]=SPA; /* 置棋盘全为空 */

draw();

while(x!=0){

printf("1P请输入:"); scanf("%d%d",&a,&b);

if(a==15&&b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls");

draw(); printf("1P请输入:"); scanf("%d%d",&a,&b); }

while((a<0||a>14)||(b<0||b>14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",&a,&b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

printf("1P下在%d %d。\n",a,b);

if(win(a,b)){ printf("你真棒!!!\n"); return; } /* 玩家1赢 */

printf("2P请输入:"); scanf("%d%d",&c,&d);

if(c==15&&d==15) {

x+=2; qipan[b][a]=SPA; qipan[d1][c1]=SPA; system("cls"); draw();

printf("2P请输入:"); scanf("%d%d",&c,&d); }

while((c<0||c>14)||(d<0||d>14)||qipan[d][c]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:"); scanf("%d%d",&c,&d);

}

c1=c; d1=d; x--; qipan[d][c]=COM; system("cls"); draw();

printf("2P下在%d %d。\n",c,d);

if(win(c,d)){ printf("你真棒!!!\n"); return; } /* 玩家2赢 */

}

printf("和局\n");

}

}

void draw() /* 画棋盘 */

{

int i,j;

char p[15][15][4];

for(j=0;j<15;j++)

for(i=0;i<15;i++){

if(qipan[j][i]==SPA) strcpy(p[j][i]," \0");

if(qipan[j][i]==MAN) strcpy(p[j][i],"●\0");

if(qipan[j][i]==COM) strcpy(p[j][i],"◎\0"); }

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

printf(" ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐\n");

for(i=0,j=0;i<14;i++,j++){

printf(" %2d│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%d\n",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],j);

printf(" ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤\n"); }

printf(" 14│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│0\n",p[14][0],p[14][1],p[14][2],p[14][3],p[14][4],p[14][5],p[14][6],p[14][7],p[14][8],p[14][9],p[14][10],p[14][11],p[14][12],p[14][13],p[14][14]);

printf(" └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘\n");

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

}

int win(int p,int q) /* 判断胜利 p q为判断点坐标,胜利返回1,否则返回0 */

{

int k,n=1,m,P,Q; /* k储存判断点p q的状态COM或MAN。P Q储存判断点坐标。n为判断方向。m为个数。 */

P=p; Q=q; k=qipan[q][p];

while(n!=5){

m=0;

while(k==qipan[q][p]){

m++; if(m==5) return 1;

yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) break;

}

n+=4; m-=1; p=P; q=Q; /* 转向判断 */

while(k==qipan[q][p]){

m++;

if(m==5) return 1;

yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) break;

}

n-=3; p=P; q=Q; /* 不成功则判断下一组方向 */

}

return 0;

}

void AI(int *p,int *q) /* 电脑下子 *p *q返回下子坐标 */

{

int i,j,k,max=0,I,J; /* I J为下点坐标 */

for(j=0;j<15;j++)

for(i=0;i<15;i++)

if(qipan[j][i]==SPA){ /* 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 */

k=value(i,j); if(k>=max) { I=i; J=j; max=k; }

}

*p=I; *q=J;

}

int value(int p,int q) /* 计算空点p q的价值 以k返回 */

{

int n=1,k=0,k1,k2,K1,K2,X1,Y1,Z1,X2,Y2,Z2,temp;

int a[2][4][4]={40,400,3000,10000,6,10,600,10000,20,120,200,0,6,10,500,0,30,300,2500,5000,2,8,300,8000,26,160,0,0,4,20,300,0}; /* 数组a中储存己方和对方共32种棋型的值 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */

while(n!=5){

k1=qixing(n,p,q); n+=4; /* k1,k2为2个反方向的棋型编号 */

k2=qixing(n,p,q); n-=3;

if(k1>k2) { temp=k1; k1=k2; k2=temp; } /* 使编号小的为k1,大的为k2 */

K1=k1; K2=k2; /* K1 K2储存k1 k2的编号 */

Z1=k1%10; Z2=k2%10; k1/=10; k2/=10; Y1=k1%10; Y2=k2%10; k1/=10; k2/=10;

X1=k1%10; X2=k2%10; /* X Y Z分别表示 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */

if(K1==-1) {

if(K2<0) { k+=0; continue; } else k+=a[X2][Y2][Z2]+5; continue; }; /* 空棋型and其他 */

if(K1==-2) { if(K2<0) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/2; continue; }; /* 边界冲棋型and其他 */

if(K1==-3) { if(K2<0) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/3; continue; }; /* 边界空冲棋型and其他 */

if(((K1>-1&&K1<4)&&((K2>-1&&K2<4)||(K2>9&&K2<14)))||((K1>99&&K1<104)&&((K2>99&&K2<104)||(K2>109&&K2<114)))){

/* 己活己活 己活己冲 对活对活 对活对冲 的棋型赋值*/

if(Z1+Z2>=2) { k+=a[X2][Y2][3]; continue; }

else { k+=a[X2][Y2][Z1+Z2+1]; continue; }

}

if(((K1>9&&K1<14)&&(K2>9&&K2<14))||((K1>109&&K1<114)&&(K2>109&&K2<114))){

/* 己冲己冲 对冲对冲 的棋型赋值*/

if(Z1+Z2>=2) { k+=10000; continue; }

else { k+=0; continue; }

}

if(((K1>-1&&K1<4)&&((K2>99&&K2<104)||(K2>109&&K2<114)))||((K1>9&&K1<14)&&((K2>99&&K2<104)||(K2>109&&K2<114)))){

/* 己活对活 己活对冲 己冲对活 己冲对冲 的棋型赋值*/

if(Z1==3||Z2==3) { k+=10000; continue; }

else { k+=a[X2][Y2][Z2]+a[X1][Y1][Z1]/4; continue; }

}

else

{ k+=a[X1][Y1][Z1]+a[X2][Y2][Z2]; continue; } /* 其他棋型的赋值 */

}

return k;

}

int qixing(int n,int p,int q) /* 返回空点p q在n方向上的棋型号 n为1-8方向 从右顺时针开始数 */

{

int k,m=0; /* 棋型号注解: 己活000-003 己冲010-013 对活100-103 对冲110-113 己空活020-023 己空冲030-033 对空活120-123 对空冲130-133 空-1 边界冲-2 边界空冲-3*/

yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) k=-2; /* 边界冲棋型 */

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+9; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) { k=m+9; return k; }

}

if(qipan[q][p]==SPA) k=m-1; /* 己方活棋型 */

else k=m+9; /* 己方冲棋型 */

}break;

case MAN:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+109; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,&p,&q); if(p<0||p>14||q<0||q>14) { k=m+109; return k; }

}

if(qipan[q][p]==SPA) k=m+99; /* 对方活棋型 */

else k=m+109; /* 对方冲棋型 */

}break;

case SPA:{

yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=-3; return k; } /* 边界空冲棋型 */

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+29; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+29; return k; }

}

if(qipan[q][p]==SPA) k=m+19; /* 己方空活棋型 */

else k=m+29; /* 己方空冲棋型 */

}break;

case MAN:{

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+129; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,&p,&q);

if(p<0||p>14||q<0||q>14) { k=m+129; return k; }

}

if(qipan[q][p]==SPA) k=m+119; /* 对方空活棋型 */

else k=m+129; /* 对方空冲棋型 */

}break;

case SPA: k=-1; break; /* 空棋型 */

}

}break;

}

return k;

}

void yiwei(int n,int *i,int *j) /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */

{

switch(n){

case 1: *i+=1; break;

case 2: *i+=1; *j+=1; break;

case 3: *j+=1; break;

case 4: *i-=1; *j+=1; break;

case 5: *i-=1; break;

case 6: *i-=1; *j-=1; break;

case 7: *j-=1; break;

case 8: *i+=1; *j-=1; break;

}

}

求一原创的c语言五子棋代码(会查重),要求人机对战,输入坐标对战即可,不需用鼠标点击,最好有禁手。

//但是这些代码由于编译器的原因,在TC下仍无法运行。请使用VC。

#include <conio.h>

#include <windows.h>

#include <stdlib.h>

#include <stdio.h>

int ChessData[15][15] ={0};

int GuangbiaoData[2]={8,8};

int ChessStepData[255][2]={0};

void gotoxy(int x, int y) //gotoxy在TC中是在一个系统自带的函数,但是在VC中没有这个函数,所以在网上找到了这个函数以实现同样的功能。

//只有这一个函数是网上找的,别的全部我自己写的。

{

COORD c;

c.X=x-1;

c.Y=y-1;

SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);

}

void GotoChess(int x,int y)

{

x=3*x-2;y=2*y-1;

gotoxy(x,y);

}

void Move(int MoveData) //输入参数为用户输入的方向(1表示上,2表示下,3表示左,4表示右)

{

switch (MoveData)

{

case 1:GuangbiaoData[1]-=1;break;

case 2:GuangbiaoData[1]+=1;break;

case 3:GuangbiaoData[0]-=1;break;

case 4:GuangbiaoData[0]+=1;break;

default:printf("Move函数出错");

}

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

}

int Get(int *data) //该函数的功能是用户的按键,并转化为01234567(0表示输入错误,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。)

{ //并返回输入的用户号码(共同键返回3),错误则返回0

int temp;

B: temp=getch();

if (temp==224)

{

temp=getch();

switch (temp)

{

case 72:*data=1;break;

case 80:*data=2;break;

case 75:*data=3;break;

case 77:*data=4;break;

default:goto B;

}

return 2;

}

else

{

switch (temp)

{

case 'w':

case 'W':*data=1;return 1;break;

case 's':

case 'S':*data=2;return 1;break;

case 'a':

case 'A':*data=3;return 1;break;

case 'd':

case 'D':*data=4;return 1;break;

case 13 :*data=5;return 2;break;

case 32 :*data=5;return 1;break;

case 8 :*data=6;break;

case 27 :*data=7;break;

default:*data=0 ;return 0;break;

}

return 3;

}

}

void MoveToEnd()

{

gotoxy(1,30);

}

int LogicBeOut(int a,int b)

{

if (a==-1||a==15||b==-1||b==15) return 1;

else return 0;

}

int win(int v)

{

int i=1,j=1,a=0,b=0;

while (ChessData[a=GuangbiaoData[0]-i-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b)) i++;

while (ChessData[a=GuangbiaoData[0]+j-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b)) j++;

if (i+j-1>=5) return 1;

i=1,j=1,a=0,b=0;

while (ChessData[a=GuangbiaoData[0]+i-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b)) i++;

while (ChessData[a=GuangbiaoData[0]-j-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b)) j++;

if (i+j-1>=5) return 1;

i=1,j=1,a=0,b=0;

while (ChessData[a=GuangbiaoData[0]-i-1][b=GuangbiaoData[1]-1]==v*2&&!LogicBeOut(a,b)) i++;

while (ChessData[a=GuangbiaoData[0]+j-1][b=GuangbiaoData[1]-1]==v*2&&!LogicBeOut(a,b)) j++;

if (i+j-1>=5) return 1;

i=1,j=1,a=0,b=0;

while (ChessData[a=GuangbiaoData[0]-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b)) i++;

while (ChessData[a=GuangbiaoData[0]-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b)) j++;

if (i+j-1>=5) return 1;

return 0;

}

void NewShow() //新棋局的开始

{

int i,j;

for (i=0;i<15;i++)

for (j=0;j<15;j++)

ChessData[i][j]=0;

system("cls");

for (i=1;i<=29;i++)

{

for (j=1;j<=43;j++)

if(i%2==1) printf("-");

else if (j%3==1) printf("|");

else printf(" ");

printf("\n");

}

GuangbiaoData[0]=8;GuangbiaoData[1]=8;

MoveToEnd();

printf("现在请用户1下棋 \n");

printf("用户1使用 w,s,a,d移动光标,空格键落子\n");

printf("用户2使用各方向键移动光标,回车键落子\n");

printf("按下Backspace键悔棋,按下esc返回主菜单\n");

GotoChess(8,8);

}

int BeOut(int data)

{

int Xiuzheng[2],New[2];

switch (data)

{

case 1:Xiuzheng[0]=0;Xiuzheng[1]=-1 ;break;

case 2:Xiuzheng[0]=0;Xiuzheng[1]=1;break;

case 3:Xiuzheng[0]=-1;Xiuzheng[1]=0;break;

case 4:Xiuzheng[0]=1;Xiuzheng[1]=0 ;break;

case 5:Xiuzheng[0]=0;Xiuzheng[1]=0 ;break;

default:printf("BeOut函数出错");

}

New[0]=GuangbiaoData[0]+Xiuzheng[0];

New[1]=GuangbiaoData[1]+Xiuzheng[1];

if (New[0]>15||New[0]<1||New[1]>15||New[1]<1) return 1;

else return 0;

}

void UserChoose(int * choice)

{

system("cls");

printf("________________________________________________________________________________");

printf("________________________________________________________________________________");

printf(" $1.单人游戏 ");

printf(" 2.双人游戏 ");

printf(" 3.退出游戏 ");

printf(" 4.游戏帮助 ");

printf("________________________________________________________________________________");

printf("________________________________________________________________________________");

printf(" ");

printf(" 开心五子棋 ");

printf(" ");

printf(" 出品人:张云聪 ");

printf(" 学号:067108034 ");

printf(" 指导老师:邵艳玲 ");

printf(" ");

printf(" ");

printf(" 温馨提示,游戏时请把窗口最大化,以达到最佳效果 ");

printf("________________________________________________________________________________");

int temp=0,i=0;

do

{

if ((temp=getch())==224)

{

temp=getch();

if (temp==72&&i!=0)

{

gotoxy(34,3+i);

printf(" ");

i--;

gotoxy(34,3+i);

printf("$");

gotoxy(0,0);

}

else if(temp==80&&i!=3)

{

gotoxy(34,3+i);

printf(" ");

i++;

gotoxy(34,3+i);

printf("$");

gotoxy(0,0);

}

}

else if (temp==13) {*choice=i+1;return;}

else if (temp==27) {*choice=3;return;}

else if (temp=='1'||temp=='2'||temp=='3'||temp=='4') {*choice=temp-48;return;}

}while(1);

}

int CannotDo(int v1,int v2,int MoveData,int choice) //第一个输入值为按键的用户号,第二个是本应该按键的用户号,第三个为按下键的对应值,第四个键代表游戏模式。

{

if (v1==3) return 0; //如果用户输入的为共用按键,则CannotDo为假

else if (v1==0) return 1;//如果用户输入错误,则CannotDo为真

else if (v1!=v2&&choice==2) return 1; //如果不该此用户输入,而用户进行了输入,则CannotDo为真

if (BeOut(MoveData)) return 1; //如果移动出边界则CannotDo为真

return 0;

}

int CannotLuozi() //判断是否可以落子。

{

if (ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1])

return 1;

else return 0;

}

int luozi(int v) //玩家v落子。

{

ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1]+=v*2;

if (v==1) printf("O");

else if (v==2) printf("X");

else printf("luozi函数出错");

if (win(v)) {MoveToEnd();printf("玩家%d获得了胜利! \n",v);for (int i=1;i<=240;i++) printf(" ");GotoChess(GuangbiaoData[0],GuangbiaoData[1]);getch();return 1;}

MoveToEnd();

printf("现在请用户%d下棋 ",v%2+1);

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

return 0;

}

void HuiQi(int step) //输入的是当前的要悔的棋是第几步

{

GuangbiaoData[0]=ChessStepData[step-1][0];

GuangbiaoData[1]=ChessStepData[step-1][1];

ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1]=0;

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

printf("-");

MoveToEnd();

printf("现在请用户%d下棋 ",(step+1)%2+1);

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

}

int DataGetAndChoose(int choice)

{

int MoveData=0,i=0,temp; //MoveData 0表示不可移动,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。

while(1)

{

loop: while (temp=Get(&MoveData),CannotDo(temp,i%2+1,MoveData,choice));

switch (MoveData)

{

case 1:

case 2:

case 3:

case 4:Move(MoveData);break;

case 7:return 0;

case 6:

if (i==0) {MoveToEnd();printf("现在无法悔棋 ");GotoChess(GuangbiaoData[0],GuangbiaoData[1]);}

else HuiQi(i--);

break;

case 5:

if (CannotLuozi()) goto loop;

if(luozi(i%2+1)) return 0;

ChessStepData[i][0]=GuangbiaoData[0];

ChessStepData[i][1]=GuangbiaoData[1];

i++;

break;

default:printf("DataGetAndChoose函数出错");break;

}

}

return 1;

}

void ShowHelp()

{

system("cls");

printf("********************************************************************************");

printf("********************************************************************************");

printf("****** 单人游戏供用户一个人自己与自己下棋研究棋局之用 ******");

printf("****** 双人游戏中,用户1使用wsad控制方向,按空格落子 ******");

printf("****** 用户2按方向键控制方向,回车键落子 ******");

printf("****** 游戏过程中按esc返回主菜单 ******");

printf("****** 游戏过程中退格键悔棋 ******");

printf("****** 双人模式中某人下棋时,另一个用户无法控制光标与落子 ******");

printf("****** ******");

printf("****** 帮助 ******");

printf("****** 按任意键返回 ******");

printf("********************************************************************************");

printf("********************************************************************************");

getch();

}

int main()

{

int choice=0;

system("color 2b");

choose: UserChoose(&choice);

if (choice<1||choice>4) goto choose;

if (choice==3) {gotoxy(1,18);

printf("\n谢谢您的使用,再见 "); getch();return 0;}

if (choice==4) {ShowHelp(); goto choose;}

NewShow();

DataGetAndChoose(choice);

main();

return 0;

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

//棋盘初始化函数

//Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL

void init_Chessboard(char Chessboard[][7], int ln)

{

if ((Chessboard != NULL) && (ln>0)){

int i = 0, j = 0;

for (i = 0; i<ln; ++i){

for (j = 0; j<ln; ++j){

Chessboard[i][j] = '\t';

}

}

// return Chessboard;

}

// return NULL;

}

//未完待续

关于“怎样用c语言编写五子棋的棋盘”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。