哪些网站可以做详情页洛阳做家教去什么网站
web/
2025/10/3 15:21:14/
文章来源:
哪些网站可以做详情页,洛阳做家教去什么网站,wordpress主题在那个目录,网站模板下载简单的那种目录
前言
一、游戏规则
1.功能分析
2.玩法分析
3.胜负判定条件
二、游戏实现思路
三、代码实现与函数封装
1.项目文件创建
2.头文件说明
3.函数封装
1#xff09;菜单实现 2#xff09;进度条实现 3#xff09;main函数实现 4#xff09;Game函数 5#xff0…目录
前言
一、游戏规则
1.功能分析
2.玩法分析
3.胜负判定条件
二、游戏实现思路
三、代码实现与函数封装
1.项目文件创建
2.头文件说明
3.函数封装
1菜单实现 2进度条实现 3main函数实现 4Game函数 5ShowBoard函数实现
6PlayerMove函数实现
7ChessCount函数实现 8IsOver函数实现
四、源码分享
1.main.c
2.ProBar.h 3.probar.c
4.game.h
5.game.c
总结 前言
五子棋又称连珠棋是一种双人对弈的棋类游戏。游戏目标是在一个棋盘上通过在横、竖、斜线上依次放置棋子使自己的五个棋子连成一线即横线、竖线或斜线且无被对手堵住的空位从而获胜。
实现简单的五子棋游戏需要有二维数组、函数调用等知识。本项目代码量大致为两三百行。
一、游戏规则 1.功能分析
五子棋的功能比较简单只有黑棋落子和白棋落子有些五子棋还有悔棋功能、显示胜率、记录走的步数等功能但是初学时可以只实现简单的落子功能即可。
2.玩法分析
由黑棋先走鼠标左击即可落子然后轮到白棋回合如此循环直到游戏结束。
3.胜负判定条件
五子棋的棋盘通常为15×15的格子双方轮流在空位上放置自己的棋子先连成五子的一方获胜。如果棋盘填满但没有五子连成一线游戏结束为平局。
二、游戏实现思路
使用坐标输入代替鼠标点击坐标应该符合人们使用习惯从1开始【鼠标左击】功能若有人胜利提示胜利方为谁并结束游戏若无人胜利且棋盘未满提示继续若棋盘已满提示平局实现清屏功能每次落完子之后刷新屏幕可以加入进度条在游戏开始时展示。
三、代码实现与函数封装
1.项目文件创建
将源代码分为五个文件两个头文件(.h)用于声明函数分别声明进度条和游戏函数
三个源文件(.c)两个用于写函数体实现进度条和游戏主体一个为主函数调用函数。 2.头文件说明
1.为了防止在项目中多次申明同一个头文件需要加入防重复判断语句
#pragma once 2.头文件中可以直接引用需要的标准库然后在源文件中只需要引用自己写的头文件即可
#include game.h
#include ProBar.h
3.函数封装
棋盘设置为15×15且可更改方便之后的更改。
1菜单实现
void Menu()
{printf(#########################\n);printf(### 1.Play 0.Exit ###\n);printf(#########################\n);printf(Please Select: );
} 2进度条实现
\r使光标每次回到开头的位置使用fflush函数刷新输出界面并使用usleep函数进行延迟达到很好的效果。
#define NUM 100void process_bar()
{char bar[NUM1];memset(bar, \0, sizeof(bar));const char* lable |/-\\;int i 0;while(i NUM){printf(Load...[%-100s][%-3d%%][%c]\r, bar, i, lable[i%4]);fflush(stdout);bar[i] #;usleep(10000);}printf(\n);
} 3main函数实现
使用quit变量来控制循环的退出
Game函数实现游戏的主体。
int main()
{int quit 0;int select 0;while(!quit){Menu();scanf(%d, select);switch(select){case 1:process_bar();Game();break;case 0:quit 1;printf(Exit Success!\n);break;defualt :printf(Enter Error, Try Again!\n);break;}}return 0;
} 4Game函数
建立棋盘使用memset函数初始化棋盘do...while执行游戏运行IsOver函数判断游戏是否结束PlayerMove函数玩家走一步棋Showboard 打印出棋盘switch...case 显示出游戏结果。
#define ROW 20
#define COL 20#define PLAYER1 1
#define PLAYER2 2#define NEXT 0
#define PLAYER1_WIN 1
#define PLAYER2_WIN 2
#define DRAW 3void Game()
{int board[ROW][COL];memset(board, \0, sizeof(board));int result NEXT;do{ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER1);result IsOver(board, ROW, COL);if(NEXT ! result){break;}ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER2);result IsOver(board, ROW, COL);if(NEXT ! result){break;}}while(1);//p1 win , p2 win, drawShowBoard(board, ROW, COL);switch(result){case PLAYER1_WIN:printf(congratulate Player1, you win!\n);break;case PLAYER2_WIN:printf(congratulate player2, you win!\n);break;case DRAW:printf(draw!\n);break;default:break;}
} 5ShowBoard函数实现
刷新屏幕 printf(\033c); void ShowBoard(int board[ROW][COL], int row, int col)
{//clear screen//printf(\e[1;1H\e[2J)]]);//printf( );printf(\033c);printf(\n\n );for(int i0; icol; i){printf(%3d, i1);}printf(\n);for(int i0; irow; i){printf(%2d , i1);for(int j0; jcol; j){if(board[i][j] 0){printf( . );}else if(board[i][j] PLAYER1){printf( x );}else{printf( o );}}printf(\n);}
}
6PlayerMove函数实现 int x 0; int y 0; 设置为全局变量由用户输入从1开始 int x 0;
int y 0;void PlayerMove(int board[ROW][COL], int row, int col, int player)
{while(1){printf(\nPlayer[%d] Please Enter Your Pos:, player);scanf(%d %d, x, y);//判断合法坐标if(x1 || x row || y1 || ycol){printf(Pos is not right!\n);continue;}else if(board[x-1][y-1] ! 0){printf(Pos is occpuied!\n);continue;}else{board[x-1][y-1] player;//谁落子就放置谁的数据break;}}
}
7ChessCount函数实现
要判断是否继续下棋需要判断是否已经五子连珠就需要数下的这个子周围有没有出现五子连珠由于每次下棋都会判断一次所以不会出现漏判的情况。
enum Dir
{LEFT,RIGHT,UP,DOWN,LEFT_UP,LEFT_DOWN,RIGHT_UP,RIGHT_DOWN
};int ChessCount(int board[ROW][COL], int row, int col, enum Dir d)
{int _x x-1;int _y y-1;int count 0;while(1){switch(d){case LEFT:_y--;break;case RIGHT:_y;break;case UP:_x--;break;case DOWN:_x;break;case LEFT_UP:_x--;_y--;break;case LEFT_DOWN:_x;_y--;break;case RIGHT_UP:_x--, _y;break;case RIGHT_DOWN:_x, _y;break;default://Do nothingbreak;}if(_x0 || _xrow-1 || _y0 || _y col-1){break;}if(board[x-1][y-1] board[_x][_y]){count;}else{break;}}return count;
} 8IsOver函数实现 任何落子位置都有八个方向所以判定五子连珠本质是判定1,5方向之和2,6方向之和37方向之和4,8方向 之和其中任意一个出现相同的连续五个棋子即游戏结束
int IsOver(int board[ROW][COL], int row, int col)
{//注意每次统计的时候都没有统计当前节点需要单独1int count1 ChessCount(board, row, col, LEFT) ChessCount(board, row, col, RIGHT) 1;int count2 ChessCount(board, row, col, UP) ChessCount(board, row, col, DOWN) 1;int count3 ChessCount(board, row, col, LEFT_UP) ChessCount(board, row, col, RIGHT_DOWN) 1;int count4 ChessCount(board, row, col, LEFT_DOWN) ChessCount(board, row, col, RIGHT_UP) 1;if(count1 5 || count25 || count35 || count45){//谁赢返回谁//return board[x-1][y-1];if(board[x-1][y-1] PLAYER1){return PLAYER1_WIN;}else{return PLAYER2_WIN;}}for(int i0; irow; i){for(int j0; jcol; j){if(board[i][j] 0){//棋盘未满返回继续return NEXT;}}}//棋盘已满且没人赢返回平局return DRAW;
}
四、源码分享
1.main.c
#include game.h
#include ProBar.hint main()
{int quit 0;int select 0;while(!quit){Menu();scanf(%d, select);switch(select){case 1:process_bar();Game();break;case 0:quit 1;printf(Exit Success!\n);break;defualt :printf(Enter Error, Try Again!\n);break;}}return 0;
}2.ProBar.h
#pragma once #include stdio.h
#include unistd.h
#include string.h#define NUM 100void process_bar(); 3.probar.c
#include ProBar.hvoid process_bar()
{char bar[NUM1];memset(bar, \0, sizeof(bar));const char* lable |/-\\;int i 0;while(i NUM){printf(Load...[%-100s][%-3d%%][%c]\r, bar, i, lable[i%4]);fflush(stdout);bar[i] #;usleep(10000);}printf(\n);
}4.game.h
#include string.h
#include stdlib.h#define ROW 20
#define COL 20#define PLAYER1 1
#define PLAYER2 2#define NEXT 0
#define PLAYER1_WIN 1
#define PLAYER2_WIN 2
#define DRAW 3enum Dir
{LEFT,RIGHT,UP,DOWN,LEFT_UP,LEFT_DOWN,RIGHT_UP,RIGHT_DOWN
};void Menu();
void Game();int IsOver(int board[ROW][COL], int row, int col);
void ShowBoard(int board[ROW][COL], int row, int col);
int ChessCount(int board[ROW][COL], int row, int col, enum Dir d);
void Playermove(int board[ROW][COL], int row, int col, int player);
5.game.c
#include game.h
#include ProBar.h
int x 0;
int y 0;void Menu()
{printf(#########################\n);printf(### 1.Play 0.Exit ###\n);printf(#########################\n);printf(Please Select: );
}//four possbilities:
//NEXT: continue
//1: 1 win
//2: 2 win
//3: draw
int IsOver(int board[ROW][COL], int row, int col)
{//import hard//wu zi lian zhuint count1 ChessCount(board, row, col, LEFT) ChessCount(board, row, col, RIGHT) 1;int count2 ChessCount(board, row, col, UP) ChessCount(board, row, col, DOWN) 1;int count3 ChessCount(board, row, col, LEFT_UP) ChessCount(board, row, col, RIGHT_DOWN) 1;int count4 ChessCount(board, row, col, LEFT_DOWN) ChessCount(board, row, col, RIGHT_UP) 1;if(count1 5 || count25 || count35 || count45){//return board[x-1][y-1];if(board[x-1][y-1] PLAYER1){return PLAYER1_WIN;}else{return PLAYER2_WIN;}}for(int i0; irow; i){for(int j0; jcol; j){if(board[i][j] 0){return NEXT;}}}return DRAW;
}int ChessCount(int board[ROW][COL], int row, int col, enum Dir d)
{int _x x-1;int _y y-1;int count 0;while(1){switch(d){case LEFT:_y--;break;case RIGHT:_y;break;case UP:_x--;break;case DOWN:_x;break;case LEFT_UP:_x--;_y--;break;case LEFT_DOWN:_x;_y--;break;case RIGHT_UP:_x--, _y;break;case RIGHT_DOWN:_x, _y;break;default://Do nothingbreak;}if(_x0 || _xrow-1 || _y0 || _y col-1){break;}if(board[x-1][y-1] board[_x][_y]){count;}else{break;}}return count;
}void ShowBoard(int board[ROW][COL], int row, int col)
{//clear screen//printf(\e[1;1H\e[2J)]]);//printf( );printf(\033c);printf(\n\n );for(int i0; icol; i){printf(%3d, i1);}printf(\n);for(int i0; irow; i){printf(%2d , i1);for(int j0; jcol; j){if(board[i][j] 0){printf( . );}else if(board[i][j] PLAYER1){printf( x );}else{printf( o );}}printf(\n);}
}void PlayerMove(int board[ROW][COL], int row, int col, int player)
{while(1){printf(\nPlayer[%d] Please Enter Your Pos:, player);scanf(%d %d, x, y);if(x1 || x row || y1 || ycol){printf(Pos is not right!\n);continue;}else if(board[x-1][y-1] ! 0){printf(Pos is occpuied!\n);continue;}else{board[x-1][y-1] player;break;}}
}void Game()
{int board[ROW][COL];memset(board, \0, sizeof(board));int result NEXT;do{ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER1);result IsOver(board, ROW, COL);if(NEXT ! result){break;}ShowBoard(board, ROW, COL);PlayerMove(board, ROW, COL, PLAYER2);result IsOver(board, ROW, COL);if(NEXT ! result){break;}}while(1);//p1 win , p2 win, drawShowBoard(board, ROW, COL);switch(result){case PLAYER1_WIN:printf(congratulate Player1, you win!\n);break;case PLAYER2_WIN:printf(congratulate player2, you win!\n);break;case DRAW:printf(draw!\n);break;default:break;}
}
总结
实际上这个版本还是一个非常简易的版本在之后学习到别的模块之后可以对这个项目再进行改进比如可以尝试以下功能
人机对战功能扩展颜色提示步数记录先手随机交换等网络版本
码云Gitee项目链接GoBangGame · Kevin Ray/LinuxPractice - 码云 - 开源中国 (gitee.com)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86283.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!