C语言编写的与电脑下棋程序代码
- 格式:doc
- 大小:22.00 KB
- 文档页数:7
#i n c l u d e<s t d i o.h>#define N 10void welcome();void initqipan();void showqi(int i);void save(int p);void panduan(int p);/******************主函数*****************/void main(){int p=0;welcome();initqipan();for(p=1;p<=N*N;p++){weizhi[p].x[p]=zouqihang(); weizhi[p].y[p]=zouqilie();save(p);showqi(p);panduan(p);{printf("%d",i);printf(" ");}printf("\n");for(i=1;i<N;i++){for(j=0;j<N;j++){if(j==0)elsefp=fopen("wuzi_list","rb");for(i=1;i<=N*N;i++){fread(&weizhi[i],sizeof(struct zuobiao),1,fp);a[i]=weizhi[i].x[i];b[i]=weizhi[i].y[i];}for(m=1;m<p;m++){while(weizhi[p].x[p]==a[m]&&weizhi[p].y[p]==b[m]){for(i=1;i<N;i++){for(j=1;j<N;j++){if(j==1)printf("%d",i);for(k=1;k<=p;k++){if(i==weizhi[k].x[k]&&j==weizhi[k].y[k]){{printf("int zouqihang(){int x;printf("请输入要走棋子所在行数!\n");printf("x=");scanf("%d",&x);while(x>N-1||x<1){printf("error!\n");printf("请输入要走棋子所在行数!\n");}!\n");{printf("error!\n");printf("请输入要走棋子所在列数!\n");printf("y=");scanf("%d",&y);}return y;}/******************文件保存*****************/void save(int i){FILE *fp;{fread(&weizhi[i],sizeof(struct zuobiao),1,fp);a[i]=weizhi[i].x[i];b[i]=weizhi[i].y[i];}/*****************判断行******************/for(i=1;i<=p;i++){if(i%2==1){{{k[0]++;continue;}else if((a[i]==a[j])&&(b[i]==b[j]-4)){k[0]++;continue;}else if(k[0]==5){}{for(j=2;j<=p;j=j+2){if((a[i]==a[j])&&(b[i]==b[j]-1)){k[1]++;continue;}else if((a[i]==a[j])&&(b[i]==b[j]-2)){}else if(k[1]==5){printf("Player 2 wins!!!\n");}else}if(k[1]==5)break;k[1]=1;}}/**********************判断列k[2]++;continue;}else if((a[i]==a[j]-2)&&(b[i]==b[j])){continue;}else if((a[i]==a[j]-3)&&(b[i]==b[j])){}continue;}if(k[2]==5)break;k[2]=1;}else if(k[2]==5)break;else if(i%2==0){{{k[3]++;continue;}else if((a[i]==a[j]-4)&&(b[i]==b[j])){k[3]++;continue;}else if(k[3]==5){}{if(k[0]==5||k[1]==5||k[2]==5||k[3]==5)break;else if(i%2==1){for(j=1;j<=p;j=j+2){if((a[i]==a[j]-1)&&(b[i]==b[j]-1)){k[4]++;}{k[4]++;continue;}else if(k[4]==5){printf("Player 1 wins!!!\n");}elsecontinue;}k[5]++;continue;}else if((a[i]==a[j]-2)&&(b[i]==b[j]-2)){k[5]++;continue;}else if((a[i]==a[j]-3)&&(b[i]==b[j]-3)){}continue;}if(k[5]==5)break;k[5]=1;}}/**********判断对角(左下-右上)************/for(i=1;i<=p;i++){break;k[6]++;continue;}else if((a[i]==a[j]+3)&&(b[i]==b[j]-3)){k[6]++;continue;}else if((a[i]==a[j]+4)&&(b[i]==b[j]-4)){}}else if(k[6]==5)break;else if(i%2==0){for(j=2;j<=p;j=j+2){if((a[i]==a[j]+1)&&(b[i]==b[j]-1)){k[7]++;}{k[7]++;continue;}else if(k[7]==5){printf("Player 2 wins!!!\n");}elsecontinue;}}/****************游戏结束*******************/void over(){printf("************************************\n");printf(" game over!!!\n");printf("************************************\n");}/****************游戏开始*******************/void welcome(){。
C语⾔-⿊⽩棋(⼈机对战)1 #include <stdio.h>2 #include <stdlib.h>3/*4具体思路如下:51.定义⼀个⼆维数组chessboard[8][8],⽤于保存⿊⽩双⽅棋⼦的位置。
如果数组元素为0,表⽰该单元格未落⼦;如果是-1,表⽰该单元格是⿊⼦;如果是1,则表⽰该单元格是⽩⼦。
62.当⼀⽅下棋时,先检查是否有位置可下,如果有则⼰⽅下棋,如果没有就让对⼿下棋。
73.若玩家下,需要等待玩家输⼊棋⼦坐标,然后执⾏翻转对⼿棋⼦操作。
84.若计算机下,程序需对棋盘所有可以落⼦的位置进⾏判断,找出最佳的落⼦位置,然后执⾏翻转对⼿棋⼦操作。
95.重复步骤2~4,直到棋盘已满或双⽅都不能下⼦时结束。
10*/1112void Output(char chessboard[][8]); //显⽰棋盘中的下⼦情况13int Check(char chessboard[][8],int moves[][8],char player);//检查⼀⽅是否有位置下⼦14void PlayStep(char chessboard[][8],int row,int col,char player);//在指定位置下棋15void AutoPlayStep(char chessboard[][8],int moves[][8],char player);//计算机思考下⼦16int GetMaxScore(char chessboard[][8],char player);//获取分数17int BestPlay(char chessboard[][8],int moves[][8],char player);//最优下⼦位置181920int main(){21char chessboard[8][8];//保存棋盘中各单元格下⼦的状态22int isDown[8][8] = {0};//保存棋盘中的各个位置是否可以下⼦,可以下的位置为1,其余为023int row,col,x,y;24int iCount = 0;//以下⼦的数量25int player = 0;//下棋⽅26int SkipPlay = 0;//重置下⼦的次数为0,若为2,则表⽰双⽅都不能下⼦27int Score[2];//保存计算机和玩家的得分2829char select,ch;3031 printf("⿊⽩棋\n\n");32 printf("玩家执⿊⼦先⾏,计算机执⽩,按Enter开始\n");333435 scanf("%c",&select);3637do{3839if(player==0){40 player = 1;41 }else{42 player = 0;43 }4445for(row=0;row<8;row++){46for(col=0;col<8;col++){47 chessboard[row][col]=0;48 }49 }5051 iCount = 4;//游戏开始的四颗棋⼦52 chessboard[3][3] = chessboard[4][4] = 1;53 chessboard[3][4] = chessboard[4][3] = -1;5455 printf("\n棋盘初始状态:\n");56 Output(chessboard);5758//双⽅下棋59do{60if(player==1){//玩家下棋(⿊)61 player = 0;62if(Check(chessboard,isDown,2)){63while(1){64 fflush(stdin);65 printf("输⼊下⼦的位置(⾏,列):");66 scanf("%d%c",&x,&ch);67 x--;//因为数组是从0开始存的68if(ch>='a'){69 y = ch - 'a' + 1;70 } else{71 y = ch - 'A' + 1;72 }73 y--;74//判断是否越界、是否已有棋⼦75if(x>=0&&x<8&&y>=0&&y<8&&isDown[x][y]){76 PlayStep(chessboard,x,y,2);77 iCount++;78break;79 }else{80 printf("坐标输⼊有误,请重新输⼊。
C语言教程:简易五子棋程序收集于网络/* 纯用字符和数组编的五子棋,棋盘也是用字符画的。
编了1上午了,主要是算法跟按键比较烦,发现有bug-- 按键速度过快会产生延时显示,可能是算法不好。
操作:玩家1:a,s,w,d(方向)空格(落子)玩家2:上、下、左、右回车(落子)ESC:退出编译测试环境:TC3.0*/#include <stdio.h>#include <stdlib.h>#include <bios.h>#include <conio.h>#define CRRU 0xbf /*右上角点197*/#define CRLU 0xda /*左上角点218*/#define CRLD 0xc0 /*左下角点192*/#define CRRD 0xd9 /*右下角点217*/#define CRL 0xc3 /*左边195*/#define CRR 0xb4 /*右边190*/#define CRU 0xc2 /*上边194*/#define CRD 0xc1 /*下边193*/#define CR 0xc5 /*十字交叉点197*/#define size 19char a[size][size];int i,j; //跟踪光标在数组中对应的位置int x=10;int y=3; //光标所在位的坐标int side=1; //持子方1为玩家1,2为玩家2;int CB=1; int CW=2; // 棋子图形void inita() ;void inits();void pressco(int );void pressct(int );int judge(int);int main(){inita();inits();getch();while(1){int press=bioskey(0);if(press==283)break;if(side==1){pressco(press);if(side==2)if(judge(1)==1) {gotoxy(1,1);printf("the play1 win");break;}}if(side==2){pressct(press);if(side==1)if(judge(2)==1){gotoxy(1,1);printf("the play2 win");break;}}}getch();return 0;}void inita() //数组初始化;{a[0][0]=CRLU;a[0][size-1]=CRRU;a[size-1][0]=CRLD;a[size-1][size-1]=CRRD;for(int i=1;i<size-1;i++){a[0][i]=CRU;a[size-1][i]=CRD;a[i][0]=CRL;a[i][size-1]=CRR;for(int j=1;j<size-1;j++)a[i][j]=CR;}return ;}void inits() //界面初始化{for(int i=0;i<size;i++){gotoxy(x,y+i);for(int j=0;j<size;j++)putch(a[i][j]);}gotoxy(x,y);i=0;j=0;return ;}void pressco(int m){switch(m){case 7777: //Aif(i>0) {i--;x--;gotoxy(x,y);} break;case 8051: //Sif(j<size-1){j++;y++;gotoxy(x,y);} break;case 4471: //wif(j>0) {j--;y--;gotoxy(x,y);} break;case 8292: //Dif(i<size-1){i++;x++;gotoxy(x,y);} break;case 14624: //空格if(a[i][j]!=CB&&a[i][j]!=CW){a[i][j]=CB;putch(CB);gotoxy(x,y);side=2;}break;default: break;}return ;}void pressct(int m){switch(m){case 19200: //左if(i>0) {i--;x--;gotoxy(x,y);} break;case 20480: //下if(j<size-1){j++;y++;gotoxy(x,y);} break;case 18432: //上if(j>0) {j--;y--;gotoxy(x,y);} break;case 19712: //右if(i<size-1){i++;x++;gotoxy(x,y);} break;case 7181: //回车if(a[i][j]!=CB&&a[i][j]!=CW){a[i][j]=CW;putch(CW);gotoxy(x,y);side=1;}break;default: break;}return ;}int judge(int pa) //判断是否胜利,胜利则返回1,否则返回0;// 其中i,j为当前的落子位;{int m;int sum=1;for(m=1;m<=i&&m<=j;m++) {if(a[i-m][j-m]!=pa) break;sum++;}for(m=1;m<(size-i)&&m<(size-j);m++) {if(a[i+m][j+m]!=pa) break;sum++;}if(sum>=5) return 1;else sum=1;for(m=1;m<=i;m++) {if(a[i-m][j]!=pa) break;sum++;}for(m=1;m<(size-j);m++) {if(a[i+m][j]!=pa) break;sum++;}if(sum>=5) return 1;else sum=1;for(m=1;m<=j;m++) {if(a[i][j-m]!=pa) break;sum++;}for(m=1;m<(size-j);m++) {if(a[i][j+m]!=pa) break;sum++;}if(sum>=5) return 1;else sum=1;for(m=1;m<=i&&m<(size-j);m++) {if(a[i-m][j+m]!=pa) break;sum++;}for(m=1;m<(size-i)&&m<=j;m++) {if(a[i+m][j-m]!=pa) break;sum++;}if(sum>=5) return 1;else return 0;本文章来自 21视频教程网C语言教程:简易五子棋程序_C语言程序设计教程原文链接:/html/96307.shtml。
c语言围棋程序代码以下是一个简单的C语言围棋程序的示例代码:```c#include <stdio.h>#define BOARD_SIZE 9enum Stone {EMPTY,BLACK,WHITE};enum Stone board[BOARD_SIZE][BOARD_SIZE];void init_board() {for (int i = 0; i < BOARD_SIZE; i++) {for (int j = 0; j < BOARD_SIZE; j++) {board[i][j] = EMPTY;}}}void print_board() {for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { switch (board[i][j]) {case EMPTY:printf(".");break;case BLACK:printf("X");break;case WHITE:printf("O");break;}}printf("\n");}}int main() {init_board();print_board();return 0;}```这个程序定义了一个9x9的围棋棋盘,使用`enum Stone`枚举类型表示棋盘上的三种棋子状态:空、黑子、白子。
`init_board()`函数用于初始化棋盘,将所有位置都设为EMPTY。
`print_board()`函数用于打印当前棋盘状态。
在`main()`函数中,首先调用`init_board()`初始化棋盘,然后调用`print_board()`打印初始棋盘状态。
你可以根据需要进一步扩展和完善这个程序,例如添加下子功能、判断胜负等等。
#include<graphics.h>#include<conio.h>#include<string.h>#include<bios.h>#include<stdlib.h>#include"c:\tc\LIB\1.c"#define W 119#define S 115#define A 97#define D 100#define space 32#define UP 72#define DOWN 80#define LEFT 75#define RIGHT 77#define ENTER 13void qipan();void jiemian(int);void guangbiao1(int,int);void guangbiao2(int,int);void xuanzhong(int,int);void gaizi(int,int);char array(int,int);void xiazi(int,int,int,int);/*int panding(char,int,int,int,int);*/main(){int gdriver,gmode,i=0,c=0,x=190,y=190,m,n; char p;FILE *fp;gdriver=DETECT;gmode=0;if((fp=fopen("file.txt","at")) == NULL) {printf("Cannot open file!");system("pause");exit(0);}printf("%d,%d",gdriver,gmode); registerbgidriver(EGAVGA_driver);initgraph(&gdriver,&gmode,"c:\\tc"); cleardevice();while(c!=27){c=getch();clrscr();jiemian(i);if(c==80){fputs("down ",fp);i++;if(i==4){i=0;}}if(i==1){if(c==13){fputs("enter ",fp);qipan();c=getch();while(c!=27){c=getch();if(c==115){fputs("S ",fp);y=y+40;guangbiao1(x,y);guangbiao2(x,y-40);}if(c==119){fputs("W ",fp);y=y-40;guangbiao1(x,y);guangbiao2(x,y+40);}if(c==97){ fputs("A\n",fp);x=x-40;guangbiao1(x,y);guangbiao2(x+40,y);}if(c==100){ fputs("D\n",fp);x=x+40;guangbiao1(x,y);guangbiao2(x-40,y);}if(c==13){fputs("enter\n",fp);xuanzhong(x,y);m=x;n=y;}if(c==32){fputs("space\n",fp);xiazi(m,n,x,y);fputs("gaizi\n",fp);gaizi(m,n);}if(x>350||y>390||x<30||y<30){x=190;y=30;}}}}}getch();closegraph();fclose(fp);restorecrtmode();return 0;}void qipan(){int i,j;setbkcolor(GREEN);cleardevice();setlinestyle(0,0,3);setcolor(1);rectangle(10,10,370,410);rectangle(30,30,350,390);for(i=1;i<8;i++){setlinestyle(0,0,3);line(i*40+30,30,i*40+30,190);line(i*40+30,230,i*40+30,390);}for(j=1;j<9;j++){setlinestyle(0,0,3);line(30,j*40+30,350,j*40+30);}setlinestyle(3,0,3);line(150,30,230,110);line(230,30,150,110);line(150,310,230,390);line(230,310,150,390); setusercharsize(4,1,2,1); settextstyle(1,0,4);outtextxy(70,195,"chinese chess"); red_shuai(190,30);red_shi(150,30);red_shi(230,30);red_xiang(110,30);red_xiang(270,30);red_ma(70,30);red_ma(310,30);red_ju(30,30);red_ju(350,30);red_pao(70,110);red_pao(310,110);red_bing(30,150);red_bing(110,150);red_bing(190,150);red_bing(270,150);red_bing(350,150);black_jiang(190,390);black_shi(150,390);black_shi(230,390);black_xiang(110,390);black_xiang(270,390);black_ma(70,390);black_ma(310,390);black_ju(30,390);black_ju(350,390);black_pao(70,310);black_pao(310,310);black_zu(30,270);black_zu(110,270);black_zu(190,270);black_zu(270,270);black_zu(350,270);setcolor(BLUE);rectangle(400,30,600,320);setcolor(4);settextstyle(1,0,2);outtextxy(420,50,"A->shuai B->shi"); outtextxy(420,80,"C->xiang D->ma"); outtextxy(420,110,"E->ju F->pao"); outtextxy(420,140,"G->bing"); setcolor(8);outtextxy(420,200,"H->jiang I->shi"); outtextxy(420,230,"J->xiang K->ma"); outtextxy(420,260,"L->ju M->pao"); outtextxy(420,290,"N->zu");}void jiemian(int i){setbkcolor(GREEN); cleardevice();settextstyle(1,0,8);setcolor(BLUE);outtextxy(50,70,"chinese chess"); settextstyle(0,0,3);setcolor(RED);outtextxy(260,215,"start"); outtextxy(260,255,"again"); outtextxy(260,295,"undo"); outtextxy(260,335,"exit"); rectangle(250,210+i*40,390,240+i*40); }void guangbiao1(int x,int y){setcolor(WHITE);setlinestyle(0,0,3);line(x-17,y-7,x-17,y-17);line(x-7,y-17,x-17,y-17);line(x+7,y-17,x+17,y-17);line(x+17,y-7,x+17,y-17);line(x-7,y+17,x-17,y+17);line(x-17,y+7,x-17,y+17);line(x+17,y+7,x+17,y+17);line(x+7,y+17,x+17,y+17);}void guangbiao2(int x,int y){setcolor(GREEN);setlinestyle(0,0,3);line(x-17,y-7,x-17,y-17);line(x-7,y-17,x-17,y-17);line(x+7,y-17,x+17,y-17);line(x+17,y-7,x+17,y-17);line(x-7,y+17,x-17,y+17);line(x-17,y+7,x-17,y+17);line(x+17,y+7,x+17,y+17);line(x+7,y+17,x+17,y+17);}void xuanzhong(int x,int y){setcolor(CYAN);setlinestyle(0,0,3);circle(x,y,15);}void gaizi(int x1,int y1){setlinestyle(0,0,3);setcolor(GREEN);circle(x1,y1,15);setfillstyle(0,3);floodfill(x1,y1,GREEN);setcolor(1);setlinestyle(0,0,3);if((30<x1<350)&&((y1==30)||(y1==230))) {line(x1-18,y1,x1+18,y1);line(x1,y1,x1,y1+18);if((30<x1<350)&&(y1==390||y1==190)) {line(x1-18,y1,x1+18,y1);line(x1,y1-18,x1,y1);}if((30<y1<390)&&x1==30){line(x1,y1,x1+18,y1);line(x1,y1-18,x1,y1+18);}if((30<y1<390)&&(x1==350)){line(x1-18,y1,x1,y1);line(x1,y1-18,x1,y1+18);}if((x1==30)&&(y1==30)){line(x1,y1,x1+18,y1);line(x1,y1,x1,y1+18);}if((x1==350)&&(y1==30)){line(x1-18,y1,x1,y1);line(x1,y1,x1,y1+18);}if((x1==30)&&(y1==390)){line(x1,y1,x1+18,y1);line(x1,y1,x1,y1-18);}if((x1==350)&&(y1==390)){line(x1,y1,x1-18,y1);line(x1,y1,x1,y1-18);}else{line(x1-18,y1,x1+18,y1);line(x1,y1-18,x1,y1+18);}}char array(int i,int j)char a[13][13];int c,b;c=i;b=j;for(c=1;c<10;c++){for(b=1;b<11;b++){a[c][b]='Z';}}a[1][5]='A';a[1][4]='B';a[1][6]='B';a[1][3]='C';a[1][7]='C';a[1][2]='D';a[1][8]='D';a[1][1]='E';a[1][9]='E';a[3][2]='F';a[3][8]='F';a[4][1]=a[4][3]=a[4][5]=a[4][7]=a[4][9]='G';a[10][5]='H';a[10][4]='I';a[10][6]='I';a[10][3]='J';a[10][7]='J';a[10][2]='K';a[10][8]='K';a[10][1]='L';a[10][ 9]='L';a[2][3]='M';a[8][3]='M';a[7][1]=a[7][3]=a[7][5]=a[7][7]=a[7][9]='N';return a[i][j];}void xiazi(int x6,int y6,int x7,int y7){switch(array(y6/40+1,x6/40+1)){case 'A':red_shuai(x7,y7);break;case 'B':red_shi(x6,y7);break;case 'C':red_xiang(x7,y7);break;case 'D':red_ma(x7,y7);break;case 'E':red_ju(x7,y7);break;case 'F':red_pao(x7,y7);break;case 'G':red_bing(x7,y7);break;case 'H':black_jiang(x7,y7);break;case 'I':black_shi(x7,y7);break;case 'J':black_xiang(x7,y7);break;case 'K':black_ma(x7,y7);break;case 'L':black_ju(x7,y7);break;case 'M':black_pao(x7,y7);break;case 'N':black_zu(x7,y7);break;case 'Z':gaizi(x6,x6);break;}}/*int panding(char q,int x,int y,int a,int b){switch(q){case 'A':if(y>110||x>230||x<150||(a-x)>40||(x-a)>40||(y-b)>40||(b-y)>40)return 0;elsereturn 1;break;case'B':if(((x-a)==40&&(y-b)==40)&&y<=110&&230<x<150||((a-x)==40&&(b-y)==40)&&y<=110& &230>x>150)return 1;elsereturn 0;break;case'C':if((((x-a)==80&&(y-b)==80)&&y<=190)&&(array((y+b)/2/40+1,(x+a)/2/40+1,)=='Z')))||(((a-x)==80&&(b-y)==80)&&y<=190)&&(array((y+b)/2/40+1,(x+a)/2/40+1)=='Z'))))return 1;elsereturn 0;break;case'D':if((((x-a)==80&&(y-b)==40&&(array(y/40+1,(x-40)/40+1)=='Z'))||(((a-x)==80&&(b-y)==40)&&(array(y/40+1,(x+40)/40+1)=='Z'))||(((x-a)==40&&(y-b)==80)(array((y-40)/40+1,x/40+1)==' Z'))||(((a-x)==40&&(b-y)==80)&&(array((y+40)/40+1,x/40+1)=='z'))))return 1;elsereturn 0;break;case 'E':return 1;break;case 'F':return 1;break;case 'G':if(y<190){if(y>b||x!=a){return 0;}elsereturn 1;}else{if((b-y)>40||(a-x)>40||(x-a)>40||y>b){return 0;}elsereturn 1;}break;case 'H':if(y<310||x>230||x<150||(a-x)>40||(x-a)>40||(y-b)>40||(b-y)>40)return 0;elsereturn 1;break;case'I':if(((x-a)==40&&(y-b)==40)&&y>=310&&230<x<150||((a-x)==40&&(b-y)==40)&&y>310&& 230>x>150)return 1;elsereturn 0;break;case'J':if(((((x-a)==80&&(y-b)==80)&&y>=230)&&array(((y+b)/2/40+1,(x+a)/2/40+1)=='Z')))||(((a-x )==80&&(b-y)==80)&&y>=230)&&(array((y+b)/2/40+1,(x+a)/2/40+1)=='Z'))))return 1;elsereturn 0;break;case'K':if((((x-a)==80&&(y-b)==40&&(array(y/40+1,(x-40)/40+1)=='Z'))||(((a-x)==80&&(b-y)==40) &&(array(y/40+1,(x+40)/40+1)=='Z'))||(((x-a)==40&&(y-b)==80)(array((y-40)/40+1,x/40+1)==' Z'))||(((a-x)==40&&(b-y)==80)&&(array((y+40)/40+1,x/40+1)=='Z'))return 1;elsereturn 0;break;case 'L':return 1;break;case 'M':return 1;break;case 'N':if(y>230){if(y<b||x!=a){return 0;}elsereturn 1;}else{if(y-b>40||(a-x)>40||(x-a)>40||y<b){return 0;}elsereturn 1;}default:return 0;}}*/精品。
#include <stdio.h>#include <stdlib.h>#define m 30int main (void){int count;//计数器算横纵行的结果int w,h;int u;int l;int i,size;//i声明步数。
size声明int r[m][m] = {0};//数组声明(棋子位置)int x, y;//声明落子坐标int n;//声明棋盘大小nchar a[20],b[20];printf ("请输入棋盘大小n\n");//编辑棋盘直到棋盘长度宽度大于4小于30 scanf ("%d", &n);if (n<=4 || n>m){do{printf ("输入的棋盘大小:4<n<%d\n", m);scanf ("%d", &n);}while (n<=4 || n>m);}getchar ();//声明玩家printf ("请输入玩家1姓名:\n");gets(a);printf ("请输入玩家2姓名:\n");gets(b);for ( i = 1, size = n*n;i <= size; i++)//编辑棋盘{if (i%2 == 1)//如果i能被2整除,为玩家a相关信息{do//玩家a棋子信息{printf ("%s该你下棋了,第%d个棋子\n", a, i);scanf ("%d%d", &x, &y);if (x > n || x < 0)//判断坐标是否在棋盘内,如果不是则重新输入{do{printf ("0<=横坐标<=%d请重新输入横坐标\n", n);scanf ("%d", &x);}while (x>m || x<0);}if (y > n || y < 0)//判断坐标是否在棋盘内,如果不是则重新输入{do{printf ("0<=纵坐标<=%d请重新输入纵坐标\n", n);scanf ("%d", &y);}while (y < 0 || y > n);}}while ((r[x][y] == 1 && (printf ("这个位置上已经有棋子了,请重新输入\n")))|| r[x][y] == 2&& (printf ("这个位置上已经有棋子了,请重新输入\n")) );r[x][y] = 1;for (u = 0;u < n; u++)//不同情况下判断玩家a获胜方式{for (l = 0;l < n;l++){count = 0;for (w = u,h = l;r[w][h] == 1 && h < n; h++)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;//直接跳转,其余代码不在运行count = 0;for (w = u, h = l; r[w][h] == 1 && w < n; w++)count ++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}count = 0;for (w = u,h = l; r[w][h] == 1 && w < n && h<n;w++,h++)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}count = 0;for (w =u ,h =l;r[w][h] == 1 && h > 0;h--)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}}}}system("cls");for (int j = n;j>=0;j--){printf ("%-2d", j);for (int k = 0;k < n;k++)//画棋盘,声明两玩家棋子图片{if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●"); }printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k);}else if (i%2 == 0)//如果i不能被2整除,为玩家b相关信息{do{printf ("\n%s该你下棋了,第%d个棋子\n", b, i);scanf ("%d%d", &x, &y);if (x > n || x < 0){do{printf ("0<=横坐标<=%d请重新输入横坐标\n", n);scanf ("%d", &x);}while (x>n || x<0);}if (y >n|| y < 0){do{printf ("0<=纵坐标<=%d请重新输入纵坐标\n", n);scanf ("%d", &y);}while (y < 0 || y > n);}}while ((r[x][y] == 1 && (printf ("这个位置上已经有棋子了,请重新输入\n")))|| r[x][y] == 2&& (printf ("这个位置上已经有棋子了,请重新输入\n")) );r[x][y] = 2;system("cls");for (int j = n;j>=0;j--){printf ("%-2d", j);for (int k = 0;k < n;k++){if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●");}printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k); printf ("\n");count = 0;for (u = 0;u < n; u++){for (l = 0;l < n;l++){count = 0;for (w = u,h = l;r[w][h] == 2 && h < n; h++)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w = u, h = l; r[w][h] == 2 && w < n; w++)count ++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w = u,h = l; r[w][h] == 2 && w < n && h<n;w++,h++)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w =u ,h =l;r[w][h] == 2 && h > 0;h--)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}}}}}e: for (int j = n;j>=0;j--)//游戏结束界面棋盘固定重新显示{printf ("%-2d", j);for (int k = 0;k < n;k++){if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●");}printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k); printf ("\n");printf ("\a游戏愉快,Powered by Techmessager\n");//结束语句return 0;}。
井字旗C语言程序:运行环境:Turbo C/C++for Windows集成实验与学习环境或VC++6.0#define MAX 3#define Status int#define HUMAN_WIN 0 //人取得了胜利#define DRAW 1 //平局#define PLAYING 2 //没有决出胜负,正在进行游戏#define COMPUTER_WIN 3 //电脑取得了胜利#define HUMAN 0 //人#define COMPUTER 1 //机器#define EMPTY 2 //空#define FALSE 0 //假#define TRUE 1 //真#include<stdio.h>#include"malloc.h"//记录一步棋所需的所有信息:行数,列数,判断值typedef struct{int column;int row;int val;}Nodes;int board[MAX][MAX];//InitBoard初始化棋盘Status InitBoard(){int row,column;for(row=0; row<MAX; row++)for(column=0; column<MAX; column++) board[row][column]=EMPTY;return TRUE;}//PostionIsEmpty判断在棋盘上在给定的置是否为空Status PositionIsEmpty(int row , int column){if(board[row][column]==2)return TRUE;elsereturn FALSE;}//Place在指定的地方落子Status Place(int row,int column, int piece) {board[row][column]=piece;return TRUE;}//BoardIsFull判断棋盘是否己满Status BoardIsFull(){int i=0,j=0;for(i=0;i<MAX;i++)for(j=0;j<MAX;j++){if(board[i][j] ==2)return FALSE;}return TRUE;}//IsWin判断是否有一方己经胜利Status IsWin( int side ){int row, column;//判断一行for( row = 0; row < MAX; row++ ){for( column = 0; column < MAX; column++ )if( board[ row ][ column ] != side )break;if( column >= MAX )return TRUE;}//判断一列for( column = 0; column < MAX; column++ ) {for( row = 0; row < MAX; row++ )if( board[ row ][ column ] != side )break;if( row >= MAX )return TRUE;}//判断主对角线if( board[ 1 ][ 1 ] == side && board[ 2 ][ 2 ] == side && board[ 0 ][ 0 ] == side )return TRUE;//判断副对角线if( board[ 0 ][ 2 ] == side && board[ 1 ][ 1 ] == side&& board[ 2 ][ 0 ] == side )return TRUE;return FALSE;}//PositonValue返回落子后的状态有四种状态在ConstNum.h中定义COMPUTER_WIN, HUMAN_WIN, DRAW, PLAYINGStatus PostionValue(){returnIsWin(COMPUTER)?COMPUTER_WIN:(IsWin(HUMAN)?HUMAN_WIN:(Bo ardIsFull()?DRAW:PLAYING));}//BestMovement判断最佳落子位置,采用递归,求出最佳位置Nodes BestMovement(int side){int opp;//对手Nodes nodes, node2; //nodes记录当前最佳位置,node2返回最佳位置int simpleEval; //记当中间结果int bestRow=0, row;int bestColumn=0, column;int value;//判断是否游戏己经结束if( (simpleEval=PostionValue()) != PLAYING) {node2.row=0;node2.column=0;node2.val=simpleEval;return node2;}if(side==COMPUTER){opp=HUMAN;value=HUMAN_WIN;}else{opp=COMPUTER;value=COMPUTER_WIN;}for(row=0; row<MAX; row++)for(column=0; column<MAX; column++) if(PositionIsEmpty(row, column) ){Place(row, column, side);nodes = BestMovement(opp);Place(row,column,EMPTY);// 到更好的位置,更新信息if( (side ==COMPUTER && nodes.val >value) || (side==HUMAN && nodes.val <value) ){value=nodes.val;bestRow=row;bestColumn=column;}}node2.row=bestRow;node2.column=bestColumn;node2.val=value;return node2;}//Print打印出当前棋盘状态Status Print(){int row,column;for(row=0; row<MAX; row++)for(column=0; column<MAX; column++){if(board[row][column]==2)printf("^ ");else if(board[row][column]==1)printf("X ");elseprintf("O ");if((column!=0) && (column%2 ==0))printf("\n");}return TRUE;}int main(void){Nodes playNode;int first,a, b, result,opera; //first决定谁先下第一步棋。
#include ""#include<iostream>using namespace std;void check(int i,int j); //检查每条直线上的各方棋子的数量int other(int b,int c);void check_win(); //检查是否胜利void begin(char ch);void computer(); //电脑下棋void user(); //用户下棋int a[4][4],deep;int line[3][3][2]; //全局变量,用来存放每条直线上的各方棋子数!//第一维下标表示是行列还是对角线,第二维下标表示第几条直线//第三维下标表示各方的棋子数!void main(){char ch;cout<<"欢迎与本机下#字棋!您的棋子将用#表示,电脑的棋子用X表示\n请选择先后手,输入u则您先手,输入c则电脑先手!(小写)\n"<<endl;do{cin>>ch;if(ch!='u'&&ch!='c') cout<<"您输入的数据不合法,请重新输入!"<<endl;}while(ch!='u'&&ch!='c'); //非法处理if(ch=='u') cout<<"您选择了您先手!\n"<<endl;else if(ch=='c') cout<<"您选择了电脑先手\n"<<endl;begin(ch);}void begin(char ch){int i,j,k;a[1][1]=1;cout<<"\n 1 | 2 | 3 \n ——————\n 4 | 5 | 6 \n ——————\n 7 | 8 | 9 \n"<<endl;for(i=1;i<4;i++)for(j=1;j<4;j++){if(j==1)if(i==1);else a[i][j]=a[i-1][3]+1;else a[i][j]=a[i][j-1]+1;} //初始化棋盘for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++)line[i][j][k]=0;deep=0;if(ch=='u') user();else computer();}void computer(){int i,j,flag=0,m; //flag判断是否落子for(i=0;i<3;i++)for(j=0;j<3;j++){if (line[i][j][0]==2&&line[i][j][1]==0&&flag==0){m=other(i,j);if(m%3==0) {a[m/3][3]=40;check(m/3,3);}else {a[m/3+1][m%3]=40; check(m/3+1 ,m%3);} //40是#的ASCII码减48flag=1;}//当某条直线上用户有两棋子而我方无棋子时,在该直线的另一点落子if (line[i][j][1]==2&&line[i][j][0]==0&&flag==0){m=other(i,j);if(m%3==0) {a[m/3][3]=40;check(m/3,3);}else {a[m/3+1][m%3]=40; check(m/3+1 ,m%3);} //当某条直线上我方有两棋子而对方无棋子时,在该直线的另一点落子flag=1;}if (line[i][j][1]==1&&line[i][j][0]==0&&flag==0){m=other(i,j);if(m%3==0) {a[m/3][3]=40;check(m/3,3);}else {a[m/3+1][m%3]=40; check(m/3+1 ,m%3);} //当某条直线上我方有一棋子而对方无棋子时,在该直线的另一点落子flag=1;}}if(flag==0)if (a[2][2]==5){a[2][2]=72;flag=1;check(2,2);} //优先下第5个位置else{for(i=2;i<9&&flag==0&&a[i][j]==(i-1)*3+j;i+=2){if(i%3==0) {a[i/3][3]=40;check(i/3,3);}else {a[i/3+1][i%3]=40; check(i/3+1,i%3);}flag=1;} //2,4,6,8其次for(i=1;i<9&&flag==0&&a[i][j]==(i-1)*3+j;i+=2){if(i%3==0) {a[i/3][3]=40;check(i/3,3);}else {a[i/3+1][i%3]=40; check(i/3+1,i%3);}flag=1;} //1,3,7,9再次}for(i=1;i<=3;i++){cout<<" ";for(j=1;j<=3;j++)cout<<" "<<char(a[i][j]+48)<<" |";cout<<"\n ——————"<<endl;}deep++;if(flag==1) user();else check_win();}void user(){int down;cout<<"\n轮到您下了,请输入您要下的棋子位置:"<<endl;do{cin>>down;if(down<1||down>9)cout<<"数字不合法,请重新输入\n"<<endl;if ((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down/3+1][down%3]!=down))cout<<"您所输入的位置已经有棋子了,请重新输入\n"<<endl;}while(down<1||down>9||((down%3==0&&a[down/3][3]!=down)||(down%3!=0&&a[down /3+1][down%3]!=down)));//判断输入是否异常if(down%3==0) {a[down/3][3]=-13; check(down/3,3);}else {a[down/3+1][down%3]=-13;check(down/3+1,down%3);} / /-13是X的ASCII码减48deep++;computer();}int other(int b,int c){int i,m;if(b<2){if (b==0)m=3*c+1;if (b==1)m=c+1;for(i=m;i<m+3;i++){if(i%3==0)if(a[i/3][3]==i) return i;else;else if(a[i/3+1][i%3]) return i;}} //水平与垂直直线的情况if(b==2){if(c==0){if(a[1][1]==1) return 1;if(a[2][2]==5) return 5;if(a[3][3]==9) return 9;}if(c==1){if(a[1][3]==3) return 3;if(a[2][2]==5) return 5;if(a[3][1]==7) return 7;}} //对角线的情况}void check(int i,int j){if(a[i][j]==-13){line[0][i-1][0]++;line[1][j-1][0]++;if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))line[2][0][0]++;if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))line[2][1][0]++;}if(a[i][j]==40){line[0][i-1][1]++;line[1][j-1][1]++;if((i==1&&j==1)||(i==3&&j==3)||(i==2&&j==2))line[2][0][1]++;if((i==1&&j==3)||(i==3&&j==1)||(i==2&&j==2))line[2][1][1]++;}check_win();}void check_win(){int i,j,k;bool end=false;char ch;for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<2;k++)if(line[i][j][k]==3){if(k==1) cout<<"您失败了,电脑获得了胜利"<<endl;if(k==0) cout<<"恭喜您,您获得了胜利"<<endl;end=true;}if(deep>=9) {cout<<"和棋!"<<endl;end=true;}if(end){cout<<"\n您是否继续是输入Y,按其余任意键结束本游戏!:"<<endl;cin>>ch;if(ch!='y') exit(0);else{cout<<"\n请选择先后手,输入U则您先手,输入C则电脑先手!\n"<<endl;do{cin>>ch;if(ch!='u'&&ch!='c') cout<<"您输入的数据不合法,请重新输入!"<<endl;}while(ch!='u'&&ch!='c'); //非法处理if(ch=='u') cout<<"您选择了您先手!\n"<<endl;else if(ch=='c') cout<<"您选择了电脑先手\n"<<endl;begin(ch);}}}。