c语言小程序之三子棋
2017-11-21 21:27
204 查看
第一次写这么长的程序,再此总结一下。
首先考虑test.c的功能:
1)main函数内实现一个游戏界面,用一个循环可以让游戏一直循环进行,并且再循环内部使用分支用来选择开始游戏or退出游戏。
2)写一个menu函数,作用是打印游戏菜单界面。
3)写一个game函数,主要在函数内部调用各个步骤的函数,实现一个玩游戏的过程,并且输出谁赢谁输。
game.c内部主要实现各个test.c里各个函数:
1)初始化棋盘,再次全部初始化为空格。(使用memset库函数)
2)展示即打印该棋盘。(其实就是利用循环将这个棋盘画出来)
3)玩家落子,在此落子之前需要判断该格子是否为空,为空才能下子,并且判断是否为非法坐标(即x,y都有限定范围)
4)电脑移动,设置一个随机数生成器,随机坐标在3*3以内随机落子,同上一步一样,每次落子之前需要判断该坐标是否为空。
5)判断输赢。即每一行都相等且不为空格(或每一列,或两个对角线)此时给一个返回值,建议再此用落在该坐标上的标志(即你下的棋子)作为返回值,在主函数内只需要判断返回值是你下的棋子还是电脑下的棋子就可以判断谁输谁赢了,此时还要判断平局的可能性。
在判断每行(每列,每个对角线)之后加一个对棋盘的判断,判断棋盘是否全满,全满才能有输家赢家之分。
附上代码(仅供参考):
说一下我在写这个程序时遇到的一些问题和总结到的经验。
首先再写之前应当构思我该写那些函数他们分别在那个.c文件中,最好拿纸笔记下来,函数名以及他们各自实现什么功能。
并且在写程序时应当从主函数main函数开始写,逐步一点点向外扩展。写函数主要是一个实现模块化的步骤,每个模块单独构思写出来就可以。但我在写程序时需要一些问题,我在写了部分函数之后,如果我想要测试一下他们的功能是否正确实现了呢?
还有一个来自初学者的建议,再写关于逻辑的判断语句时括号真的很重要….希望自己以后不要再犯这么低级的错误啦!
最后附上游戏截图:
首先考虑test.c的功能:
1)main函数内实现一个游戏界面,用一个循环可以让游戏一直循环进行,并且再循环内部使用分支用来选择开始游戏or退出游戏。
2)写一个menu函数,作用是打印游戏菜单界面。
3)写一个game函数,主要在函数内部调用各个步骤的函数,实现一个玩游戏的过程,并且输出谁赢谁输。
game.c内部主要实现各个test.c里各个函数:
1)初始化棋盘,再次全部初始化为空格。(使用memset库函数)
2)展示即打印该棋盘。(其实就是利用循环将这个棋盘画出来)
3)玩家落子,在此落子之前需要判断该格子是否为空,为空才能下子,并且判断是否为非法坐标(即x,y都有限定范围)
4)电脑移动,设置一个随机数生成器,随机坐标在3*3以内随机落子,同上一步一样,每次落子之前需要判断该坐标是否为空。
5)判断输赢。即每一行都相等且不为空格(或每一列,或两个对角线)此时给一个返回值,建议再此用落在该坐标上的标志(即你下的棋子)作为返回值,在主函数内只需要判断返回值是你下的棋子还是电脑下的棋子就可以判断谁输谁赢了,此时还要判断平局的可能性。
在判断每行(每列,每个对角线)之后加一个对棋盘的判断,判断棋盘是否全满,全满才能有输家赢家之分。
附上代码(仅供参考):
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "game.h" void menu() { printf("******************************\n"); printf("******欢迎来到三子棋游戏******\n"); printf("********1.开始游戏************\n"); printf("********0.退出游戏************\n"); printf("******************************\n"); } void game() { char board[ROWS][COLS]; char ret = Check_win(board, ROWS, COLS); Init_board(board, ROWS, COLS);//初始化棋盘 Display_board(board, ROWS, COLS);//展示该棋盘 srand((unsigned int)time(NULL));//随机数生成器 // while (1) { Player_move(board, ROWS, COLS);//玩家走 if((ret = Check_win(board, ROWS, COLS)) != ' ') break; Display_board(board, ROWS, COLS);//每走一步打印一次棋盘 Computer_move(board, ROWS, COLS);//电脑走 if ((ret = Check_win(board, ROWS, COLS)) != ' ') break; Display_board(board, ROWS, COLS);//每走一步打印一次棋盘 } if (ret == 'A') { printf("恭喜你!玩家获胜!\n"); } else if (ret == 'C') { printf("很遗憾!电脑获胜!\n"); } else if (ret == 'q') { printf("啊哦!平局了!\n"); } Display_board(board, ROWS, COLS); } int main() { int button = 0; do { menu(); printf("请选择>:"); scanf("%d", &button); switch (button) { case 1:game(); break; case 0: printf("退出游戏!"); break; default: printf("选择错误,请重新选择!"); break; } } while (button); system("pasue"); return 0; }
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void Init_board(char board[ROWS][COLS], int row, int col) { memset(board, ' ', col*row*sizeof(char));//数组全部初始化为空格 } void Display_board(char board[ROWS][COLS], int row, int col) { int i = 0, j = 0; for (i = 1; i <=row; i++) { printf(" %d ", i); } printf("\n"); for (i = 0; i < row; i++) { printf("%d", i+1); printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); if (i != 2) { printf(" ---|---|---\n"); } } } void Player_move(char board[ROWS][COLS], int row, int col) { int x = 0, y = 0; while (1) { printf("请输入坐标(x y):"); scanf("%d%d", &x, &y); x--; y--; if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2))) { if (board[x][y] == ' ') { board[x][y] = 'A'; break; } else { printf("该坐标已被占,请重新输入!"); } } else { printf("非法坐标!请重新输入!"); } } } void Computer_move(char board[ROWS][COLS], int row, int col) { while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = 'C'; break; } } } static int Is_Full(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1; } char Check_win(char board[ROWS][C b8f8 OLS], int row, int col) { int i = 0; for (i = 0; i < row; i++) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ')) { return board[i][1]; } } for (i = 0; i < row; i++) { if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[1][i] != ' ')) { return board[1][i]; } } if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) { return board[1][1]; } if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2]) && (board[1][1] != ' ')) { return board[1][1]; } if (Is_Full(board, row, col)) { return 'q'; } return ' '; }
说一下我在写这个程序时遇到的一些问题和总结到的经验。
首先再写之前应当构思我该写那些函数他们分别在那个.c文件中,最好拿纸笔记下来,函数名以及他们各自实现什么功能。
并且在写程序时应当从主函数main函数开始写,逐步一点点向外扩展。写函数主要是一个实现模块化的步骤,每个模块单独构思写出来就可以。但我在写程序时需要一些问题,我在写了部分函数之后,如果我想要测试一下他们的功能是否正确实现了呢?
还有一个来自初学者的建议,再写关于逻辑的判断语句时括号真的很重要….希望自己以后不要再犯这么低级的错误啦!
最后附上游戏截图:
相关文章推荐
- 【三子棋】C语言小程序三子棋
- 简单的c语言三子棋游戏(我写的第一个超过百行的程序,多有不足)
- C语言实现简单三子棋程序
- C语言:程序结构和语序
- 一个关于二叉树的创建、先序遍历、中序遍历、后序遍历、求叶子节点的完整函数的c语言完整程序。
- C语言查看变量字节程序
- 6个变态的C语言Hello World程序
- 孵化001 ---C语言的第一个程序
- 基于C语言与原始套接字实现Ping程序
- 嵌入式学习--step3 程序下载与调试/嵌入式C语言应用
- c语言实现的简易窗口程序
- C语言:模拟输入密码系统,三次以内正常通过,三次退出程序
- C语言简单程序判定大小端
- C语言打造表白程序——教你做一个浪漫的程序员
- 使用socket的Linux上的C语言文件传输顺序服务器和客户端示例程序
- PIC24, dsPIC单片机端C语言serial bootloader和PC端C#语言bootloader串口通信程序
- c语言基本算法程序百例之九—杨辉三角形
- C语言 程序 简单二进制题目
- 【C语言】编写一个程序,从标准输入读取C源代码,验证所有的花括号都正确的成对出现
- 【C语言】02-第一个C程序