首页 > 期刊论文知识库 > c语言五子棋毕业论文

c语言五子棋毕业论文

发布时间:

c语言五子棋毕业论文

这是WIN32

有点难度了啊

**********************************************************//* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */#include <>#include <>#include <>#include <>#include <>/**********************************************************//* 定义符号常量 *//*定义画棋盘所需的制表符*/#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(); } 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; /*光标初始位置*/ ; /*画棋盘*/ textmode(C40); DrawMap(); /*显示操作键说明*/ i=0; textcolor(BROWN); while(Msg[i]!=NULL) { gotoxy(25,3+i); cputs(Msg[i]); i++; } /*显示当前行棋方*/ ShowOrderMsg(gPlayOrder); /*光标移至棋盘的左上角点处*/ gotoxy();}/*画棋盘*/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(" \\<^+^>/"); getch();}/*走棋*/int ChessGo(int Order,struct point Cursor){ /*判断交叉点上有无棋子*/ if(gChessBoard[][]==CHESSNULL) { /*若没有棋子, 则可以落子*/ gotoxy(); textcolor(LIGHTBLUE); putch(Order); gotoxy(); gChessBoard[][]=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:/*在水平方向*/ (testnum-1); ; ; ; break; case 1:/*在垂直方向*/ ; (testnum-1); ; ; break; case 2:/*在左下至右上的斜方向*/ (testnum-1); (testnum-1); ; ; break; case 3:/*在左上至右下的斜方向*/ (testnum-1); (testnum-1); ; ; break; } count=0; for(i=0;i=0&&<=18&&>=0&&<=18) { if(gChessBoard[][]==Order) { count++; if(count>=testnum) return TRUE; } else count=0; } ; ; } return FALSE;}/*移动光标*/void MoveCursor(int Order,int press){ switch(press) { case PLAY1UP: if(Order==CHESS1&&>0) ; break; case PLAY1DOWN: if(Order==CHESS1&&<18) ; break; case PLAY1LEFT: if(Order==CHESS1&&>0) ; break; case PLAY1RIGHT: if(Order==CHESS1&&<18) ; break; case PLAY2UP: if(Order==CHESS2&&>0) ; break; case PLAY2DOWN: if(Order==CHESS2&&<18) ; break; case PLAY2LEFT: if(Order==CHESS2&&>0) ; break; case PLAY2RIGHT: if(Order==CHESS2&&<18) ; break; } gotoxy();}/*游戏结束处理*/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();}/*落子正确处理*/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;/*按键无效*/}

//但是这些代码由于编译器的原因,在TC下仍无法运行。请使用VC。#include <>#include <>#include <>#include <>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; ; ; 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),错误则返回0int 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;}

毕业论文五子棋课程设计

可以的!之所以叫BP网络,是因为使用了反向传递算法,这是一种结果导向的自学习方法,用在五子棋上是可以的。因为五子棋的游戏方法正是很明显的结果导向的过程。简单说这么个过程:1.设置输入和输出类型,比如都是坐标[x1,y1]、[x2,y2]...2.训练:你告诉网络A情况下应该输出A1B情况下应该输出B1C情况下应该输出C1...A+B情况下应该输出AB13.测试:你问网络A+B+C情况下,应该输出多少?在哪里下子(就是[x,y]是多少?)网络就根据前面BP训练的结果自动算出你要的坐标。用Matlab神经网络工具箱做吧,不是很难。另外,五子棋的棋盘别太大了,训练难度和时间是随棋盘大小成级数增长的。

机器博弈是人工智能领域的重要分支,它的研究对象多以复杂的棋牌类智力游戏为主,已经得到解决的棋类游戏,几乎全部都应归功于机器博弈近半个世纪的发展。计算机解决问题的优势在于能把不易解析的问题,借助于现代计算机的运算速度优势枚举出所有的合理情形而得解;然而,博弈问题的复杂程度决定了它不能过度依赖机器的计算能力。许多待解决的或已经解决的棋类,其状态空间复杂度或博弈树复杂度量级都太过庞大,所以我们需要添加约束,并且采用合理的算法进行优化。

五子棋问题是人工智能中的一个经典问题。当今世界,AlphaGo已经执围棋之牛耳,五子棋领域却鲜少有人问津。本文根据课堂所学知识结合文献、博客,基于两种开发语言实现了一个智能对战的AI五子棋游戏平台。

本文所做工作如下:

(1) 五子棋界面实现;

(2) 智能判定棋盘走势;

(3) 改进了棋盘扫描方式;

(4) 改良了系统评分表评估方式;

(5) 实现了基于点评分表估值找出最佳落子方式。

五子棋AI问题的最大问题是如何实现智能对弈,即当人落子之后,算法如何解读当前的棋盘并且对其进行分析解读,得到电脑方的最佳落子点。其次还有一个问题是如何判断胜利,这可以作为前面棋盘局势判定的一个子问题,也可以看做是一个单独的问题,不过这个问题总体来说较为简单,所以不做详细说明。

五子棋的整体知识构建包含以下部分:

(1) 棋盘局面表示法

(2) 棋局胜利判定

(3) 棋型知识库

(4) 智能博弈流程

对于问题(1),采用数组表示法。棋盘中的各交叉点有三种状态,不妨令 0表示空(未放置棋子) ,-1 表示有黑子 ,1 表示有白子,数组表示法的基本思想是:以交叉点对应的数组索引值来表达物理位置 ,以交叉点对应的元素值表达状态(空、 黑子、 白子)。令 V = {0 ,1 ,-1} ,棋盘 的第 i 个交叉点的状态 Si ∈V ,任何棋局都可以表示成一个 n ×n 的二元组。

对于问题(2), 采用数组表示法时,想知道任意两个元素 Si 和Sj 是否共线,要通过 i 和 j 之间的数值规律来判断。从这方面看,数组表示法是一种原始、低效的表示方法,但是对于评分表算法来说其性能损失是可以接受的。要判断是否有一方已经胜利,只需要对整个棋盘判定当前落子点的纵、横、正斜、反斜四个方向的最长延伸出四个位置看是否能连成一条同色直线即可。具体的操作可以视为:从落子点出发,向两个方向延伸,如果遇到同色,那么计数器加一,遇到非同色(空白或者异色)则停止在该方向的延伸,一个计数器记下该方向上的两头的连续同色棋子数。等到四个方向都探索完毕,如果四个计数器中有一个计数器达到了5,那么即可判断出已经有五子连珠了,此局结束。

问题(3)棋型知识库主要包括各种既定的棋盘形式,有如下几种:

² 活四 :有两个连五点(即有两个点可以形成五),图中白点即为连五点。当活四出现的时候,整个局势已经无法阻止连五了,活四的归属方一定能取得胜利;

² 冲四 :有一个连五点,如下面三图,均为冲四棋型。图中白点为连五点。 相对比活四来说,冲四的威胁性就小了很多,因为这个时候,只要跟着防守在那个唯一的连五点上,冲四就没法形成连五。

² 活三 :可以形成活四的三,如下图,代表两种最基本的活三棋型。图中白点为活四点。活三棋型是进攻中最常见的一种,因为活三之后,如果对方不以理会,将可以下一手将活三变成活四,而活四是无法防守的。所以,面对活三的时候,需要非常谨慎对待。在没有更好的进攻手段的情况下,必须对其进行防守,以防止其形成可怕的活四棋型。

² 眠三: 只能够形成冲四的三,如下各图,分别代表最基础的六种眠三形状。图中白点代表冲四点。眠三的棋型与活三的棋型相比,危险系数下降不少,因为眠三棋型即使不去防守,下一手它也只能形成冲四,而对于单纯的冲四棋型,是可以很简单的防守住的。

² 活二 :能够形成活三的二,如下图,是三种基本的活二棋型。图中白点为活三点。

² 眠二 :能够形成眠三的二。图中四个为最基本的眠二棋型,细心且喜欢思考的同学会根据眠三介绍中的图2-13找到与下列四个基本眠二棋型都不一样的眠二。图中白点为眠三点。

对于上述的棋型,我们主要考虑的是活四、冲四、活三、眠三这几种主要的进攻棋型的防守与构成,整体棋型遵从以下原则:优先考虑数目,同等数目的情况下考虑是活是眠。评分表算法的设计整体偏向于防守。

对于问题(4),当下棋型的评估分析,算法严格遵从以下流程:

当人类方落下一子,算法启动,扫描全局,得到人类棋子的集合和电脑棋子的集合。全局扫描之后,对当前局势进行排序、计算。对每个集合的每个空白点位置打分,打分依据是根据这个点周围四个方向上的同色连续棋子的数量。按照这些最后得到的评分,得出最大值。得到人类方和电脑方的两个最大值之后,进行比较,如果人类方局势较好(分数较高),则算法将下一次落子位置设置为人类方得分最高的点,尽力降低人类方的下一步得分;如果电脑方的分数较高,那么则直接在使得分数最高的点落子即可。

本次课程设计,一共设计了两个版本,一个Java版本,为19X19的棋盘,配备简单的消息提示,基于AWT实现GUI,开发工具IntelliJ IDEA

另一个版本是使用Python设计,核心算法相同,但是受限于图片源文件,为15X15棋盘,基于pygame实现GUI,开发工具是:JetBrains PyCharm x64

因为近期时间较为紧迫,所以《人工智能》这门课我选择了较为简单的五子棋问题进行课程设计。在本次课程设计中,我的编码能力、调试能力、算法解读实现能力、函数优化能力等各方面有了长足的进步。在本次的设计过程中也出现了几个问题,下面对这些问题进行一个简单的描述:

(1) 对棋盘局势的判断力不够,因为只是简单的对当前的棋盘局势进行判断,基本等同于一个粗通规则而且天赋不高的五子棋选手。如果对手很细心,而且熟练经营各种布局策略,那么基本这个算法就会被钻研出习惯,从而被轻易针对,而且针对方案百试不爽;

(2) 判断棋局形式的时候对边界的评分算法跟中心区域的评分算法一致,无法有效提前识别边界,降低边界空白点的权重;

(3) 用户图形界面需要改进,另外可以增设PK模式以及选色、选择棋盘大小功能等;

后续可以尝试用博弈树算法尝试与当前算法进行比较。评分表算法牺牲了更高的精度,以求迅速的得出最佳落子点;而博弈树可以通过提前落子进行全局预判进行更全方位的对人类方的围追堵截。

另外,可以通过在课堂上学到的知识,比如BFS、DFS、A*算法、决策树算法 等应用于五子棋的智能决策中。

《人工智能》这门课让我对于图、知识表示、智能决策等各个方面有了更好地认识与体验,课堂设计内容充实有趣,让我受益匪浅,希望今后可以更加深入这个方面,并且将课堂上学到的知识应用于实践之中。

《问檤 外传》不错

分条写:课题做到突出中心思想,条理清晰,结构合理,观点正确,具有较好的连续性等。完成相关的XXXX。

第一步:课题适应的岗位名称;

第二部:课题背景;

第三步,报告(设计、论文等)要求;然后,具体要求;

最后,主要参考文献的范围。

扩展资料:

1、论文题目,有的含副标题。题目之下是作者署名,署名之前或下边一行写作者的校、院、系、年级。

2、“摘要”与“关键词”(或称“内容提要”),一般为300字左右。位于作者署名之后,正文之前。关键词,结合标题和正文内容一般选取3至5个。

3、引论。用“O”标示,常写作“引言”、“引论”、“绪论”,引言较短时可不标出“O。引言”类小标题。引论的内容一般是交代选题背景。

主要有:课题来源,本课题在国内外的研究进展状况。已有的研究成果,存在的问题。选题的意义,讨论的问题。本文分几部分,从哪些方面进行讨论,以及指导思想、论证方法等,均可根据内容的需要写在引论中。

五子棋游戏设计毕业论文

五子棋的AI构想 有句话叫“当局者迷,旁观者清。”,但这句话在由AI所控制的计算机玩家上是不成立的,因为计算机必须知道有那些获胜方式,并计算出每下一步棋到棋盘上任一格子的获胜几率,也就是说,一个完整的五子棋的AI构想必须: 1、能够知道所有的获胜组合; 2、建立和使用获胜表; 3、设定获胜的分数; 4、使电脑具有攻击和防守的能力; 一、求五子棋的获胜组合 在一场五子棋的游戏中,计算机必须要知道有那些的获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为10*10。 (1)计算水平方向的获胜组合数,每一列的获胜组合是:6,共10列,所以水平方向的获胜组合数为:6*10=60 (2)计算垂直方向的获胜组合总数,每一行的获胜组合是:6,共10行,则垂直方向的获胜组合数为:6*10=60 (3)计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 (4)计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 ,这样所有的获胜组合数为:60+60+36+36=192 二、建立和使用获胜表 我们已经计算出了一个10*10的五子棋盘会有192种获胜方式,这样我们可以利用数组建立获胜表,获胜表的主要作用是:1,判断当前的获胜方式是否有效;2,判断当前的获胜方式中到底有多少子落入该获胜组合中。详细的使用您将在后面的程序中可以看出。 三,分数的设定 在游戏中为了让计算机能够决定下一步最佳的走法,必须先计算出计算机下到棋盘上任一空格的分数,而其中最高分数便是计算机下一步的最佳走法。 原理:我们判定当前讨论的空格与当前讨论的点有几种获胜的方式,有几种该空格就加几分。这种原理初听起来似乎是无法入手,没关系,当您了解我们后面的程序后您就会明白这种决策原理了。 这种决策有一些缺陷,因为如果只根据这个模型设计,就有可能出现电脑或玩家有三个子连成一线的时候,计算机却判断不出,它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守。没关系我们完全可以通过一个加强算法来改变当前的分值情况,也就是说当电脑或玩家有三个子或四个子连成一线时,我们通过加强算法将当前与三个子或四个子有关的空格的分值提高,从而可以弥补这一缺憾。 四、攻击与防守 以上的方式,事实上计算机只是计算出了最佳的攻击位置,为了防守我们还应计算当前玩家的最佳的攻击位置。这样有什么用呢?道理很简单,如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数,那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。 事实上,这个AI构想是很强大的如果你不是很厉害的五子棋高手的话,可能很快会被计算机打败。我在联众上可是中级棋手啊,跟这种构想打的时候胜率也不是很高。 使用编写五子棋 一、编写前的准备: 1、用计算机的思想描述整个下棋的过程 考虑步骤: (1)为了简便我们可以先让电脑先走第一步棋,电脑每走一步就会封掉许多玩家的获胜可能情况。 (2)当玩家走棋的时候我们首先应该考虑玩家走棋的合法性。 (3)如果合法,那么玩家也会封掉许多电脑的获胜的可能情况。 (4)电脑的思考路径:首先判断当前玩家和电脑的所有获胜组合是否需要进行加强赋值, 是进行加强赋值,否则进行普通的赋值。 (5)比较当前玩家和电脑谁的分值最大。将分值最大的点作为电脑的下一步走法。 2、利用窗体和图形工具建立五子棋的棋盘界面 (1)添加一个picturebox控件 作用:使用picturebox控件绘制棋子和棋盘 (2)添加一个label控件 作用:显示当前的获胜标志,也就是当某一方获胜或和棋时显示此标签。 (3)添加一个mainmenu控件 作用:控制游戏的开始或结束 (4)添加一个mediaplay组件 作用:使程序可以播放音乐。 3、设置整体框价 我们采取10*10的棋盘,为主要的平台。利用数组定义整个棋盘桌面,利用数组定义获胜组合以及获胜标志等。 二,声明全局数组和变量 定义虚拟桌面: Dim table(9, 9) As Integer 定义当前玩家桌面空格的分数: Dim pscore(9, 9) As Integer 定义当前电脑桌面空格的分数: Dim cscore(9, 9) As Integer 定义玩家的获胜组合: Dim pwin(9, 9, 191) As Boolean 定义电脑的获胜组合: Dim cwin(9, 9, 191) As Boolean 定义玩家的获胜组合标志: Dim pflag(191) As Boolean 定义电脑的获胜组合标志: Dim cflag(191) As Boolean 定义游戏有效标志: Dim theplayflag As Boolean 三、初始化游戏 '***************************************************************************** '** 模块名称: initplayenvironment '** '** 描述: 此函数主要功能如下: '** 1. 设置背景音乐。 '** 2. 设置游戏状态有效。 '** 3. 初始化游戏状态标签。 '** 4. 直接指定电脑的第一步走法。 '** 5. 初始化基本得分桌面。 '** 6. 电脑和玩家获胜标志初始化。 '** 7. 初始化所有获胜组合。 '** 8. 重新设定玩家的获胜标志。 '** '***************************************************************************** Sub initplayenvironment() = ".\music\" () theplayflag = True '游戏有效 = False '游戏状态标签不显示 () '清空picturebox1的内容 yuandian(130, 130) '调用绘图函数绘制当前电脑先走的位置 Dim i, j, m, n As Integer For i = 0 To 9 For j = 0 To 9 table(i, j) = 0 Next Next '桌面初始化 For i = 0 To 191 pflag(i) = True cflag(i) = True Next '获胜标志初始化 table(4, 4) = 1 '由于我们设定电脑先手,并下了4,4位所以将其值设为1 ''' ******** 初始化获胜组合 ******** n = 0 For i = 0 To 9 For j = 0 To 5 For m = 0 To 4 pwin(j + m, i, n) = True cwin(j + m, i, n) = True Next n = n + 1 Next Next For i = 0 To 9 For j = 0 To 5 For m = 0 To 4 pwin(i, j + m, n) = True cwin(i, j + m, n) = True Next n = n + 1 Next Next For i = 0 To 5 For j = 0 To 5 For m = 0 To 4 pwin(j + m, i + m, n) = True cwin(j + m, i + m, n) = True Next n = n + 1 Next Next For i = 0 To 5 For j = 9 To 4 Step -1 For m = 0 To 4 pwin(j - m, i + m, n) = True cwin(j - m, i + m, n) = True Next n = n + 1 Next Next ''' ******** 初始化获胜组合结束 ******** For i = 0 To 191 If pwin(4, 4, i) = True Then pflag(i) = False End If Next '由于电脑已下了4,4位所以我们需要重新设定玩家的获胜标志 End Sub 四,处理鼠标事件 '***************************************************************************** '** 模块名称: themousedown '** '** 描述: 此函数主要实行以下功能: '** 1. 判定当前游戏标志是否有效。 '** 2. 将实际坐标转化成虚拟坐标。 '** 3. 绘制玩家的棋子。 '** 4. 执行检查获胜函数。 '** 5. 执行电脑算法函数。 '** '***************************************************************************** Sub themousedown(ByVal x As Integer, ByVal y As Integer) If theplayflag = False Then Exit Sub End If '检查游戏状态是否有效 Dim i, j As Integer Dim zhx, zhy As Integer zhx = Int((x - 10) / 30) zhy = Int((y - 10) / 30) For i = 0 To 9 For j = 0 To 9 If table(zhx, zhy) > 0 Then Exit Sub End If Next Next '检查当前鼠标点击的格子是否有效 Dim mycolor As Color Dim g As g = mycolor = Dim brush1 As = New SolidBrush(mycolor) (brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30) '绘制玩家的棋子 table(zhx, zhy) = 2 For i = 0 To 191 If cwin(zhx, zhy, i) = True Then cflag(i) = False End If Next '重设电脑的获胜标志 checkwin() '检查当前玩家是否获胜 diannao() '调用电脑算法 End Sub 五、获胜检查算法。 '***************************************************************************** '** 模块名称: checkwin '** '** 描述: 此模块执行以下功能: '** 1. 检查是否和棋。 '** 2. 检查电脑是否获胜。 '** 3. 检查玩家是否获胜。 '** '***************************************************************************** Sub checkwin() Dim i, j, k, m, n As Integer Dim ca As Integer Dim pa As Integer Dim cnormal As Integer = 0 For i = 0 To 191 If cflag(i) = False Then cnormal = cnormal + 1 End If Next If cnormal = 190 Then = True = "和棋,请重新开始!" () theplayflag = False Exit Sub End If '设定和棋规则 For i = 0 To 191 If cflag(i) = True Then ca = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 1 Then If cwin(j, k, i) = True Then ca = ca + 1 End If End If Next Next If ca = 5 Then = True = "电脑获胜,请重新开始" () theplayflag = False Exit Sub End If End If Next '检查电脑是否获胜 For i = 0 To 191 If pflag(i) = True Then pa = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 2 Then If pwin(j, k, i) = True Then pa = pa + 1 End If End If Next Next If pa = 5 Then = True = "玩家获胜,请重新开始" () theplayflag = False Exit Sub End If End If Next '检查玩家是否获胜 End Sub 六、电脑算法 '***************************************************************************** '** 模块名称: diannao '** '** 描述: 此程序主要执行以下功能: '** 1. 初始化赋值系统。 '** 2. 赋值加强算法。 '** 3. 计算电脑和玩家的最佳攻击位。 '** 4. 比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。 '** 5. 执行检查获胜函数。 '** '***************************************************************************** Sub diannao() Dim i, j, k, m, n As Integer Dim dc As Integer Dim cab As Integer Dim pab As Integer For i = 0 To 9 For j = 0 To 9 pscore(i, j) = 0 cscore(i, j) = 0 Next Next '初始化赋值数组 ''' ******** 电脑加强算法 ******** For i = 0 To 191 If cflag(i) = True Then cab = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 1 Then If cwin(j, k, i) = True Then cab = cab + 1 End If End If Next Next Select Case cab Case 3 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If cwin(m, n, i) = True Then cscore(m, n) = cscore(m, n) + 5 End If End If Next Next Case 4 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If cwin(m, n, i) = True Then yuandian(m * 30 + 10, n * 30 + 10) table(m, n) = 1 For dc = 0 To 191 If pwin(m, n, dc) = True Then pflag(dc) = False checkwin() Exit Sub End If Next End If End If Next Next End Select End If Next For i = 0 To 191 If pflag(i) = True Then pab = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 2 Then If pwin(j, k, i) = True Then pab = pab + 1 End If End If Next Next Select Case pab Case 3 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If pwin(m, n, i) = True Then pscore(m, n) = pscore(m, n) + 30 End If End If Next Next Case 4 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If pwin(m, n, i) = True Then yuandian(m * 30 + 10, n * 30 + 10) table(m, n) = 1 For dc = 0 To 191 If pwin(m, n, dc) = True Then pflag(dc) = False checkwin() Exit Sub End If Next End If End If Next Next End Select End If Next ''' ******** 电脑加强算法结束 ******** ' ******** 赋值系统 ******** For i = 0 To 191 If cflag(i) = True Then For j = 0 To 9 For k = 0 To 9 If table(j, k) = 0 Then If cwin(j, k, i) = True Then For m = 0 To 9 For n = 0 To 9 If table(m, n) = 1 Then If cwin(m, n, i) = True Then cscore(j, k) = cscore(j, k) + 1 End If End If Next Next End If End If Next Next End If Next For i = 0 To 191 If pflag(i) = True Then For j = 0 To 9 For k = 0 To 9 If table(j, k) = 0 Then If pwin(j, k, i) = True Then For m = 0 To 9 For n = 0 To 9 If table(m, n) = 2 Then If pwin(m, n, i) = True Then pscore(j, k) = pscore(j, k) + 1 End If End If Next Next End If End If Next Next End If Next ''' ******** 赋值系统结束 ******** ''' ******** 分值比较算法 ******** Dim a, b, c, d As Integer Dim cs As Integer = 0 Dim ps As Integer = 0 For i = 0 To 9 For j = 0 To 9 If cscore(i, j) > cs Then cs = cscore(i, j) a = i b = j End If Next Next For i = 0 To 9 For j = 0 To 9 If pscore(i, j) > ps Then ps = pscore(i, j) c = i d = j End If Next Next If cs > ps Then yuandian(a * 30 + 10, b * 30 + 10) table(a, b) = 1 For i = 0 To 191 If pwin(a, b, i) = True Then pflag(i) = False End If Next Else yuandian(c * 30 + 10, d * 30 + 10) table(c, d) = 1 For i = 0 To 191 If pwin(c, d, i) = True Then pflag(i) = False End If Next End If ''' ******** 分值比较算法结束 ******** checkwin() End Sub 七、绘制棋子 '***************************************************************************** '** 模块名称: yuandian '** '** 描述: 此函数主要进行电脑棋子的绘制。 '** '***************************************************************************** Sub yuandian(ByVal x As Integer, ByVal y As Integer) Dim mycolor As Color Dim g As g = Dim zhx, zhy As Integer zhx = Int((x - 10) / 30) zhy = Int((y - 10) / 30) mycolor = Dim brush1 As = New SolidBrush(mycolor) (brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30) End Sub

分条写:课题做到突出中心思想,条理清晰,结构合理,观点正确,具有较好的连续性等。完成相关的XXXX。

第一步:课题适应的岗位名称;

第二部:课题背景;

第三步,报告(设计、论文等)要求;然后,具体要求;

最后,主要参考文献的范围。

扩展资料:

1、论文题目,有的含副标题。题目之下是作者署名,署名之前或下边一行写作者的校、院、系、年级。

2、“摘要”与“关键词”(或称“内容提要”),一般为300字左右。位于作者署名之后,正文之前。关键词,结合标题和正文内容一般选取3至5个。

3、引论。用“O”标示,常写作“引言”、“引论”、“绪论”,引言较短时可不标出“O。引言”类小标题。引论的内容一般是交代选题背景。

主要有:课题来源,本课题在国内外的研究进展状况。已有的研究成果,存在的问题。选题的意义,讨论的问题。本文分几部分,从哪些方面进行讨论,以及指导思想、论证方法等,均可根据内容的需要写在引论中。

还非要写手机项目?我其他项目基本都有

可以的!之所以叫BP网络,是因为使用了反向传递算法,这是一种结果导向的自学习方法,用在五子棋上是可以的。因为五子棋的游戏方法正是很明显的结果导向的过程。简单说这么个过程:1.设置输入和输出类型,比如都是坐标[x1,y1]、[x2,y2]...2.训练:你告诉网络A情况下应该输出A1B情况下应该输出B1C情况下应该输出C1...A+B情况下应该输出AB13.测试:你问网络A+B+C情况下,应该输出多少?在哪里下子(就是[x,y]是多少?)网络就根据前面BP训练的结果自动算出你要的坐标。用Matlab神经网络工具箱做吧,不是很难。另外,五子棋的棋盘别太大了,训练难度和时间是随棋盘大小成级数增长的。

c语言毕业论文

要么是某某管理系统要么是某种常见软件。你可以做个根据人的照片做成表情包的,就像iphone x上那个相机一样。另外就是面部识别,跟踪,这个也比较新

这个具体得知道你的专业呀,还有就是选的是什么题目,每个题目的要求和要的功能那些都是不一样的,总之计算机的就是这样,比较独立的。所以要知道你所学的方向才能确定的。

论文写作,先不说内容,首先格式要正确,一篇完整的毕业论文,题目,摘要(中英文),目录,正文(引言,正文,结语),致谢,参考文献。学校规定的格式,字体,段落,页眉页脚,开始写之前,都得清楚的,你的论文算是写好了五分之一。然后,选题,你的题目时间宽裕,那就好好考虑,选一个你思考最成熟的,可以比较多的阅读相关的参考文献,从里面获得思路,确定一个模板性质的东西,照着来,写出自己的东西。如果时间紧急,那就随便找一个参考文献,然后用和这个参考文献相关的文献,拼出一篇,再改改。正文,语言必须是学术的语言。一定先列好提纲,这就是框定每一部分些什么,保证内容不乱,将内容放进去,写好了就。参考文献去中国知网搜索,校园网免费下载。 合适采纳

近年来,随着全球网际网路技术的普及、计算机技术的迅猛发展、数字技术的瞬息万变,计算机工程在人们生活、生产中的应用越来越广泛。下面是我为大家整理的计算机工程毕业论文,供大家参考。

计算机软体大体分为三类,一种是总述,一种是系统软体,一种是应用软体,系统软体的作用是促使各个硬体按照一定的规律协调工作,保证计算机处于正常运转状态。而应用软体的作用则是为了实现某种使用愿望而开发出来的软体。

1计算机软体工程专案管理的基本概念

工程专案管理的含义工程专案管理主要是业主通过委托从事工程专案管理的企业,签署相关协议,工程专案管理企业有义务和权力代表业主在工程专案进行的情况卜干预和服务。工程专案管理企业可以协助业主同项目工程总承包签订一系列合同,只是起到辅助性作用,不直接与总承包企业或者施工、勘察、供货和设计签署协议或合同,工程专案管理企业有责任在施工过程中监督合同的完成情况。

软体工程专案的概况

管理人员开展有序的专案计划

企业必须把人员管理放在重要位置,在软体工程专案的开发上人员的调配问题是保证工程顺利进行的重要因素,因此,专案能否成功和工作人员的工作能力、写作能力息息相关,针对工程专案的操作类别不同,可以分配成各个研究小组,进行科学合理的针对性开发和高效的协作,有利于工程的快速推进和更加完善。小组内的人员根据自身优势,确定自己的工作内容和工作时间。对专案进行正确的认识和对风险进行评估,与此同时从节约成木的方而出发,形成科学的人力资源调配机制,使专案得以顺利开展。

质量和配置管理工作

软体的质量管理工作是整个专案的核心工作,质量管理决定着计算机软体工程专案管理是否真正的成功,通过一系列保证质量的手段,有计划的编制、控制和保证专案质量。保证专案质量的方式可以通过定期的进行质量评估得以实现,在日常专案管理中要不断的对工作进行考查,对于专案不合格的地方要提出意见并且考虑整改措施,不断完善整个软体配置管理的记录工作,使专案的质量能有一定的检测体系,这样开发者会对专案工程的质量问题有比较深入的了解。

风险评估和管理工作

风险管理大致分为两种工作,一种是风险识别,另一种是风险评估。得到评估结果以后要针对问题提出相应的解决办法,定期检测计算机软体工程的好处是可以减小产生风险的概率,还可以避免一些因疏忽而产生风险,使专案的损失减少到最低,也减少了因专案风险而造成的一些相关责任人的利益冲突。

2计算机软体工程专案管理中存在的问题

管理团队的协作问题

分工合作是我们完成一个专案的基木因素,在软体开发方而更需要每个人的智慧一起凝聚出果实,共同享受成果,而目前在计算机软体工程专案管理方而资讯的交流方而存在一些问题,例如分工不清、团队不合作等问题。

需求分析和实际中的业务存在差距问题

计算机软体工程专案没有结合实际的活动需求,也没有调查有效的资料分析,因此计算机软体工程专案管理在开发出新的产品以后并没有取得理想的业务效果。

风险管理的问题

专案的风险工作是企业需要考虑的很重要的问题,如果风险没有相应科学管理,很容易带来巨大的损失,但是很多员工并不懂得如何规避风险,缺乏相应的专业知识,更是缺少对风险工作的管理,导致很多企业在风险来临时无法做出正确行动,造成巨大的经济损失。

3计算机软体工程专案管理的对策

对风险管理和工作进度进行有效管理

制定风险管理制度。计算机软体工程专案管理的工作人员必须具有一定的风险识别意识和相应的遇到风险的专业知识,并且能有效的控制风险的能力。在平时要做好风险评估的管理报告,针对可能发生的风险要及时预测并且做出相应的解决行动。设定专门的人员对计算机软体工程专案定期进行风险的评估和检查工作。在整个专案中,根据需要进行多次的风险管理工作,因为风险无时无刻都有可能存在,检查的目的是尽量减少风险发生,在一般情况卜处理风险的措施一般有三种:减缓、规避和转移。提高工程的进度,不断的推进工程的工作效率。要制定详细的工作计划表,并且尽可能达到最高的工作目标。工作人员有严谨的工作态度和高效的作息时间安排,管理人员要密切关注工程进度,不断的督促员工完成应做的工作量,有条理、高效的完成对员工的工作任务的监督工作。

建立完善的管理体系针对计算机软体工程的人员日常管理工作,要建立科学有效的管理方案。合理安排人才资源,确保在进行计算机软体专案工程时人员调配顺利进行。专业知识的培训对于工作人员来说

是必不可少的,可以极大的丰富计算机软体工程专案人员的专业水平和实践能力,减少工作上的失误,提高工作效率和工作人员的素质。奖罚制度是对企业员工优劣的衡量标准,所以在计算机软体工程专案管理方而采取奖罚制度可以极大程度上调动员工的积极性,使员工主动为企业创造效益,企业的发展才能有长远的未来。

建立合作的团队

在员工内部建立有效的交流机制。员工的内部工作经验交流是非常重要的,因此要完善沟通方法,开辟多种交流方式和渠道,不断的增强各个部门的沟通意识,使团队的力量不断凝聚起来。明确分工,责任落实到个人。计算机软体工程管理非常复杂,需要的人员也众多,因此必须要使每个员工明确自己的工作内容和范围,清晰的划分自己所需要负责的区域,清楚自己的责任,这样能够确保每一个步骤都井井有条,非常有秩序。调动整个团队的工作积极性。通过一些活动、奖励措施等使每一个工作人员全身心的投入到工作中去,愿意并想要去做的更好,不断激发团队的潜力和员工的协作能力,这样专案不仅会做的越来越好,员工内部也会越来越和谐并且充满正能量,企业的效益也会不断得到提升。

4结语

计算机软体工程专案管理的工作内容十分的复杂,要保证软体工程按照工程原计划进度顺利开展工作,并且要节约成木、保证质量,必须熟练对计算机软体进行操作,在现在的大多数生产计算机软体的企业中最为重要的就是软体工程专案的管理效率,软体工程专案的成功条件是软体专案要具有科学性和高效性,在此基础上企业的合理管理也是企业走向成功的关键。

1现状分析

培养高质量的软体开发人才一直是社会和行业关注的焦点。早在11年前,对于工程教育的迫切性就被人提出来[1]。工程教育本身也作为一个系统问题被讨论[2]。现在从国家层面在战略上建立了软体学院进行专门培养,各个高校也不断推出新的课程、新的措施方案。在这一领域虽然比过去似乎已经有了翻天覆地的变化,但来自企业的呼吁似乎一直反映出诸多不尽如人意。更多的思路希望将企业的力量直接引入到教学,比如实训基地等[3];而国家层面也非常关注实训[4]。但实际效果可能变得流于表面,因为企业往往难以将核心的工作拿给学生做,而其训练的专案也并未从更全面系统的角度去设计,其锻炼效果就有限了。在软体开发这一领域,由于其具有变化迅速,新技术不断涌现的特点,导致不少在教育内容上选择了追逐新技术、新语言、新平台,以能用会用这些流行主流技术为目标。典型的代表就是北大青鸟,有些二本的学生在毕业前专门花钱去青鸟学习,似乎可以看到这种教育的优势。但另一个矛盾的情况是,往往那些关注员工后劲的公司却不愿意招聘青鸟的学生。如果将目光投向国外的顶级大学,例如斯坦福,其教学上并没有去“依赖”校企合作,以及很热门的“实训”。其核心课程依然是过去的传统经典课程。以一个研究生为例,一学期能修2门课是正常,3门就很优秀。它并没有追逐所谓的新技术。但无人质疑其学生的工程能力、科研能力和创造能力。

2什么是计算机工程能力的核心

什么才是我们软体开发教育的核心知识架构,怎样才能培养学生可持续发展的核心竞争力?我们调查过一些非常高水准的软体开发者,发现他们往往在底层软体上持之以恒地进行长时间深刻的锻炼,然后在未接触的新领域才能非常迅速地掌握核心。例如,一个非计算机专业的系统分析员曾经“只”在DOS这种原始的作业系统下玩了10年,甚至自己写过一个汉化的DOS。他只有书本上的一点点网路知识时,就用一两天时间解决了一个学通讯的研究生1个月都不能解决的网路故障。这是一个典型的例子,他并没有“实际的”网路经验,什么使得他如此轻松地进入了新的领域呢?而另一个曾就职于vmware、google等顶级公司的程式设计师,在Unix下只用C语言做了10年系统级程式设计。当用Java,C++甚至是javascript时,其学习时间只是1天,很快就比做了几年专门java程式设计的程式设计师还精通。如何才是软体开发人员的本质力量?什么才能让他们在变化万千的新技术面前屹立不倒,乘风破浪?

计算机工程能力

我们认为计算机工程能力包含两方面的内容:1核心知识架构;2计算机的思维方式。什么是核心知识架构呢?是反应该领域最基本规律和支撑技术的知识。简单地说就是传统的作业系统、编译、资料库。作业系统将硬体、软体、高阶语言和汇编融汇在一起,它几乎包括了软体工程中所有重要的因素。举一个简单的例子,似乎只有面向物件这种“高阶东西”才有的虚拟函式运用,其实在Linux中就有相应的虚档案系统。作业系统是最为复杂的计算机工程之一。编译融汇了大量的演算法,而且能让大家真正看“穿”语言的外表,深入到其内里,体现了最根本的计算机技术。其优化技术,也深刻地和硬体交融在一起,很好体现了底层风范。资料库,不仅是运用演算法最多的地方,甚至是超越作业系统的一个复杂的系统,从快取技术到i/o优化,到索引,再到事务处理,无一不是反映计算机最深刻规律。大家可以发现,所谓核心知识架构,都具有两个特点,反映本质规律,体现软硬融汇交织。也只有这样,才能建立下面谈到的“计算机思维方式”。

核心知识架构

为什么我们没包括一些新兴的语言和技术呢?似乎它们很“实用”。而且已经出现的问题是,按照传统科目和方式学习后,学生在企业什么都不会。这也正是大家关注工程教育的初衷。为什么不强调这些新兴实用技术的教育还在强调“古老”的“基础”。计算机领域一个显著的特点是,表面上知识更新非常快,新技术、语言层出不穷。这很容易导致当我们发现学生能力欠缺时,将问题归罪于新技术的学习不得力,知识结构老化。但其实目前的问题可以从另外一个角度考虑,是否是基础教育不得力?分析国外著名大学,如斯坦福、伯克利的课程,我们发现两个特点:1关键的基础课程,如作业系统、编译原理、资料库,始终是其最重要的课程,并没有过分追逐各种“新潮”技术。2学生一学期能修的课程非常有限,一般为3门课。而国内却呈现相反的状况,比如编译原理被降到了选修课的角色,新潮课程层出不穷,一个学生二年级一学期要修13门课。在这种走马观花的状况下,计算机这种具有强烈“手艺”色彩和工程实践的学科,被完全纸上谈兵化。而一些可怜的实验内容,还被学生的复制拷贝所湮没。我们认为,恰恰是这种情况,使得基础核心知识教育没有工程化,没有充分动手,导致了基础知识教育某种程度上的巨大失败。从以下鲜明的对比可以窥见问题的端倪:国内学生反映作业系统课程是文科课程只需要背条款考试即可;而相对地,国外著名高校作业系统课程要求学生实现“小”作业系统。国内资料库只讲其应用如大量讲解sql等运用,sql即使非计算机专业人士也很容易学习,这也是它被发明的初衷。斯坦福的资料库课程中有一门需要实现一个数据库系统。在笔者走访的计算机工程上优秀的人才,发现其共同的特点就是在诸如作业系统或资料库上都有很深入的学习经历,比如前面提及的自己构建过汉化DOS系统,或者在Unix下,做核心以及驱动很多年等。而当他们接触新技术时,之前深刻的经验和淬炼的思维就让他们如虎添翼,快人一等。更有甚者,国外真正的最顶级专家,都是在这些领域有无与伦比水平的专家,从delphi的缔造者,转战到微软并入主平台的开发,也可看到雄厚的底层知识和能力的巨大作用。所以“老”知识并不是障碍,而是通向天堂的阶梯。究其原因,就涉及到工程能力的第2个方面,计算机思维方式。

计算机思维方式

对非专业人士它是很抽象的概念,而对真正专业人士,这又是一个非常鲜活的概念。这里限于篇幅,我们只举一个简单的例子。面对在C++中外部程式码如何直接修改私有变数的问题,计算机的思维方式就是:物件也是放在记忆体中,只要能拿到物件的地址,并知道物件的布局,那么就可修改。而没有建立这种思维的人,就完全被高阶语言的语法所左右,无从下手。一句话,无法看到本质,没有从下而上的底层思维。核心知识课程的有效深入教学和计算机思维方式建立有何直接关系呢?我们认为核心知识因为其反应了计算机本质规律,而且从底层建立起来,所以对其深入掌握运用后,它从开始的逼迫到最后的陶冶,最终潜移默化地让受众建立起“计算机思维方式”。而这正是计算机工程师安身立命之本,就如同音乐家有其独特的音乐思维方式一样。为什么诸如java之类的课程于建立计算机基本思维不太合适呢?因为它更高层,无法让学生看到最下面。而唯有彻底、深刻和系统的底层淬炼,才能真正建立起“计算机思维方式”。

3如何打造强大的计算机工程能力

大家一方面指责基础课程的“空洞”、“无用”、“陈旧”;另一方面在不断开设的海量新课和技术中压得学生更加远离程式设计,远离实践。即使能培养出熟悉某种语言的学生,也无法看到他们和培训学校有何不同。实训也似乎没有根本解决问题,我们在实践中发现,往往是那些自己醉心于程式设计的学生最后有着卓越的表现。让基础知识能支撑和指导实践,而非仅仅“符号”,并引导学生进行高效的实践。

“3块连一线”,4门基础课程整合打造核心知识架构

我们将4门基本课程进行贯通式整合,着力塑造学生的“计算机思维”。下层的是3门基础课在上一小节探讨了其在工程能力训练上不可替代的重要地位,对软体开发环境产生支撑。而软体开发环境又通过精心的设计和工程实践,从应用角度将3门课程所学的知识串联起来。从而将基础知识和工程开发更有机整合在一起。首先,阐述为什么将以上课程整合在一起的理由。要回答这个问题,必须先回答什么东西支撑了优秀程式设计师。在我们的调查人员中,无一例外地都具有很深厚的底层软体开发背景。有长期从DOS的Hack入手的;有长期从事Unix核心程式设计的;有从Windows的driver起步的;有以反汇编逆向为根基的。长期在最底层的经历,使他们建立了最真实和能触控的系统观,能以计算机的方式思考。所以面临新技术时,他们能透过新形式很快把握其精髓,深刻地把握其实质。“太阳下面没有真正的新事物”,例如号称21世纪最新的重要的软体技术AOPAspectOrientedProgramming,AOP,其实在20世纪60年代就出现在了汇编一级的软体技术中,它本质就是钩子技术的系统化。在底层的软体世界,我们不仅能够用到那些所谓的最新的技术,而且能看到其本质我们可能就是用机器码自己构建出来的,而不被新技术的华丽外衣障目。这些使得具有底层经验的开发者,更有创造力,更能创造,也更能洞察迷乱后的本质,庖丁解牛,解决那些异常复杂的工程问题。举一个笔者遇到的真例项子,一个具有深刻底层经验的程式设计师一直只有C语言和作业系统程式设计经验和一个只有深刻Java经验的程式设计师,在同时学习Javascript的闭包概念时,后者一个礼拜都还有些似是而非。前者很快就能自如运用,且最后指点了后者1个小时,后者顿时豁然开朗。这是典型的“新”与“老”,上层和底层经验在面对新事物时的对比。既然底层软体赋予我们如此强大的能力,那么哪些是底层软体呢?大家公认,作业系统、编译和资料库由来就是计算机工程自身的根基。所以,我们必须将这3门课涉及的知识好好淬炼。而如何将3门课的知识和我们日常的软体开发联络起来呢?如何用它们指导平时程式的开发呢我们大多数是开发使用者级软体,不会开发核心软体,因此许多人认为几乎整个在核心中的作业系统对使用者级软体开发无从指导?另一门课,《软体开发环境》解决了这一问题。它有一条主线,通过反汇编将C语言和汇编串联起来,让系统级的知识从高阶语言的面纱下展现出来。同时用逆向工程这把庖丁之刃,将编译、连结、面向物件等软体开发中的重要知识块剖剔,让底层与上层贯通一气。而逆向的技术技巧,本身也是非常高阶的软体开发技术。因此,我们用“3块连一线”来总结4门课的关系是最好不过了。为什么不纳入语言课程,比如C/C++语言?从我们的工程经验来看,语言只是计算机原理和思想的载体,是表述方式而已。为了表述形式而专门花大力气是不值得的。比如,国外的著名大学很多都不开设语言课,在其他课程作业中必须用C语言程式设计,学生们就在那里锻炼了。真正的语言的力量并非来自语言本身,而是底层知识为支撑的专案锻炼。我们的思路是以构建式完成大量的完整系统的编写,这样就很好锻炼了软体开发和工程能力。同时,“软体开发环境”本身从逆向层面也对语言有了深刻的剖析,这是纯粹的语言课难以完成的。另外,从大纲安排上,我们在大一就会让学生用C语言来初步接触程式编写,这时并不适合放入太高阶主题。而在教学中,语言的力量已经渗透到一个个工程构建中,随风潜入夜了。为什么不纳入演算法课程?从某种程度上,“程式就是演算法与资料结构吗”?我们认为在系统中运用演算法,演算法才具有生命力。而编译、作业系统、资料库以及我们专门设立的一些课程设计将全面运用各种演算法和资料结构。在实战中运用并学习提升才是王道。这也正是构建式学习的精髓所在,这也正是探索式学习培养学生的创造能力的精髓所在。演算法课已经为我们准备了元件,就看你怎么去组装甚至改造。

以构建主义的思路,深度实践的风格改革课程

前面我们论述了底层知识架构的重要性,那么怎么来将它们实际地建立在学生的工程实践中呢?简单地说就是“构建一个具体而微的系统”。讲作业系统就构建一个小作业系统,讲编译原理就构建一个我译器。同时,设计一些跨度较大的课程设计覆盖这些课程的一些重点内容。构建完整系统本身就可真实淬炼工程能力,而这些内容的复杂性、难度以及运用知识点的广度,本身就超越了简单的企业实训专案,在培养人才方面具有系统性、完整性、挑战性独特优点。我们需要的是运用团队的思路和现代软体工程的手段,将其开发过程管理发起来,从而熟悉企业级开发的工具链,将软体工程学到的知识贯通到实作中。这也回答了“和以前相似的强调基础课程教育,什么特点使得我们的做法能获得强大的工程能力?”这一问题。以前更多注重理论知识的学习,而现在的做法是回归计算机工程的自身科学规律———实践为王。

改革考核评价标准,充分强调动手实践

以前我们一直是卷面考试,实验分数只是象征性的点缀。这本身违反了计算机工程的特点。只有改变评价考核标准,才能真正驱动学生充分锻炼工程。在课程软体开发环境中,我们采取了平时的考试结合期末考试的方式,而两者均为软体编写。期末考试在实验室上机编撰指定题目。不强调对一些函式名等死知识点的记忆,可以用线上帮助。这本身也符合软体开发的规律。

4结束语

我们在计算机工程教育上试图做一些回归本质的工作,也取得了一些效果。比如在软体开发环境中,学生普遍认为:“似乎将3年学的程式课全学习了,收获很大”。更有同学,在外企公司的面试中,直接运用了课堂上的知识,这在传统的教学环节中是难以获取的。但整个工作尚在起步阶段,所以仍有很多工作需要做,许多环节需要优化。我们希望在以后的工作中更深入探索工程教育的规律和本质。

五子棋毕业论文设计与实现

可以的!之所以叫BP网络,是因为使用了反向传递算法,这是一种结果导向的自学习方法,用在五子棋上是可以的。因为五子棋的游戏方法正是很明显的结果导向的过程。简单说这么个过程:1.设置输入和输出类型,比如都是坐标[x1,y1]、[x2,y2]...2.训练:你告诉网络A情况下应该输出A1B情况下应该输出B1C情况下应该输出C1...A+B情况下应该输出AB13.测试:你问网络A+B+C情况下,应该输出多少?在哪里下子(就是[x,y]是多少?)网络就根据前面BP训练的结果自动算出你要的坐标。用Matlab神经网络工具箱做吧,不是很难。另外,五子棋的棋盘别太大了,训练难度和时间是随棋盘大小成级数增长的。

分条写:课题做到突出中心思想,条理清晰,结构合理,观点正确,具有较好的连续性等。完成相关的XXXX。

第一步:课题适应的岗位名称;

第二部:课题背景;

第三步,报告(设计、论文等)要求;然后,具体要求;

最后,主要参考文献的范围。

扩展资料:

1、论文题目,有的含副标题。题目之下是作者署名,署名之前或下边一行写作者的校、院、系、年级。

2、“摘要”与“关键词”(或称“内容提要”),一般为300字左右。位于作者署名之后,正文之前。关键词,结合标题和正文内容一般选取3至5个。

3、引论。用“O”标示,常写作“引言”、“引论”、“绪论”,引言较短时可不标出“O。引言”类小标题。引论的内容一般是交代选题背景。

主要有:课题来源,本课题在国内外的研究进展状况。已有的研究成果,存在的问题。选题的意义,讨论的问题。本文分几部分,从哪些方面进行讨论,以及指导思想、论证方法等,均可根据内容的需要写在引论中。

还非要写手机项目?我其他项目基本都有

写课题任务时主要从“想借助这篇论文达到什么样的目的”入手,表明写作意图;写课题要求时主要从“写作时要注意的点”入手,表明写作的时候运用到的研究方法等方面的内容。下面举例说明:

一、毕业论文的课题任务:为JAVA在安卓手机平台设置五子棋游戏的时候提供相应的参考。

二、毕业论文的课题要求:

1、尽量结合生产、科研及技术设备的革新、技术改造等完成论文。

2、要求论文具有先进性、实用性。

3、论文选题难度适中。

扩展资料

毕业论文写作注意事项

1、毕业论文是应考者的总结性独立作业,目的在于总结学习专业的成果,培养综合运用所学知识解决实际问题的能力。从文体而言,它也是对某一专业领域的现实问题或理论问题进行科学研究探索的具有一定意义的论说文。完成毕业论文的撰写可以分两个步骤,即选择课题和研究课题。

2、选好课题后,接下来的工作就是研究课题,研究课题一般程序是:搜集资料、研究资料,明确论点和选定材料,最后是执笔撰写、修改定稿。

参考资料来源:百度百科-毕业论文

  • 索引序列
  • c语言五子棋毕业论文
  • 毕业论文五子棋课程设计
  • 五子棋游戏设计毕业论文
  • c语言毕业论文
  • 五子棋毕业论文设计与实现
  • 返回顶部