一.开发思路以及游戏框架设计:
1.游戏的菜单打印
2.游戏棋盘的打印
3.开始游戏
4.判断输赢
二. 开发及代码优化细节
1)打印菜单
VS上创建好项目后,我们需要添加2个源文件和1个头文件
test.c-------------------------用于测试三子棋游戏
game.c----------------------用于游戏函数的实现
game.h----------------------用于游戏函数的声明
voidmenu(){ printf("------------------------\n"); printf("------------------------\n"); printf("---------1.paly---------\n"); printf("---------0.exit---------\n"); printf("------------------------\n"); printf("------------------------\n"); } voidgame() { } intmain() { intinput=0; do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case1: game(); break; case0: printf("退出游戏:\n"); break; default: printf("选择错误,重新选择:\n"); break; } } while (input); return0; }
注:此代码适用于简单的小游戏开发(菜单打印),每个游戏的实现逻辑都不一样,上面代码的game函数用于游戏实现逻辑的封装,代码实现如下:
2)游戏棋盘的打印及代码优化
为了帮助大家理解,这是运行以后的界面,由.exe文件执行结果界面可知,棋盘的实现是一个3x3的网格状,落子的位置由坐标去实现,玩家下棋用( * )代替,电脑下棋用(#)代替,所以我们需要创建一个字符型二维数组来存放玩家和电脑输入的字符,接下来就是棋盘打印的实现了:
为了使代码的效率更高,我们选择用宏定义来控制数组的行和列:
#define COL 3
#define ROW 3
棋盘打印代码如下
voidgame() { charboard[ROW][COL] = { 0 }; //数组初始化为0display_board(board, ROW, COL); //创建打印棋盘的函数,分别用数组名,行数,列数作为三个参数去调用}
voiddisplay_board(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { //存放数据printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); //打印---|---|---if(i<row-1) printf("---|---|---\n"); } }
运行:
Tips:打印的棋盘与预期不太符合,原因是我们给数组初始化的时候设置为0,所以我们需要给此代码进行优化
优化:写一个初始化函数,确保二维数组里存放的是空格字符,代码如下:
voidinit_board(charboard[ROW][COL], introw, intcol) { inti=0; intj=0; for (i=0; i<row; i++) { for (j=0; j<col; j++) { board[i][j] =' '; } } }
二次优化代码(动态控制棋盘):
voiddisplay_board(charboard[ROW][COL], introw, intcol) { inti=0; for (i=0; i<row; i++) { //存放数据//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);//打印---|---|---intj=0; for (j=0; j<col; j++) { printf(" %c ", board[i][j]); if (j<col-1) printf("|"); } printf("\n"); if(i<row-1) for (j=0; j<col; j++) { printf("---"); if (j<col-1) printf("|"); } printf("\n"); } }
到这里,棋盘的打印准备工作就已经完成了