目录
一:游戏的逻辑:
二.创建一个头文件,两个 源文件!
三:实现
1.头文件 game.h
2.辅源文件 game.c
1.初始化棋盘的函数,将二维数内都设置为空白
2.打印棋盘
3.玩家下棋
4.电脑下棋
5.判断输赢和平局
3.主源文件 三子棋.c
1.游戏菜单
2.实现游戏内容
3.构建游戏框架
4.运行
四.完整代码
1.头文件
2.源文件(辅)
3.源文件(主)
五.总结
在创作之前,我们应该先构建一个大致的思路,这个类似于写作文时的提纲!有了思路,我们在创作时才不会在写一个比较复杂的代码时迷路!
一:游戏的逻辑:
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'*’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'q’表示和棋。
6.电脑落子(随机位置落子) ,'#’表示电脑落子。
7.判定胜负关系。
8.回到 步骤2 继续执行。
二.创建一个头文件,两个 源文件!
1.头文件用来做函数声明
2.两个源文件的分配:一个为主,一个为辅。
主:用来实现三子棋游戏,实现它所需要的所有的逻辑;(三子棋完整的逻辑,应用不同的代码块的声明)
辅:用来完备,编译在运行三子棋时所需要的函数块,方便主函数的使用!(写函数)
三:实现
1.头文件 game.h
#pragma once #include#include #include #define ROW 3 #define COL 3 //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col); //玩家下棋 void player_move(char board[ROW][COL], int row, int col); //电脑下棋 void computer_move(char board[ROW][COL], int row, int col); //判断输赢的代码 //玩家赢 - '*' //电脑赢 - '#' //平均 --- 'Q' //继续 ----'C' char is_win(char board[ROW][COL], int row, int col);
2.辅源文件 game.c1.初始化棋盘的函数,将二维数内都设置为空白
void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } }2.打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { //数据 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"); } }3.玩家下棋
//玩家下棋 void player_move(char board[ROW][COL], int row, int col) { printf("玩家下棋:>"); int x = 0; int y = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("该坐标被占用,请重新输入!n"); } } else { printf("坐标非法,请重输入!n"); } } }4.电脑下棋
通过系统时间,生成随机数,使得电脑在随机的空地方下棋(该处电脑下棋比较智障,请理解,本人目前能力有限,尚未设计出AI电脑人)
void computer_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑下棋>n"); while (1) { x = rand() % ROW;//0~2 y = rand() % COL;//0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }5.判断输赢和平局
char is_win(char board[ROW][COL], 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 < col; 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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } //判断平局 if (1 == is_full(board, row, col)) { return 'Q'; } //继续 return 'C'; }
3.主源文件 三子棋.c1.游戏菜单
1.开始
0.退出
void menu() { printf("************************n"); printf("***** 1. play ******n"); printf("***** 0. exit ******n"); printf("************************n"); }2.实现游戏内容
1.初始化棋盘,并打印
用一个二维数组打印棋盘并初始化
char board[ROW][COL] = { 0 };//数组的内容应该是全部空格 InitBoard(board, ROW, COL);//初始化棋牌 DisplayBoard(board, ROW, COL);//打印棋盘
2.下棋
通过一个死循环控制玩家下棋,电脑下棋,最后通过输 赢 平局 这三种结局跳出这个循环
char ret = 0; while (1) { player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } computer_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢n"); } else if (ret == '#') { printf("电脑赢n"); } else { printf("平局n"); }3.构建游戏框架
用一个switch函数判断开始或者退出游戏
void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏n"); break; default: printf("选择错误,请重新输入n"); break; } } while (input); }4.运行
int main() { test(); return 0; }四.完整代码 1.头文件
#pragma once #include2.源文件(辅)#include #include #define ROW 3 #define COL 3 //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col); //玩家下棋 void player_move(char board[ROW][COL], int row, int col); //电脑下棋 void computer_move(char board[ROW][COL], int row, int col); //判断输赢的代码 //玩家赢 - '*' //电脑赢 - '#' //平均 --- 'Q' //继续 ----'C' char is_win(char board[ROW][COL], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } } void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { //数据 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"); } } //玩家下棋 void player_move(char board[ROW][COL], int row, int col) { printf("玩家下棋:>"); int x = 0; int y = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("该坐标被占用,请重新输入!n"); } } else { printf("坐标非法,请重输入!n"); } } } void computer_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑下棋>n"); while (1) { x = rand() % ROW;//0~2 y = rand() % COL;//0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } int is_full(char board[ROW][COL], 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 is_win(char board[ROW][COL], 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 < col; 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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } //判断平局 if (1 == is_full(board, row, col)) { return 'Q'; } //继续 return 'C'; }23.源文件(主)
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("************************n"); printf("***** 1. play ******n"); printf("***** 0. exit ******n"); printf("************************n"); } void game() { //数据存储到一个字符的二维数组中,玩家下棋是'*',电脑下棋是'#', char board[ROW][COL] = { 0 };//数组的内容应该是全部空格 InitBoard(board, ROW, COL);//初始化棋牌 //打印棋盘 DisplayBoard(board, ROW, COL); //下棋 char ret = 0; while (1) { player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } computer_move(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢n"); } else if (ret == '#') { printf("电脑赢n"); } else { printf("平局n"); } } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏n"); break; default: printf("选择错误,请重新输入n"); break; } } while (input); } int main() { test(); return 0; }
五.总结
该小游戏先应该整理逻辑,待逻辑清晰后再动手写,则较为容易。锻炼能力强,应多写,便于更好的掌握所学内容。
(注:本文为原创作品,若无意侵权,请联系我。)
欢迎点赞 关注收藏 ⭐留言
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)