搜索
您的当前位置:首页正文

百行HTML5代码实现四种双人对弈游戏

2023-11-26 来源:莱芜美食
简介: 本文是一个非常具有挑战性的编程,因为 100 行代码,约莫 10000 个字符左右,将实现围棋、五子棋、四子棋和翻转棋四种双人对弈游戏。请注意,这四个对弈游戏不是初级编程者的习作,而是有着棋盘、立体棋子、事件、走棋规则判断、输赢判断的完整对弈游戏,并且可以离线存储到 iPad、Android 平板中,试想一下,把这种游戏下载到平板中,就可以在火车,旅游景区,等没有信号的地方进行对弈,是不是扩展了平板电脑的功能,是不是一种很惬意的事情。而且,关键是,这个程序没有图片,不需要去应用商店付费下载,仅仅是用 HTML5 技术写的 100 行代码而已,绝对是目前最迷您精悍的双人对弈游戏源码。(编者注:由于网页代码的宽度有限制,所以作者的源代码经过了一些换行处理,特此说明。)

目标

要做一个完整的双人对弈游戏,至少要做如下事情,第一步:绘制棋盘。不同的棋类游戏棋盘不同,这一点需要进行动态处理;第二步:绘制棋子。需要说明的是,围棋,五子棋等这些棋子都是圆的啊,请不要为了图片苦恼,在 HTML5 时代,我们用代码就可以实现立体圆形棋子;第三步:判断落子事件。当然是要定位手指的点击位置,这四种棋中,有的是落在框里面的,有的却是落在纵横交错的棋盘十字线上,需要动态处理;第四步:判断落子规则。下棋都有规则,不要因为代码少,就将规则打折扣,否则程序不成熟,会变成小朋友的玩具了;第五步:判断输赢。最后,我们要判断输赢。也就是要数子,这个事情必须由程序来完成,因为下棋总得需要一个裁判嘛;第六步:就是平板电脑时代,我们得实现离线应用。这个太重要了,否则,要是在台式电脑上,接根网线玩的游戏,已经遍地都是了,您写得再牛,有什么用?就是要移动,在没有信号的地方,才有市场,现在平板,智能手机这么多,在没有网络信号的地方,掏出移动设备来下棋,才是一件很牛的事情。

绘制棋盘

前面说了围棋、五子棋、四子棋和翻转棋的棋盘并不相同,围棋是纵横 18 个格,其他三种棋则是 8 个格。所以绘制棋盘是需要有参数。这是个小问题,大问题是,选择什么方法来绘制棋盘?

HTML5 框架下,有至少 3 种方法:第一种,用 Canvas 画线;第二种,用 DIV,CSS3 里面增加了行列属性;第三种,用 table 标签。

用哪一种速度最快,代码少呢?答案是:第三种。多少有点失望啊,HTML5 不是万能的。详细代码如下:

"); for(var j=0;j<col;j++){array.push("
12345678910111213141516171819202122232425this.board=function(name,width,height,rowBak,colBak){ /* 画棋盘 */ nameBak=name; if("turnover"==name){row=8;col=8;}else if("gogame"==name){row=18;col=18;} var aW=Math.floor(width/(col+2)),aH=Math.floor(height/(row+2)); minL=(aW>aH?aH:aW)-4;// 这个减法很重要,否则填空时会把表格撑大 var array=new Array("<div style="margin:"+minL+"px;"> "+ "<table border=1 cellspacing=0 width=""+(aW*col)+"" height=""+(aH*row)+"">"); for(var i=0;i<row;i++){ array.push("
align=center>"+ evt(i,j,minL,minL,aW*j+minL/2+8,aH*i+minL/2)+"td>");} if(nameBak!="four"&&nameBak!="turnover")/* 将事件添加到表格中 */ array.push(evt(i,col,minL,minL,aW*col+minL/2+8,aH*i+minL/2)); array.push("tr>"); } if(nameBak!="four"&&nameBak!="turnover"){ for(var j=0;j<=col;j++){ array.push(evt(row,j,minL,minL,aW*j+minL/2+8,aH*row+minL/2)); } } document.write(array.join("")+"table>div>"); setClick(row,col,minL,minL);/* 初始化事件 */ start();/* 初始化棋子 */ }

上面代码中,最重要的是标黑体的第 6 行代码,这里面有两个诀窍,第一个就是 table 的定义,第二个就是使用了 Array 数组。为什么要使用数组,而不是定义一个字符串呢?答案是优化,就是 Array 数组的 push 方法的速度要远远快于 String 字符串的加 + 运算。共计 16 行代码,一个棋盘就画好了,当然这其中不仅仅是画线,还有棋子处理,事件定义等方法的调用,后面将陆续谈到。

绘制棋子

绘制完棋盘,我们来绘制棋子。我们挑选的这四种棋,虽然棋盘不同,但是棋子都是相同的,都是黑白棋子。这在以前,做在线对弈,除了 Flash 能实现美观效果外,其他的必须先请美工做几副小图片,HTML5 时代,美工的人力和沟通成本就节省了。

我们至少有两种方法绘制棋子,第一种是:canvas 类,第二种就是 css 的圆角属性。用哪种速度又快代码又少呢?答案是第二种,圆角。代码如下:

1234567891011function man(width,height,id,colorBak){ /* 画棋子 */ var color=colorBak==null?(order++%2==0?"000":"CCC"):colorBak; var r="border-radius:"+width/2+"px;"; var obj=id==null?event.srcElement:_$(id); obj.innerHTML="+color+"_"+order+"" style="display:block;-webkit-" +r+"-moz-"+r+""+r+"-moz-box-shadow:inset 0 -10px 40px rgba(0,0,0,1);"+ "box-shadow:inset 0 -10px 40px rgba(0,0,0,1);"+ "background:-webkit-gradient(radial, 50 40, 30, center center, 80, from(#"+color+"), to(rgba(255,255,255,1)));"+ "width:"+width+"px;height:"+height+"px;">"; }

上面代码中,我们看到,我们将每一个棋子定义了一个 DIV,使用了 CSS3 的 shadow,gradient 属性,并且可以根据棋盘的大小自动计算棋子的大小,另外,如果用户不喜欢黑白颜色,甚至可以定义成红黄颜色,女生和小朋友估计会喜欢。这 5 行代码是画一个棋子的方法,做一个简单的循环,就可以画出多个棋子,方法如下。

123function moreMan(array){for(var i=0;iman(minL,minL,nameBak+"_"+array[i]);} /* 绘制多个棋子 */

处理事件

绘制完棋盘和棋子,我们来分析一下用户的动作。用户的动作无非就是两种,一种是点击棋盘 table,另外一种就是点击棋子 DIV。难点在点击 table 这里,我们要获知用户点击 table 的位置。

传统思路可能是这样,使用 event 方法,获得 x,y 的坐标,然后与 table 的左上角做减法,然后再跟单元格 cell 做除法。听起来都麻烦。

如果您仔细阅读了前面的代码,就应该发现,其实在画棋盘是,我们向 array 数组中 push 了一个 evt 方法,很明显,这个 evt 方法要返回一个字符串变量的,那么他的内容是什么呢?答案揭晓:

123456function evt(i,j,width,height,left,top){ /* 单一单元格事件 */ return "+nameBak+"_"+i+"_"+j+"" style="position:"+ (nameBak=="four"||nameBak=="turnover"?"block":"absolute")+ ";border:0px solid #000;width:"+ width+"px;height:"+height+"px;top:"+top+"px;left:"+left+"px;">"; }

原理是一个 DIV。对了,这个添加事件的方法非常特殊,实际上是在每个棋盘的交叉的地方画了一个 DIV,然后给 DIV 添加事件。

12345678function setClick(row,col,width,height){ for(var i=0;i<=row;i++){ for(var j=0;j<=col;j++){ var els=_$(nameBak+"_"+i+"_"+j); if(els!=null)els.onclick=function(){if(rule())man(width,height);}; } } }

需要说明的是,DIV 一定要先定义,即 document.write 输出出来,然后才能执行 onclick 的定义,否则会返回 DIV 未定义的错误。寥寥 10 行代码,把事件问题搞定了。

落子规则

前面说了,用户点击事件有两种,点击棋盘 table 事件我们采用额外增加 DIV 的方法巧妙解决了,第二种点击棋子的方法又该如何呢?

先要说明的是,点击棋子其实是一种错误的事件,点击棋盘可以落子,点击棋子是什么意思?黑白棋点击棋子是无意义的,我们必须要进行判断,不能在有子的地方落子,这是规则之一。所以必须要定义一个方法,判断是不是点击的地方是不是有棋子。代码如下:

12345function isMan(row,col){var obj=_$(nameBak+"_"+row+"_"+col,1); if(obj==null||obj.indexOf("man_")==-1)return null; else if(obj.indexOf("000")!=-1) return 0; else if(obj.indexOf("CCC")!=-1)return 1;}

想不到吧,其实只要一行代码就可以就可以做是否有子的判断,怎么判断的,诀窍就在于判断 DIV 的颜色,棋子要么黑,返回 0,要么白,返回 1,但是空白地方是没有颜色的,返回 null。这里要特别注意返回值,后面判断输赢的时候还要用,所以不能简单通过 true 或者 false 的的返回值来判断是否有子,而是要判断出有什么颜色的子。

对于五子棋和围棋,这一条规则够用了,但是对于翻转棋和四子棋,还有第二条规则:不能在四周空白的地方落子,就是说必须是相连的。也就是说,不仅仅要判断点击的地方是不是有棋子,还要判断其四周是不是有棋子,这个,不是可以有,而是,必须有。需要做一个小循环啊,代码如下:

12345678910111213141516171819202122232425262728function rule(){/* 走棋规则 */ var id=event.srcElement.id; if(id.indexOf("man_")==0){alert("不能在有子的地方落子");return false;}else{ var p=id.indexOf("_"),p1=id.lastIndexOf("_"); var row=id.substr(p+1,p1-p-1)*1,col=id.substr(p1+1)*1; if("gobang"==nameBak)return gobang(row,col); else if("four"==nameBak){ if(isMan(row,col+1)==null&&isMan(row,col-1)==null&& isMan(row+1,col)==null&& isMan(row-1,col)==null){ alert("四子棋不能在四周空白的地方落子!"); return false; } return gobang(row,col,3); }else if("turnover"==nameBak){ if(isMan(row,col+1)==null&&isMan(row,col-1)==null&& isMan(row+1,col)==null&&isMan(row-1,col)==null&& isMan(row-1,col-1)==null&& isMan(row+1,col+1)==null){ alert("翻转棋不能在四周空白的地方落子!"); return false; } turnover(); }else if("gogame"==nameBak){ } } return true; }

循环中,反复调用 isMan 方法判断是否有棋子,所以如果 isMan 写得不够简练,快速,不知道要耗费多少时间啊。数一数,总共 19 行代码就处理了落子规则。

到这里,我们绘制了棋盘,棋子,获得了点击时间,判断了落子规则,才用了 40 行左右的代码,其实程序基本上可用了,但是我们不能满足啊,还得让他更加智能一些,我们还需要一个裁判断输赢。

判断输赢

要判断输赢,我们必须要知道下棋的规则:

五子棋是各个方向的五子相连算赢,四子棋是各个方向四个子相连算赢,翻转棋数棋子的个数,围棋则要麻烦些,不仅仅数棋子个数,还要数围住的区域。

逻辑上好像很复杂啊,似乎也是计算最多的地方,有点人工智能的意思。没错,如果前面的基础打得不好,这里的确要耗费很多代码,但是因为我们前面定义了 DIV 用颜色判断是否存在棋子的 iaMan 方法,这里再使用一个小技巧,就可以轻松搞定这个输赢判断。先看看五子棋和四子棋的输赢判断代码,然后对照代码来分析。

1234567891011121314function gobang(row,col,num){ num=num==null?4:num; var rs=[[],[],[],[]],b=[],w=[];/* 这里采用四维数组来存储棋子位置 */ for(var i=0,j=0;i2+1;i++,j++){ rs[0].push(isMan(row-num+i,col)); rs[1].push(isMan(row,col-num+j)); rs[2].push(isMan(row-num+i,col-num+j)); rs[3].push(isMan(row-num+i,col-num+j)); if(i0);w.push(1);} } if(rs.join("#").indexOf(b.join(","))!=-1){alert("黑棋胜");return false; }else if(rs.join("#").indexOf(w.join(","))!=-1){alert("白棋胜");return false;} return true; }

共计 9 行代码就搞定,看懂没?首先定义了一个 Javascript 多维数组 rs=[[],[],[],[]],这种定义多维数组的方法,挑出来重点说明一下,因为搜索引擎上都是搜不到的,我讲课时差不多遇到的学生也都不清楚,他们大多采用 new Array,然后加循环的蜗牛方法。

第二步:从落子的地方开始循环,注意,不是循环整个棋盘,为的就是节省时间啊。循环设计纵横交叉四个方向,有棋子的地方,就向这个四维数组 push 棋子的颜色。

第三步:把数组 join 起来就 ok 啦,如果有 4 个或 5 个 1 相连,自然就是白棋胜,否则就是黑棋胜。

写道这里,就有点意思啦,注意我们处理的数据的方法,我称之为“块数据”的处理方法,就是充分利用 array 数组,保存一块一块的数据,无论写入,读取,还是统计分析,都是针对这一块数据进行,这样既可以提高内聚度,便于提炼出可以重用的方法,就可以大大的加快执行速度。

处理相连都不在话下,数子就更简单了,使用块数据处理方法,3 行搞定。

123456789function turnover(){ if(order<64)return; var num=0;var total=row*col;for(var i=0;i for(var j=0;j"_"+j);} } if(num2)alert("黑棋胜"+(total-num*2)+"子"); else if(num>row*col/2)alert("白棋胜"+(num*2-total)+"子"); else alert("平局"); }

棋子初始化

环环相扣地写到这里,还有最后一个关于棋子的问题需要处理。那就是,下五子棋是从空白棋盘开始,其他三种棋却一开始都是有子的。其实给一个空白棋盘也行,但是其他三种棋因为一般的前几步走法都是固定的,我们为了提高智能化程度,不得不在浪费四行代码,毕竟,我们的目标是一个市场化的产品,而不是一个初学者不考虑用户体验的程序。

123456function start(){ if("turnover"==nameBak){moreMan([3+"_"+3,4+"_"+3,4+"_"+4,3+"_"+4]); }else if("four"==nameBak){man(minL,minL,nameBak+"_"+row/2+"_"+0); }else if("gogame"==nameBak){moreMan([3+"_"+3,15+"_"+3,15+"_"+15,3+"_"+15]); } }

其实就是调用了一下 moreMan 方法,注意也是块数据引用,传输了一个数组,用下划线分割横向和纵向坐标。

做成离线应用

本文开头就说过,台式电脑的双人或多人对弈程序早已多如牛毛烂大街了,只有移动应用才能有市场,我们的目标就是奔着这个来的,所以最后必须做成离线应用。

如何实现 HTML5 的离线应用,搜索引擎很快能找到结果,其实只要三个关键步骤。

第一步;在 Web 服务器的配置文件中声明一下。Tomcat 和 Apache 的声明方式不相同,需要注意;

第二步:定义 manifest 文件,文件格式需要注意;

第三步:在 HTML 的文件中调用一下 manifest 文件。

根据这三个步骤,读者可以自行搜索细节,这里就不赘述了,我只讲搜索引擎搜不到的。

另外需要说明的是,iPad 和 Android 平板上浏览器实现全屏的方法也不一样,针对 iPad 用户,我们还必须定义一行能够实现全屏的代码。

9. 效果图、在线演示、开放源代码

本文的在线演示网址是:http://www.chofo.com/chess.htm,效果图如下图所示:

图 1. 效果图

图中加了一个选择棋类型和设置背景功能,如要获得全部源代码,只要使用浏览器的查看源代码功能即可,限于篇幅,这里就不贴了。

总结

作为一个程序员,最高的境界不是写得代码越多越好,而是用最少的代码实现最多的计算,解决最多的问题。回想当年,盖茨在编写 Basic 时,为了节省几个字符需要绞尽脑汁通宵达旦,以至于遗留了千年虫世纪难题,反观今日,在云计算时代,随着硬盘和内存的容量越来越大,CPU 的运算越来越快,很多大型项目的程序员似乎失去了精简代码的习惯。但是移动计算的硬件,目前还没有那么高的配置,本文通过 HTML5 对弈游戏,使用“块数据”计算方法,实现了用最少代码实现最多计算的目标,特别适用移动计算,与大家共勉。

小编还为您整理了以下内容,可能对您也有帮助:

用C++编写的小游戏源代码

五子棋的代码:

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include <time.h>

using namespace std;

const int N=15;                 //15*15的棋盘

const char ChessBoardflag = ' ';          //棋盘标志

const char flag1='o';              //玩家1或电脑的棋子标志

const char flag2='X';              //玩家2的棋子标志

typedef struct Coordinate          //坐标类

{   

int x;                         //代表行

int y;                         //代表列

}Coordinate;

class GoBang                    //五子棋类

public:

GoBang()                //初始化

{

InitChessBoard();

}

void Play()               //下棋

{

Coordinate Pos1;      // 玩家1或电脑

Coordinate Pos2;      //玩家2

int n = 0;

while (1)

{

int mode = ChoiceMode();

while (1)

{

if (mode == 1)       //电脑vs玩家

{

ComputerChess(Pos1,flag1);     // 电脑下棋

if (GetVictory(Pos1, 0, flag1) == 1)     //0表示电脑,真表示获胜

break;

PlayChess(Pos2, 2, flag2);     //玩家2下棋

if (GetVictory(Pos2, 2, flag2))     //2表示玩家2

break;

}

else            //玩家1vs玩家2

{

PlayChess(Pos1, 1, flag1);     // 玩家1下棋

if (GetVictory(Pos1, 1, flag1))      //1表示玩家1

break;

PlayChess(Pos2, 2, flag2);     //玩家2下棋

if (GetVictory(Pos2, 2, flag2))  //2表示玩家2

break;

}

}

cout << "***再来一局***" << endl;

cout << "y or n :";

char c = 'y';

cin >> c;

if (c == 'n')

break;

}       

}

protected:

int ChoiceMode()           //选择模式

{

int i = 0;

system("cls");        //系统调用,清屏

InitChessBoard();       //重新初始化棋盘

cout << "***0、退出  1、电脑vs玩家  2、玩家vs玩家***" << endl;

while (1)

{

cout << "请选择:";

cin >> i;

if (i == 0)         //选择0退出

exit(1);

if (i == 1 || i == 2)

return i;

cout << "输入不合法" << endl;

}

}

void InitChessBoard()      //初始化棋盘

{

for (int i = 0; i < N + 1; ++i)      

{

for (int j = 0; j < N + 1; ++j)

{

_ChessBoard[i][j] = ChessBoardflag;

}

}

}

void PrintChessBoard()    //打印棋盘,这个函数可以自己调整

{

system("cls");                //系统调用,清空屏幕

for (int i = 0; i < N+1; ++i)

{

for (int j = 0; j < N+1; ++j)

{

if (i == 0)                               //打印列数字

{

if (j!=0)

printf("%d  ", j);

else

printf("   ");

}

else if (j == 0)                //打印行数字

printf("%2d ", i);

else

{

if (i < N+1)

{

printf("%c |",_ChessBoard[i][j]);

}

}

}

cout << endl;

cout << "   ";

for (int m = 0; m < N; m++)

{

printf("--|");

}

cout << endl;

}

}

void PlayChess(Coordinate& pos, int player, int flag)       //玩家下棋

{

PrintChessBoard();         //打印棋盘

while (1)

{

printf("玩家%d输入坐标:", player);

cin >> pos.x >> pos.y;

if (JudgeValue(pos) == 1)          //坐标合法

break;

cout << "坐标不合法,重新输入" << endl;

}

_ChessBoard[pos.x][pos.y] = flag;

}

void ComputerChess(Coordinate& pos, char flag)       //电脑下棋

{

PrintChessBoard();         //打印棋盘

int x = 0;

int y = 0;

while (1)

{

x = (rand() % N) + 1;      //产生1~N的随机数

srand((unsigned int) time(NULL));

y = (rand() % N) + 1;     //产生1~N的随机数

srand((unsigned int) time(NULL));

if (_ChessBoard[x][y] == ChessBoardflag)      //如果这个位置是空的,也就是没有棋子

break;

}

pos.x = x;

pos.y = y;

_ChessBoard[pos.x][pos.y] = flag;

}

int JudgeValue(const Coordinate& pos)       //判断输入坐标是不是合法

{

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

{

if (_ChessBoard[pos.x][pos.y] == ChessBoardflag)

{

return 1;    //合法

}

}

return 0;        //非法

}

int JudgeVictory(Coordinate pos, char flag)           //判断有没有人胜负(底层判断)

{

int begin = 0;

int end = 0;

int begin1 = 0;

int end1 = 0;

//判断行是否满足条件

(pos.y - 4) > 0 ? begin = (pos.y - 4) : begin = 1;

(pos.y + 4) >N ? end = N : end = (pos.y + 4);

for (int i = pos.x, j = begin; j + 4 <= end; j++)

{

if (_ChessBoard[i][j] == flag&&_ChessBoard[i][j + 1] == flag&&

_ChessBoard[i][j + 2] == flag&&_ChessBoard[i][j + 3] == flag&&

_ChessBoard[i][j + 4] == flag)

return 1;

}

//判断列是否满足条件

(pos.x - 4) > 0 ? begin = (pos.x - 4) : begin = 1;

(pos.x + 4) > N ? end = N : end = (pos.x + 4);

for (int j = pos.y, i = begin; i + 4 <= end; i++)

{

if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j] == flag&&

_ChessBoard[i + 2][j] == flag&&_ChessBoard[i + 3][j] == flag&&

_ChessBoard[i + 4][j] == flag)

return 1;

}

int len = 0;

//判断主对角线是否满足条件

pos.x > pos.y ? len = pos.y - 1 : len = pos.x - 1;

if (len > 4)

len = 4;

begin = pos.x - len;       //横坐标的起始位置

begin1 = pos.y - len;      //纵坐标的起始位置

pos.x > pos.y ? len = (N - pos.x) : len = (N - pos.y);

if (len>4)

len = 4;

end = pos.x + len;       //横坐标的结束位置

end1 = pos.y + len;      //纵坐标的结束位置

for (int i = begin, j = begin1; (i + 4 <= end) && (j + 4 <= end1); ++i, ++j)

{

if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j + 1] == flag&&

_ChessBoard[i + 2][j + 2] == flag&&_ChessBoard[i + 3][j + 3] == flag&&

_ChessBoard[i + 4][j + 4] == flag)

return 1;

}

//判断副对角线是否满足条件

(pos.x - 1) >(N - pos.y) ? len = (N - pos.y) : len = pos.x - 1;

if (len > 4)

len = 4;

begin = pos.x - len;       //横坐标的起始位置

begin1 = pos.y + len;      //纵坐标的起始位置

(N - pos.x) > (pos.y - 1) ? len = (pos.y - 1) : len = (N - pos.x);

if (len>4)

len = 4;

end = pos.x + len;       //横坐标的结束位置

end1 = pos.y - len;      //纵坐标的结束位置

for (int i = begin, j = begin1; (i + 4 <= end) && (j - 4 >= end1); ++i, --j)

{

if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j - 1] == flag&&

_ChessBoard[i + 2][j - 2] == flag&&_ChessBoard[i + 3][j - 3] == flag&&

_ChessBoard[i + 4][j - 4] == flag)

return 1;

}

for (int i = 1; i < N + 1; ++i)           //棋盘有没有下满

{

for (int j =1; j < N + 1; ++j)

{

if (_ChessBoard[i][j] == ChessBoardflag)

return 0;                      //0表示棋盘没满

}

return -1;      //和棋

}

bool GetVictory(Coordinate& pos, int player, int flag)   //对JudgeVictory的一层封装,得到具体那个玩家获胜

{

int n = JudgeVictory(pos, flag);   //判断有没有人获胜

if (n != 0)                    //有人获胜,0表示没有人获胜

{

PrintChessBoard();

if (n == 1)                //有玩家赢棋

{

if (player == 0)     //0表示电脑获胜,1表示玩家1,2表示玩家2

printf("***电脑获胜***n");

else

printf("***恭喜玩家%d获胜***n", player);

}

else

printf("***双方和棋***n");

return true;      //已经有人获胜

}

return false;   //没有人获胜

}

private:

char _ChessBoard[N+1][N+1];      

};

扩展资料:

设计思路

1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。

2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。

3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。

HTML是什么??2143

HTML的全称是超文本标记语言,是一种标记语言。它包括一系列标签,可以统一网络上文档的格式,将分散的互联网资源连接成一个逻辑整体。HTML是由HTML命令组成的描述性文本,可以解释文字、图形、动画、声音、表格、链接等。Html是一种用来描述网页的语言。它被称为超文本标记语言,它是一种标记语言。它包括一系列标签,可以统一网络上文档的格式,将分散的互联网资源连接成一个逻辑整体。

HTML是什么??2143

HTML的全称是超文本标记语言,是一种标记语言。它包括一系列标签,可以统一网络上文档的格式,将分散的互联网资源连接成一个逻辑整体。HTML是由HTML命令组成的描述性文本,可以解释文字、图形、动画、声音、表格、链接等。Html是一种用来描述网页的语言。它被称为超文本标记语言,它是一种标记语言。它包括一系列标签,可以统一网络上文档的格式,将分散的互联网资源连接成一个逻辑整体。

html5游戏实际上是js游戏,认同吗?为什么还要叫h5游戏?h4加js不能做h5游戏的效果吗?

H5是个标准,只要符合H5标准的都可以叫H5,用H4加JS做出来的H5标准可以运行,自然叫H5,问题是H4时代很多都做不了H5标准,所以才出一堆乱七八糟的浏览器插件.
JS是网络基础语言,不用JS用什么搞交互,用JS是为了能更好的运行网页,不使用H5,采用H4加JS也可以做游戏,问题是绕路会绕很多,比如,一个标签能解决的问题,使用H4加JS至少要百行代码,可能还需要插件才能运行. 代码多插件多,自然问题多出错多.性能也会下降.自然就被淘汰了.
canvas是个画布元素你可以看成是个容器,象上边说的,你也可以自定义元素,只是,是否会比canvas稳定就不一定了.
还有制作游戏和用什么其实没什么关系,游戏代码其实并不复杂,但是引擎开发就那么几家是因为稳定和责任.游戏主要是策划占大头.代码反而是弱项.
要真想做游戏引擎,先要学基础理论和设计,实际游戏代码是为了更多人使用,所以也要考虑人性化,没人玩的游戏就不能叫游戏了.代码要精简,符合理论.至于是用C还是JS或P语言其实都一样,因为语言你只要查帮助都可以查到API,基础语言都是开源的.有一定流程懂理论,知道游戏该注重哪些,并接受别人和玩家意见才成.
就现在来说,游戏开发,有直接用游戏工具的,不需要代码,只要会策划游戏就可以,连角色背景都是软件内置,还有采用引擎来开发, 代码都是引擎开发公司在做,策划和美术只要看帮助就可以使用.
不然游戏崩了,你作为项目负责人是需要负责的,出问题赔钱,出事故坐牢,很简单,这个也是为什么都不自己开发引擎的原因.追问学习了。尽管有些观点我并不认同,但说得十分中肯,已采纳。

html5游戏实际上是js游戏,认同吗?为什么还要叫h5游戏?h4加js不能做h5游戏的效果吗?

H5是个标准,只要符合H5标准的都可以叫H5,用H4加JS做出来的H5标准可以运行,自然叫H5,问题是H4时代很多都做不了H5标准,所以才出一堆乱七八糟的浏览器插件.
JS是网络基础语言,不用JS用什么搞交互,用JS是为了能更好的运行网页,不使用H5,采用H4加JS也可以做游戏,问题是绕路会绕很多,比如,一个标签能解决的问题,使用H4加JS至少要百行代码,可能还需要插件才能运行. 代码多插件多,自然问题多出错多.性能也会下降.自然就被淘汰了.
canvas是个画布元素你可以看成是个容器,象上边说的,你也可以自定义元素,只是,是否会比canvas稳定就不一定了.
还有制作游戏和用什么其实没什么关系,游戏代码其实并不复杂,但是引擎开发就那么几家是因为稳定和责任.游戏主要是策划占大头.代码反而是弱项.
要真想做游戏引擎,先要学基础理论和设计,实际游戏代码是为了更多人使用,所以也要考虑人性化,没人玩的游戏就不能叫游戏了.代码要精简,符合理论.至于是用C还是JS或P语言其实都一样,因为语言你只要查帮助都可以查到API,基础语言都是开源的.有一定流程懂理论,知道游戏该注重哪些,并接受别人和玩家意见才成.
就现在来说,游戏开发,有直接用游戏工具的,不需要代码,只要会策划游戏就可以,连角色背景都是软件内置,还有采用引擎来开发, 代码都是引擎开发公司在做,策划和美术只要看帮助就可以使用.
不然游戏崩了,你作为项目负责人是需要负责的,出问题赔钱,出事故坐牢,很简单,这个也是为什么都不自己开发引擎的原因.追问学习了。尽管有些观点我并不认同,但说得十分中肯,已采纳。

谁能给我一个C语言四五百行的程序代码,结业设计用

//学生信息管理系统
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char num[20];
char name[20];
int score1;
int score2;
int score3;
}stu[100]={"01","zhangmingming",67,78,82,"02","lichengyou",78,91,88,"03","zhanghuican",68,82,56,"04","wanglu",56,45,77,"05","chendongming",67,38,47};
int main()
{
int i;
int s=5;
void cjtj();
void xxwh();
void xxcx();
void cjpx();
FILE *fp1;
if((fp1=fopen("stu_list","w"))==NULL) /*以只写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),5,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
do
{
printf("\n");
printf("\n");
printf(" +--------------------+\n");
printf(" |欢迎使用学生管理系统|\n");
printf(" | |\n");
printf(" | 请按照步骤操作 |\n");
printf(" | 1.信息维护 |\n");
printf(" | 2.信息查询 |\n");
printf(" | 3.成绩统计 |\n");
printf(" | 4.成绩排序 |\n");
printf(" | 0.退出程序 |\n");
printf(" +--------------------+\n");
printf(" 请选择您要进行的操作:");
scanf("%d",&i);
if(i==1)
{
xxwh();
}
else if(i==2)
{
xxcx();
}
else if(i==3)
{
cjtj();
}
else if(i==4)
{
cjpx();
}
else
break;
}while(i!=0);
printf("谢谢使用!\n");
return 0;
}
void cjtj() /*成绩统计子函数*/
{
char name[20];
system("cls");
printf("请输入您想统计的课程名称:\n");
scanf("%s",name);
int q,w,u,s,g,p,k,l,m;
if(strcmp(name,"yuwen")==0)
{
printf("请输入您想统计的分数段(例60,70):\n");
scanf("%d,%d",&q,&w);

for(u=0;u<5;u++)
{
if((stu[u].score1>=q)&&(stu[u].score1<=w))
printf("%s %s %d %d %d\n",stu[u].num,stu[u].name,stu[u].score1,stu[u].score2,stu[u].score3);
}
}
if(strcmp(name,"shuxue")==0)
{
printf("请输入您想统计的分数段(例60,70):\n");
scanf("%d,%d",&s,&g);
for(p=0;p<5;p++)
{
if(stu[p].score2>=s&&g>=stu[p].score2)
printf("%s %s %d %d %d\n",stu[p].num,stu[p].name,stu[p].score1,stu[p].score2,stu[p].score3);
}
}
if(strcmp(name,"yingyu")==0)
{
printf("请输入您想统计的分数段(例60,70):\n");
scanf("%d,%d",&k,&l);
for(m=0;m<5;m++)
{
if(stu[m].score3>=k&&stu[m].score3<=l)
printf("%s %s %d %d %d\n",stu[m].num,stu[m].name,stu[m].score1,stu[m].score2,stu[m].score3);
}
}

return;
}
void xxwh() /* 信息维护子函数*/
{
int y;
int s=5;
void zengjia();
void shanjian();
void xiugai();
do
{
printf(" --------------------\n");
printf(" 欢迎进入信息维护模块\n");
printf(" 1.增加学生信息 \n");
printf(" 2.删减学生信息 \n");
printf(" 3.修改学生信息 \n");
printf(" 4.退出本模块 \n");
printf(" --------------------\n");
printf(" 请输入您要进行的操作(1-4):");
scanf("%d",&y);
if(y==1)
{
zengjia();
s=s+1;
}
else if(y==2)
{
shanjian();
s=s-1;
}
else if(y==3)
{
xiugai();
}
else
break;
}while(y!=4);
printf("谢谢使用!\n");
return;
}
void zengjia() /*增加学生信息*/
{
struct student student1;
FILE *fp1;
int n=5;
printf("输入您想添加的学生信息:\n");
scanf("%s %s%d%d%d",student1.num,student1.name,&student1.score1,&student1.score2,&student1.score3);
strcpy(stu[n+1].num,student1.num);
strcpy(stu[n+1].name,student1.name);
stu[n+1].score1=student1.score1;
stu[n+1].score2=student1.score2;
stu[n+1].score3=student1.score3;
if((fp1=fopen("stu_list","r+"))==NULL) /*以读写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),6,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
printf("\n");
printf("添加成功!\n");
printf("\n");
printf("\n");
return;
}
void shanjian() /*删除学生信息*/
{
char a[20];
int h,j,e;
FILE *fp1;
printf("请输入您想删除的学生学号:\n");
scanf("%s",a);
for(h=0;h<5;h++)
{
if(strcmp(a,stu[h].num)==0)
j=h;
}
if(j!=4)
{
for(e=h-1;e<5;e++,j++)
{
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j].name,stu[j+1].name);
stu[j].score1=stu[j+1].score1;
stu[j].score2=stu[j+1].score2;
stu[j].score3=stu[j+1].score3;
}
}
if((fp1=fopen("stu_list","r+"))==NULL) /*以读写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),6,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
printf("\n");
printf("删除成功!\n");
printf("\n");
printf("\n");
return;
}
void xiugai() /*修改学生信息*/
{
char b[20];
int c,n=5;
FILE *fp1;
struct student student2;
printf("请输入您想修改的学生学号:\n");
scanf("%s",b);
for(c=0;c<n;c++)
{
if(strcmp(b,stu[c].num)==0)
{
printf("请输入修改后的学生信息:\n");
scanf("%s %s%d%d%d",student2.num,student2.name,&student2.score1,&student2.score2,&student2.score3);
strcpy(stu[c].num,student2.num);
strcpy(stu[c].name,student2.name);
stu[c].score1=student2.score1;
stu[c].score2=student2.score2;
stu[c].score3=student2.score3;
}
}if((fp1=fopen("stu_list","r+"))==NULL) /*以读写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),6,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
fclose(fp1);
printf("\n");
printf("修改成功!\n");
printf("\n");
printf("\n");
return;
}
void cjpx() /*排序函数*/
{
int z,x,c,v,o;
struct student t;
do
{
printf("\n");
printf("\n");
printf("[1]按升序排序:\n");
printf("[2]按降序排序:\n");
printf("[3]返回\n");
printf("请选择:");
scanf("%d",&z);
if(z==1)
{
printf("选择的科目:");
printf("[1]语文:[2]数学:[3]英语:");
scanf("%d",&x);
if(x==1)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)

if(stu[v].score1>stu[v+1].score1)
{
t=stu[v];
stu[v]=stu[v+1];
stu[v+1]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else if(x==2)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)
if(stu[v].score2>stu[v+1].score2)
{
t=stu[v];
stu[v]=stu[v+1];
stu[v+1]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else if(x==3)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)
if(stu[v].score3>stu[v+1].score3)
{
t=stu[v];
stu[v]=stu[v+1];
stu[v+1]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
}
else
if(z==2)
{
printf("选择的科目:");
printf("[1]语文:[2]数学:[3]英语:");
scanf("%d",&x);
if(x==1)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)
if(stu[v].score1<stu[v+1].score1)
{
t=stu[v+1];
stu[v+1]=stu[v];
stu[v]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else
if(x==2)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)

if(stu[v].score2<stu[v+1].score2)
{
t=stu[v+1];
stu[v+1]=stu[v];
stu[v]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else
if(x==3)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;c++)

if(stu[v].score3<stu[v+1].score3)
{
t=stu[v+1];
stu[v+1]=stu[v];
stu[v]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
}
else
break;
}while(z!=3);
printf("\n");
printf("\n");
return;
}
void xxcx() /*信息查询子函数*/
{
int g,i;
char m[20];
system("cls");
do
{
printf("[1]查询学生信息:\n");
printf("[2]退出查询:\n");
printf("请选择:");
scanf("%d",&g);
if(g==1)
{
printf("请输入学号:");
scanf("%s",m);
for(i=0;i<5;i++)
{
if(strcmp(m,stu[i].num)==0)
{
printf("*********\n");
printf("学号:%s\n",stu[i].num);
printf("姓名:%s\n",stu[i].name);
printf("语文:%d\n",stu[i].score1);
printf("数学:%d\n",stu[i].score2);
printf("英语:%d\n",stu[i].score3);
printf("\n");
printf("\n");
}
}
}
else
break;
}while(g!=2);
printf("查找完毕!\n");
system("pause");
return;
}

谁能给我一个C语言四五百行的程序代码,结业设计用

//学生信息管理系统
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char num[20];
char name[20];
int score1;
int score2;
int score3;
}stu[100]={"01","zhangmingming",67,78,82,"02","lichengyou",78,91,88,"03","zhanghuican",68,82,56,"04","wanglu",56,45,77,"05","chendongming",67,38,47};
int main()
{
int i;
int s=5;
void cjtj();
void xxwh();
void xxcx();
void cjpx();
FILE *fp1;
if((fp1=fopen("stu_list","w"))==NULL) /*以只写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),5,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
do
{
printf("\n");
printf("\n");
printf(" +--------------------+\n");
printf(" |欢迎使用学生管理系统|\n");
printf(" | |\n");
printf(" | 请按照步骤操作 |\n");
printf(" | 1.信息维护 |\n");
printf(" | 2.信息查询 |\n");
printf(" | 3.成绩统计 |\n");
printf(" | 4.成绩排序 |\n");
printf(" | 0.退出程序 |\n");
printf(" +--------------------+\n");
printf(" 请选择您要进行的操作:");
scanf("%d",&i);
if(i==1)
{
xxwh();
}
else if(i==2)
{
xxcx();
}
else if(i==3)
{
cjtj();
}
else if(i==4)
{
cjpx();
}
else
break;
}while(i!=0);
printf("谢谢使用!\n");
return 0;
}
void cjtj() /*成绩统计子函数*/
{
char name[20];
system("cls");
printf("请输入您想统计的课程名称:\n");
scanf("%s",name);
int q,w,u,s,g,p,k,l,m;
if(strcmp(name,"yuwen")==0)
{
printf("请输入您想统计的分数段(例60,70):\n");
scanf("%d,%d",&q,&w);

for(u=0;u<5;u++)
{
if((stu[u].score1>=q)&&(stu[u].score1<=w))
printf("%s %s %d %d %d\n",stu[u].num,stu[u].name,stu[u].score1,stu[u].score2,stu[u].score3);
}
}
if(strcmp(name,"shuxue")==0)
{
printf("请输入您想统计的分数段(例60,70):\n");
scanf("%d,%d",&s,&g);
for(p=0;p<5;p++)
{
if(stu[p].score2>=s&&g>=stu[p].score2)
printf("%s %s %d %d %d\n",stu[p].num,stu[p].name,stu[p].score1,stu[p].score2,stu[p].score3);
}
}
if(strcmp(name,"yingyu")==0)
{
printf("请输入您想统计的分数段(例60,70):\n");
scanf("%d,%d",&k,&l);
for(m=0;m<5;m++)
{
if(stu[m].score3>=k&&stu[m].score3<=l)
printf("%s %s %d %d %d\n",stu[m].num,stu[m].name,stu[m].score1,stu[m].score2,stu[m].score3);
}
}

return;
}
void xxwh() /* 信息维护子函数*/
{
int y;
int s=5;
void zengjia();
void shanjian();
void xiugai();
do
{
printf(" --------------------\n");
printf(" 欢迎进入信息维护模块\n");
printf(" 1.增加学生信息 \n");
printf(" 2.删减学生信息 \n");
printf(" 3.修改学生信息 \n");
printf(" 4.退出本模块 \n");
printf(" --------------------\n");
printf(" 请输入您要进行的操作(1-4):");
scanf("%d",&y);
if(y==1)
{
zengjia();
s=s+1;
}
else if(y==2)
{
shanjian();
s=s-1;
}
else if(y==3)
{
xiugai();
}
else
break;
}while(y!=4);
printf("谢谢使用!\n");
return;
}
void zengjia() /*增加学生信息*/
{
struct student student1;
FILE *fp1;
int n=5;
printf("输入您想添加的学生信息:\n");
scanf("%s %s%d%d%d",student1.num,student1.name,&student1.score1,&student1.score2,&student1.score3);
strcpy(stu[n+1].num,student1.num);
strcpy(stu[n+1].name,student1.name);
stu[n+1].score1=student1.score1;
stu[n+1].score2=student1.score2;
stu[n+1].score3=student1.score3;
if((fp1=fopen("stu_list","r+"))==NULL) /*以读写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),6,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
printf("\n");
printf("添加成功!\n");
printf("\n");
printf("\n");
return;
}
void shanjian() /*删除学生信息*/
{
char a[20];
int h,j,e;
FILE *fp1;
printf("请输入您想删除的学生学号:\n");
scanf("%s",a);
for(h=0;h<5;h++)
{
if(strcmp(a,stu[h].num)==0)
j=h;
}
if(j!=4)
{
for(e=h-1;e<5;e++,j++)
{
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j].name,stu[j+1].name);
stu[j].score1=stu[j+1].score1;
stu[j].score2=stu[j+1].score2;
stu[j].score3=stu[j+1].score3;
}
}
if((fp1=fopen("stu_list","r+"))==NULL) /*以读写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),6,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
printf("\n");
printf("删除成功!\n");
printf("\n");
printf("\n");
return;
}
void xiugai() /*修改学生信息*/
{
char b[20];
int c,n=5;
FILE *fp1;
struct student student2;
printf("请输入您想修改的学生学号:\n");
scanf("%s",b);
for(c=0;c<n;c++)
{
if(strcmp(b,stu[c].num)==0)
{
printf("请输入修改后的学生信息:\n");
scanf("%s %s%d%d%d",student2.num,student2.name,&student2.score1,&student2.score2,&student2.score3);
strcpy(stu[c].num,student2.num);
strcpy(stu[c].name,student2.name);
stu[c].score1=student2.score1;
stu[c].score2=student2.score2;
stu[c].score3=student2.score3;
}
}if((fp1=fopen("stu_list","r+"))==NULL) /*以读写的方式打开一个文件stu_list*/
{
printf("Can not open file!\n");
exit(1);
}
fwrite(&stu,sizeof(struct student),6,fp1); /*将stu中的数据写到文件中*/
fclose(fp1);
fclose(fp1);
printf("\n");
printf("修改成功!\n");
printf("\n");
printf("\n");
return;
}
void cjpx() /*排序函数*/
{
int z,x,c,v,o;
struct student t;
do
{
printf("\n");
printf("\n");
printf("[1]按升序排序:\n");
printf("[2]按降序排序:\n");
printf("[3]返回\n");
printf("请选择:");
scanf("%d",&z);
if(z==1)
{
printf("选择的科目:");
printf("[1]语文:[2]数学:[3]英语:");
scanf("%d",&x);
if(x==1)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)

if(stu[v].score1>stu[v+1].score1)
{
t=stu[v];
stu[v]=stu[v+1];
stu[v+1]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else if(x==2)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)
if(stu[v].score2>stu[v+1].score2)
{
t=stu[v];
stu[v]=stu[v+1];
stu[v+1]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else if(x==3)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)
if(stu[v].score3>stu[v+1].score3)
{
t=stu[v];
stu[v]=stu[v+1];
stu[v+1]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
}
else
if(z==2)
{
printf("选择的科目:");
printf("[1]语文:[2]数学:[3]英语:");
scanf("%d",&x);
if(x==1)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)
if(stu[v].score1<stu[v+1].score1)
{
t=stu[v+1];
stu[v+1]=stu[v];
stu[v]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else
if(x==2)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;v++)

if(stu[v].score2<stu[v+1].score2)
{
t=stu[v+1];
stu[v+1]=stu[v];
stu[v]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
else
if(x==3)
{
for(c=1;c<5;c++)
for(v=0;v<5-c;c++)

if(stu[v].score3<stu[v+1].score3)
{
t=stu[v+1];
stu[v+1]=stu[v];
stu[v]=t;
}
for(o=0;o<5;o++)
printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[o].score1,stu[o].score2,stu[o].score3);
}
}
else
break;
}while(z!=3);
printf("\n");
printf("\n");
return;
}
void xxcx() /*信息查询子函数*/
{
int g,i;
char m[20];
system("cls");
do
{
printf("[1]查询学生信息:\n");
printf("[2]退出查询:\n");
printf("请选择:");
scanf("%d",&g);
if(g==1)
{
printf("请输入学号:");
scanf("%s",m);
for(i=0;i<5;i++)
{
if(strcmp(m,stu[i].num)==0)
{
printf("*********\n");
printf("学号:%s\n",stu[i].num);
printf("姓名:%s\n",stu[i].name);
printf("语文:%d\n",stu[i].score1);
printf("数学:%d\n",stu[i].score2);
printf("英语:%d\n",stu[i].score3);
printf("\n");
printf("\n");
}
}
}
else
break;
}while(g!=2);
printf("查找完毕!\n");
system("pause");
return;
}

用C++编写的小游戏源代码

五子棋的代码:

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

usingnamespacestd;

constintN=15;         //15*15的棋盘

constcharChessBoardflag='';     //棋盘标志

constcharflag1='o';       //玩家1或电脑的棋子标志

constcharflag2='X';       //玩家2的棋子标志

typedefstructCoordinate     //坐标类

{  

intx;             //代表行

inty;             //代表列

}Coordinate;

classGoBang          //五子棋类

public:

GoBang()        //初始化

{

InitChessBoard();

}

voidPlay()        //下棋

{

CoordinatePos1;   //玩家1或电脑

CoordinatePos2;   //玩家2

intn=0;

while(1)

{

intmode=ChoiceMode();

while(1)

{

if(mode==1)    //电脑vs玩家

{

ComputerChess(Pos1,flag1);   //电脑下棋

if(GetVictory(Pos1,0,flag1)==1)   //0表示电脑,真表示获胜

break;

PlayChess(Pos2,2,flag2);   //玩家2下棋

if(GetVictory(Pos2,2,flag2))   //2表示玩家2

break;

}

else      //玩家1vs玩家2

{

PlayChess(Pos1,1,flag1);   //玩家1下棋

if(GetVictory(Pos1,1,flag1))   //1表示玩家1

break;

PlayChess(Pos2,2,flag2);   //玩家2下棋

if(GetVictory(Pos2,2,flag2)) //2表示玩家2

break;

}

}

cout<<"***再来一局***"<<endl;

cout<<"yorn:";

charc='y';

cin>>c;

if(c=='n')

break;

}    

}

protected:

intChoiceMode()      //选择模式

{

inti=0;

system("cls");    //系统调用,清屏

InitChessBoard();    //重新初始化棋盘

cout<<"***0、退出 1、电脑vs玩家 2、玩家vs玩家***"<<endl;

while(1)

{

cout<<"请选择:";

cin>>i;

if(i==0)     //选择0退出

exit(1);

if(i==1||i==2)

returni;

cout<<"输入不合法"<<endl;

}

}

voidInitChessBoard()   //初始化棋盘

{

for(inti=0;i<N+1;++i)    

{

for(intj=0;j<N+1;++j)

{

_ChessBoard[i][j]=ChessBoardflag;

}

}

}

voidPrintChessBoard()  //打印棋盘,这个函数可以自己调整

{

system("cls");        //系统调用,清空屏幕

for(inti=0;i<N+1;++i)

{

for(intj=0;j<N+1;++j)

{

if(i==0)                //打印列数字

{

if(j!=0)

printf("%d ",j);

else

printf("  ");

}

elseif(j==0)        //打印行数字

printf("%2d",i);

else

{

if(i<N+1)

{

printf("%c|",_ChessBoard[i][j]);

}

}

}

cout<<endl;

cout<<"  ";

for(intm=0;m<N;m++)

{

printf("--|");

}

cout<<endl;

}

}

voidPlayChess(Coordinate&pos,intplayer,intflag)    //玩家下棋

{

PrintChessBoard();     //打印棋盘

while(1)

{

printf("玩家%d输入坐标:",player);

cin>>pos.x>>pos.y;

if(JudgeValue(pos)==1)     //坐标合法

break;

cout<<"坐标不合法,重新输入"<<endl;

}

_ChessBoard[pos.x][pos.y]=flag;

}

voidComputerChess(Coordinate&pos,charflag)    //电脑下棋

{

PrintChessBoard();     //打印棋盘

intx=0;

inty=0;

while(1)

{

x=(rand()%N)+1;   //产生1~N的随机数

srand((unsignedint)time(NULL));

y=(rand()%N)+1;   //产生1~N的随机数

srand((unsignedint)time(NULL));

if(_ChessBoard[x][y]==ChessBoardflag)   //如果这个位置是空的,也就是没有棋子

break;

}

pos.x=x;

pos.y=y;

_ChessBoard[pos.x][pos.y]=flag;

}

intJudgeValue(constCoordinate&pos)    //判断输入坐标是不是合法

{

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

{

if(_ChessBoard[pos.x][pos.y]==ChessBoardflag)

{

return1;  //合法

}

}

return0;    //非法

}

intJudgeVictory(Coordinatepos,charflag)      //判断有没有人胜负(底层判断)

{

intbegin=0;

intend=0;

intbegin1=0;

intend1=0;

//判断行是否满足条件

(pos.y-4)>0?begin=(pos.y-4):begin=1;

(pos.y+4)>N?end=N:end=(pos.y+4);

for(inti=pos.x,j=begin;j+4<=end;j++)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i][j+1]==flag&&

_ChessBoard[i][j+2]==flag&&_ChessBoard[i][j+3]==flag&&

_ChessBoard[i][j+4]==flag)

return1;

}

//判断列是否满足条件

(pos.x-4)>0?begin=(pos.x-4):begin=1;

(pos.x+4)>N?end=N:end=(pos.x+4);

for(intj=pos.y,i=begin;i+4<=end;i++)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j]==flag&&

_ChessBoard[i+2][j]==flag&&_ChessBoard[i+3][j]==flag&&

_ChessBoard[i+4][j]==flag)

return1;

}

intlen=0;

//判断主对角线是否满足条件

pos.x>pos.y?len=pos.y-1:len=pos.x-1;

if(len>4)

len=4;

begin=pos.x-len;    //横坐标的起始位置

begin1=pos.y-len;   //纵坐标的起始位置

pos.x>pos.y?len=(N-pos.x):len=(N-pos.y);

if(len>4)

len=4;

end=pos.x+len;    //横坐标的结束位置

end1=pos.y+len;   //纵坐标的结束位置

for(inti=begin,j=begin1;(i+4<=end)&&(j+4<=end1);++i,++j)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j+1]==flag&&

_ChessBoard[i+2][j+2]==flag&&_ChessBoard[i+3][j+3]==flag&&

_ChessBoard[i+4][j+4]==flag)

return1;

}

//判断副对角线是否满足条件

(pos.x-1)>(N-pos.y)?len=(N-pos.y):len=pos.x-1;

if(len>4)

len=4;

begin=pos.x-len;    //横坐标的起始位置

begin1=pos.y+len;   //纵坐标的起始位置

(N-pos.x)>(pos.y-1)?len=(pos.y-1):len=(N-pos.x);

if(len>4)

len=4;

end=pos.x+len;    //横坐标的结束位置

end1=pos.y-len;   //纵坐标的结束位置

for(inti=begin,j=begin1;(i+4<=end)&&(j-4>=end1);++i,--j)

{

if(_ChessBoard[i][j]==flag&&_ChessBoard[i+1][j-1]==flag&&

_ChessBoard[i+2][j-2]==flag&&_ChessBoard[i+3][j-3]==flag&&

_ChessBoard[i+4][j-4]==flag)

return1;

}

for(inti=1;i<N+1;++i)      //棋盘有没有下满

{

for(intj=1;j<N+1;++j)

{

if(_ChessBoard[i][j]==ChessBoardflag)

return0;           //0表示棋盘没满

}

return-1;   //和棋

}

boolGetVictory(Coordinate&pos,intplayer,intflag)  //对JudgeVictory的一层封装,得到具体那个玩家获胜

{

intn=JudgeVictory(pos,flag);  //判断有没有人获胜

if(n!=0)          //有人获胜,0表示没有人获胜

{

PrintChessBoard();

if(n==1)        //有玩家赢棋

{

if(player==0)   //0表示电脑获胜,1表示玩家1,2表示玩家2

printf("***电脑获胜***n");

else

printf("***恭喜玩家%d获胜***n",player);

}

else

printf("***双方和棋***n");

returntrue;   //已经有人获胜

}

returnfalse;  //没有人获胜

}

private:

char_ChessBoard[N+1][N+1];    

};

扩展资料:

设计思路

1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。

2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。

3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。

莱芜美食还为您提供以下相关内容希望对您有帮助:

用C++编写的小游戏源代码

五子棋的代码:include&lt;iostream&gt; include&lt;stdio.h&gt; include&lt;stdlib.h&gt; include &lt;time.h&gt; using namespace std;const int N=15; //15*15的棋盘 const char ChessBoardflag = ' '; //棋盘标志 const char flag...

请用所学的C语言实现一个命令行下的五子棋游戏。要求有棋盘界面,并实现...

for(i = 0 ; x + i &lt; 20 &amp;&amp; y - i - 2 &gt;= 0 &amp;&amp; i &lt; 5;i ++) { if(qipan[y-i-2][x+i] != 'o') break; if(qipan[y-i-2][x+i] == 'o') num4++; } for(i = 0 ; y + i &lt; 20 &amp;&amp; x...

谁能给我一个C语言四五百行的程序代码,结业设计用

for(c=1;c&lt;5;c++)for(v=0;v&lt;5-c;v++)if(stu[v].score2&lt;stu[v+1].score2){t=stu[v+1];stu[v+1]=stu[v];stu[v]=t;}for(o=0;o&lt;5;o++)printf("%s %s %d %d %d\n",stu[o].num,stu[o].name,stu[...

HTML是什么??

HTML的全称是超文本标记语言,是一种标记语言。它包括一系列标签,可以统一网络上文档的格式,将分散的互联网资源连接成一个逻辑整体。HTML是由HTML命令组成的描述性文本,可以解释文字、图形、动画、声音、表格、链接等。Html...

html5游戏实际上是js游戏,认同吗?为什么还要叫h5游戏?h4加js不能做h5...

canvas是个画布元素你可以看成是个容器,象上边说的,你也可以自定义元素,只是,是否会比canvas稳定就不一定了.还有制作游戏和用什么其实没什么关系,游戏代码其实并不复杂,但是引擎开发就那么几家是因为稳定和责任.游戏主要是...

Top