求一个五子棋程序设计实验报告

求一个五子棋程序设计实验报告,第1张

我给你一个c++五子棋的程序miancpp#include <cstdio>

#include <string>

#include <cstdlib>

#include <ctime>

#include <Windowsh>

#include "plh"

using namespace std;pl game;

pl game2;void srandput(int &x,int &y) {

srand(time(NULL));

do {

x = rand() % 20;

y = rand() % 20;

} while (!gameisok(x,y));

}void scanfput(int &x,int &y) {

do {

scanf("%d %d",&x,&y);

} while (!gameisok(x,y));

}int main() {

int x,y;

char who = com;

x = y = -1;

do {

if (who == com) who = me;

else who = com;

if (who == me) {

gamegetxy(x,y);

printf("Com put chess in (%d,%d)\n",x,y);

gameprintmap();

if (gameisend(x,y,com)) {

who = com;

break;

} gamesendxy(x,y);

printf("I put chess in (%d,%d)\n",x,y);

gameprintmap();

if (gameisend(x,y,me)) break;

//system("pause");

}

else {

//srandput(x,y);

scanfput(x,y);

//game2getxy(x,y);

//game2sendxy(x,y);

}

} while (true);

if (who == me) {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe);

puts("You Win, Computer Lose");

}

else {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom);

puts("Computer Win, You Lose");

}

printf("Use %d Steps\n",gamegetstep());

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite);

} pihconst DWORD dwWhite = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;

const DWORD dwMe = FOREGROUND_GREEN;

const DWORD dwCom = FOREGROUND_RED;

//■□○●

char rec1[] = {-95,-10,0};

char rec2[] = {-95,-11,0};

char cir1[] = {-95,-16,0};

char cir2[] = {-95,-15,0};

//////////////////////////////////////////////////////////////////////////

//class pl

//////////////////////////////////////////////////////////////////////////

const int NMAX = 20;

const int MAX = 1200;

const char blank = '0';

const char me = '1';

const char com = '2';class pl {

public:

void sendxy(int &,int &);

void getxy(int,int);

void initscore();

void refreshscore(char,int,int);

void calscore(char);

void solve(int &,int &);

void printmap();

bool isok(int,int);

bool isend(int,int,char);

int getstep();

pl();

private:

int usestep;

int wincount;

char chess[NMAX][NMAX];

int win[2][MAX];

//ps,pt -> me

//cs,ct -> com

int ps[NMAX][NMAX],

cs[NMAX][NMAX];

bool pt[NMAX][NMAX][MAX],

ct[NMAX][NMAX][MAX];

};pl::pl() {

memset(chess,blank,sizeof(chess));

memset(pt,false,sizeof(pt));

memset(ct,false,sizeof(ct));

memset(win,0,sizeof(win));

wincount = 0;

usestep = 0;

initscore();

}void pl::printmap() {

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

printf("\t\t\t%d\t",i);

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

if (chess[i][j] == me) {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe);

printf("%s",cir2);

}

else if (chess[i][j] == com) {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom);

printf("%s",cir2);

}

else printf("%s",rec2);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite);

}

putchar('\n');

}

printf("\n\t\t\t\t");

for (i=0;i<NMAX;i++) printf("%2d",i);

putchar('\n');

}void pl::getxy(int x,int y) {

if (x==-1 && y==-1) return;

refreshscore(com,x,y);

}bool pl::isok(int x,int y) {

return (chess[x][y] == blank);

}bool pl::isend(int x,int y,char who) {

int i,j;

int l,r,u,d,c1,c2,c3,c4;

if (x==-1 && y==-1) return false;

l = r = u = d = 0;

c1 = c2 = c3 = c4 = 0;

for (i=1;i<5 && x+i < NMAX;i++) {

if (who == chess[x+i][y]) u ++;

else break;

}

for (i=1;i<5 && x-i >= 0;i++) {

if (who == chess[x-i][y]) d ++;

else break;

}

for (i=1;i<5 && y+i < NMAX;i++) {

if (who == chess[x][y+i]) r ++;

else break;

}

for (i=1;i<5 && y-i >= 0;i++) {

if (who == chess[x][y-i]) l ++;

else break;

}

for (i=1;i<5 && x+i < NMAX && y+i < NMAX;i++) {

if (who == chess[x+i][y+i]) c1 ++;

else break;

}

for (i=1;i<5 && x+i < NMAX && y-i >= 0;i++) {

if (who == chess[x+i][y-i]) c2 ++;

else break;

}

for (i=1;i<5 && x-i >= 0 && y-i >= 0;i++) {

if (who == chess[x-i][y-i]) c3 ++;

else break;

}

for (i=1;i<5 && x-i >= 0 && y+i < NMAX;i++) {

if (who == chess[x-i][y+i]) c4 ++;

else break;

}

return ( (u+1+d)>=5 || (l+1+r)>=5 || (c1+1+c3)>=5 || (c2+1+c4)>=5 );

}void pl::sendxy(int &x, int &y) {

solve(x,y);

usestep ++;

}//枚举赢的局面

void pl::initscore() {

int i,j,k;

//竖

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

for (j=0;j<NMAX-4;j++) {

for (k=0;k<5;k++) pt[j+k][i][wincount] = ct[j+k][i][wincount] = true;

wincount ++;

}

}

//横

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

for (j=0;j<NMAX-4;j++) {

for (k=0;k<5;k++) pt[i][j+k][wincount] = ct[i][j+k][wincount] = true;

wincount ++;

}

}

//斜1

for (i=0;i<NMAX-4;i++) {

for (j=0;j<NMAX-4;j++) {

for (k=0;k<5;k++) pt[j+k][i+k][wincount] = ct[j+k][i+k][wincount] = true;

wincount ++;

}

}

//斜2

for (i=0;i<NMAX-4;i++) {

for (j=NMAX-1;j>=4;j--) {

for (k=0;k<5;k++) pt[j-k][i+k][wincount] = ct[j-k][i+k][wincount] = true;

wincount ++;

}

}

}//计算全局位置的分值

void pl::calscore(char who) {

bool (table)[NMAX][MAX];

int (score)[NMAX];

int iwho;

if (who == me) {

table = pt;

score = ps;

iwho = 1;

}

else {

table = ct;

score = cs;

iwho = 0;

}

srand(time(NULL));

int i,j,k;

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

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

score[i][j] = 0;

if (chess[i][j] == blank) {

for (k=0;k<wincount;k++) {

if (!table[i][j][k]) continue;

//分值的大小影响棋子位置的选择

srand(rand());

switch (win[iwho][k]) {

case 1:

score[i][j] += 1;

break;

case 2:

score[i][j] += 10;

break;

case 3:

score[i][j] += 100;

break;

case 4:

score[i][j] += 1000;

}

}

}

}

}

}void pl::solve(int &x, int &y) {

calscore(me);

calscore(com);

int i,j;

int me_score,com_score;

int me_x,me_y,com_x,com_y;

me_score = com_score = -1;

//选取我方或对方得分最大值

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

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

if (chess[i][j] == blank) {

if (me_score < ps[i][j]) {

me_score = ps[i][j];

me_x = i;

me_y = j;

}

if (com_score < cs[i][j]) {

com_score = cs[i][j];

com_x = i;

com_y = j;

}

}

}

}

if (me_score > com_score) {

x = me_x;

y = me_y;

}

else {

x = com_x;

y = com_y;

}

refreshscore(me,x,y);

}//更新分数

void pl::refreshscore(char who,int x,int y) {

bool (table)[NMAX][MAX];

bool (antitable)[NMAX][MAX];

int iwho;

if (who == me) {

table = pt;

antitable = ct;

iwho = 1;

}

else {

table = ct;

antitable = pt;

iwho = 0;

}

chess[x][y] = who;

for (int i=0;i<wincount;i++) {

//一方位置能胜利次数

if (table[x][y][i] && win[iwho][i] < INT_MAX) win[iwho][i] ++;

if (antitable[x][y][i]) {

//另一方无法放置

antitable[x][y][i] = false;

win[1-iwho][i] = INT_MAX;

}

}

}int pl::getstep() {

return usestep;

}

通过C++语言来实现一个以windows控制台为展示平台的简单版五子棋程序,其中通过键盘输入来控制游戏中的行为(光标移动、落子、确认)。

规则要求某一方在横竖斜方向连续存在五个或五个以上本人所执棋子获得为获胜。当我们要扒一个已存在的程序时(有的是五子棋的程序,可以在互联网里找到很多)。

我们可以从他的UI入手,通过我们所观察到的,所感受到,所使用到的服务,来对软件进行分析,从而获得以上流程,但我们一旦需要将需求变为代码时,我们的设计就要考虑的更多了。

我们可以使用两个int类型的值来表示:白子- 1,黑子- 2,那么我们只要在棋盘中更改光标所在位置元素的值为1或2就可以了。

我们回顾一下光标移动的代码,我们会发现,中进行落子后,我们光标再次移动有可能会改变已记录的落子信息,为了使光标与棋子不冲突,我们使用两个图层,表示两个相同的棋盘。

windows程序实现五子棋移动功能步骤如下:

1、通过C+语言来实现一个以windows控制台为展示平台的简单版五子棋程序,通过键盘输入来控制游戏中的行为光标移动,落子,确认。

2、规则要求某一方在横竖斜方向连续存在五个或五个以上本人所执棋子获得为获胜,要扒一个已存在的程序时,五子棋的程序,可以在互联网里找到很多。

3、可以使用两个int类型的值来表示,白子-1,黑子-2。

4、光标再次移动会改变已记录的落子信息,为了使光标与棋子不冲突,使用两个图层,表示两个相同的棋盘。

行棋顺序:黑先、白后,从天元开始相互顺序落子。

判断胜负:最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。黑棋禁手判负(Lose),白棋无禁手。

黑棋禁手包括“三、三”(Double Three)(包括“四、三、三”)、“四、四”(Double Four)(包括“四、四、三”)、“长连”(Overline)。黑棋只能以“四、三”取胜。

如分不出胜负,则定为平局(Draw)。对局中中途退场判为负。五连与禁手同时形成,先五为胜。黑方禁手形成时,白方应立即指出。若白方未发现或发现后未指明而继续应子,则不能判黑方负。

时间限定:每方20分钟包干,然后1分钟读秒。

段级位制

五子棋的段级位对象:参加中国棋院认可的国内外五子棋比赛的五子棋爱好者。

第四条段位共分九个等级,最高是九段,以下分别是八段、七段、六段、五段、四段、三段、二段、初段。段位以下共分十个等级,最高是一级,以下分别是二级、三级、四级、五级、六级、七级、八级、九级、十级。

第五条根据中国五子棋爱好者在国内、国际交流中所体现出来的实际水平,在五子棋段级位制度实施初期,对爱好者授予的最高段位暂定为六段。随着中国棋手参与国内外交流机会的增加和技术水平的提高,逐步增加所授予段位的上限,直至九段。

在中国,获得段级位的主要渠道是通过比赛。在全国五子棋邀请赛等国内大赛中获得一定名次,即可获得相应段位。

(1)对局双方各执一色棋子。

(2)空棋盘开局。

(3)黑先、白后,交替下子,每次只能下一子。

(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。

(5)黑方的第一枚棋子可下在棋盘任意交叉点上。

(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)

五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

扩展资料

1,五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。

2,棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋。

3,容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。已在各个游戏平台有应用。

参考资料百度百科;五子棋

以下谨为个人意见,完全我自己的想法(我自己是搞软件开发的),谨供参考:

1,设计程序结构,就是说代码是大概是怎么分类的,如:要有个棋盘类,专门来处理棋子的显示,有个检测类,专门处理是否达到赢的状态等等

2,结构设计好后就开始画程序的流程图,这样在写代码和以后维护起来才方便把程序从启动到结束的所有流程都画出来,标明走向这样做还有个好处就是可以对程序有个大概的蓝图

3,流程图好了以后其实就已经好了大办了,剩下的就是代码翻译了,把你前面的人类语言的设计按钮流程图翻译成代码因为代码是相对独立的一块一块的,可以每个单独的模块一个一个写\测试

4,把所有模块都写好后,进行程序拼合,在拼合过程中如果是一个人写的代码可能还好一点,如果是分工合作几个人写的代码可能会有一点麻烦(因为商业代码一般不可能是一个人完成的)

5,最后就是软件的检测了,测试基本功能是否可以正常使用都这里也就差不多结束了

6,这就是产品的后期维护了,就是在使用过程中发现什么问题再来修改

如果有什么问题HI我

以上就是关于求一个五子棋程序设计实验报告全部的内容,包括:求一个五子棋程序设计实验报告、如何用C++编写五子棋、windows程序如何实现五子棋移动功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9312108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存