C语言编写的与电脑下棋程序代码(8页).doc
-C语言编写的与电脑下棋程序代码-第 8 页#include "stdafx.h"#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 a44,deep;int line332; /全局变量,用来存放每条直线上的各方棋子数! /第一维下标表示是行列还是对角线,第二维下标表示第几条直线 /第三维下标表示各方的棋子数!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; a11=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 aij=ai-13+1; else aij=aij-1+1; /初始化棋盘 for(i=0;i<3;i+) for(j=0;j<3;j+) for(k=0;k<3;k+) lineijk=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 (lineij0=2&&lineij1=0&&flag=0) m=other(i,j); if(m%3=0) am/33=40;check(m/3,3); else am/3+1m%3=40; check(m/3+1,m%3); /40是#的ASCII码减48 flag=1; /当某条直线上用户有两棋子而我方无棋子时,在该直线的另一点落子 if (lineij1=2&&lineij0=0&&flag=0) m=other(i,j); if(m%3=0) am/33=40;check(m/3,3); else am/3+1m%3=40; check(m/3+1,m%3); /当某条直线上我方有两棋子而对方无棋子时,在该直线的另一点落子 flag=1; if (lineij1=1&&lineij0=0&&flag=0) m=other(i,j); if(m%3=0) am/33=40;check(m/3,3); else am/3+1m%3=40; check(m/3+1,m%3); /当某条直线上我方有一棋子而对方无棋子时,在该直线的另一点落子 flag=1; if(flag=0) if (a22=5) a22=72; flag=1; check(2,2); /优先下第5个位置 else for(i=2;i<9&&flag=0&&aij=(i-1)*3+j;i+=2) if(i%3=0) ai/33=40;check(i/3,3); else ai/3+1i%3=40; check(i/3+1,i%3); flag=1; /2,4,6,8其次 for(i=1;i<9&&flag=0&&aij=(i-1)*3+j;i+=2) if(i%3=0) ai/33=40;check(i/3,3); else ai/3+1i%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(aij+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&&adown/33!=down)|(down%3!=0&&adown/3+1down%3!=down) cout<<"您所输入的位置已经有棋子了,请重新输入n"<<endl; while(down<1|down>9|(down%3=0&&adown/33!=down)|(down%3!=0&&adown/3+1down%3!=down); /判断输入是否异常 if(down%3=0) adown/33=-13; check(down/3,3); else adown/3+1down%3=-13;check(down/3+1,down%3); /-13是X的ASCII码减48 deep+; 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(ai/33=i) return i; else; else if(ai/3+1i%3) return i; /水平与垂直直线的情况 if(b=2) if(c=0) if(a11=1) return 1; if(a22=5) return 5; if(a33=9) return 9; if(c=1) if(a13=3) return 3; if(a22=5) return 5; if(a31=7) return 7; /对角线的情况void check(int i,int j) if(aij=-13) line0i-10+; line1j-10+; if(i=1&&j=1)|(i=3&&j=3)|(i=2&&j=2) line200+; if(i=1&&j=3)|(i=3&&j=1)|(i=2&&j=2) line210+; if(aij=40) line0i-11+; line1j-11+; if(i=1&&j=1)|(i=3&&j=3)|(i=2&&j=2) line201+; if(i=1&&j=3)|(i=3&&j=1)|(i=2&&j=2) line211+; 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(lineijk=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);