目录
本文是作者初次学习C语言时,写的笔记博文,如有错误请及时指正。多谢啦!!!!
一,问题描述
二,基本逻辑
三,具体步骤
1,进入游戏的选择逻辑
2,游戏体
3,创建棋盘
4,初始化棋盘
5,打印棋盘并美化棋盘
6,玩家下棋
7,电脑下棋
8,判断输赢
四,游戏函数体
五,三个文件的具体代码
1,源.c
2,game.c
3,game.h
感谢观看!!!!!!!!!!!!!!!!!!!!!!!!!
准备阶段:今天我们用模块化的编程方式,创建三个文件。
test.c //用来测试游戏的逻辑
game.c //游戏函数的实现
game.h //游戏中函数的声明,符号的定义。
写代码来实现简易三子棋游戏。
1,首先我们要写一个游戏的菜单选择进入游戏还是退出游戏
2,游戏体应该封装在一个函数内
3,创建一个二维数组来作为棋盘
4,打印我的棋盘并美化棋盘的函数
5,玩家下棋的函数
6,电脑下棋的函数
7,判断胜负的函数
8,回到菜单再次选择进入游戏还是退出游戏
写代码来实现:
输入1-->进入游戏;
输入0-->退出游戏;
输入其他数-->显示输入错误,请重新输入!
#include "game.h"
void menu()
{
printf("********************************************\n");
printf("********************************************\n");
printf("*************** 1.paly ***************\n");
printf("*************** 0.exit ***************\n");
printf("********************************************\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case 1:
game();//这里是游戏实现的函数
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("输入错误,请重新选择!!!\n");
}
}while (input);//这里直接用input也可以
}
int main()
{
srand((unsigned int)time(NULL));
test();
}
注意:这里应该包含头文件#include
,但是我们创建了 ”game.h“ ,可以在 "test.c" 和 ”game.c" 里面包含#include "game.h"。在 ”game.h“ 包含库函数的头文件,自定义函数的声明和一些自定义的宏变量。这样就可以吧一些头文件,自定义的宏,,,等集中定义和减少定义次数。
从test函数中case 1:用到的一个函数,是这个游戏的核心。在这个函数中实现游戏的所有功能。下面是game函数里面的各个功能代码现在我们来逐个分析。
void game()
{
//创建一个棋盘数组
char board[ROW][COL] = { ' ' };
//初始化棋盘
init_board(board, ROW, COL);
//打印棋盘并美化棋盘
print_board(board, ROW, COL);
while (1)
{
//玩家下棋
play_board(board, ROW, COL);
//电脑下棋
computer_board(board, ROW, COL);
//print_board(board, ROW, COL);
//判断输赢
//玩家赢返回*
//电脑赢返回#
//平局返回p
//继续返回j
print_board(board, ROW, COL);
if (win(board, ROW, COL) == '*')
{
printf("玩家赢!!!!\n");
break;
}
else if (win(board, ROW, COL) == '#')
{
printf("电脑赢!!!!!\n");
break;
}
else if (win(board, ROW, COL) == 'p')
{
printf("你真的菜,平局!!!!\n");
break;
}
else
printf("请再次下棋!!!\n");
}
}
假设玩家下棋为*,电脑下棋为#,未下棋的地方为空格表示。需要数据未char类型的
棋盘需要一个3*3的二维数组来表示
char board[ROW][COL] = { ' ' };
注意这里的 ROW 和 COL 这里是自定义的宏变量。
1,提高了代码的兼容性,例如:更改 ROW和COL就可以直接更改棋盘。
2,方便理解,提高了可读性,见到ROW就可以认为是棋盘的行,COL就是列。
#include
#include #include #define ROW 3 #define COL 3
下棋时数组中的元素应该是 ’空格‘ ,这里就是一个简单的双循环。
下面是具体实现。
//初始化棋盘 void init_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { board[i][j] = ' '; } } }
我们在打印时候由于数组的数据都是空格我们看不到。
所以要加一些线条,组成方格的棋盘,美化一下。
这里用到了一些循环和判断相互嵌套。
void print_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)//这个就是打印数据行,
{
printf(" %c ", board[i][j]);
if (j < col - 1)//最后一个|不要
{
printf("|");
}
}
printf("\n");//注意换行
if (i < row - 1)//最后一个分割行不要
{
for (int z = 0; z < col; z++)//这个循环分割行
{
printf("---");
if (z < col - 1)//同样最后一个|也不要
{
printf("|");
}
}
}
printf("\n");
}
}
玩家下棋就是输入对应的坐标,这里注意要先判断坐标的合法性,还要判断这个点是否已经有棋子,
如果已经有棋子打印已有棋子,并让他从新输入。
如果坐标不合法,打印坐标不合法并让他重新打印。
下面是函数的具体实现。
注意循环结构
//玩家下棋 void play_board(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("请输入坐标:"); 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"); } } }
我们写的代码就是简单的代码
电脑下棋就是随机下棋,这就要生成两个随机数,这里就要用到rand 和srand和time。
在主函数里面引用srand和time函数(因为这里的srand就只需要引用一次)
int main() { srand((unsigned int)time(NULL)); test(); }
在这里对随机数%3然后加1就生成了合法的坐标,直接判断该坐标下有没有棋子就行。
//电脑下棋 void computer_board(char board[ROW][COL], int row, int col) { while (1) { int x = rand() % 3 + 1; int y = rand() % 3 + 1; if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '#'; break; } } } }
注意写成循环结构。
每次下棋后都要判断输赢,这里判断的时候就只有四种情况,、
玩家赢返回*
电脑赢返回#
平局返回p
继续返回j
下面是函数的实现
char win(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)//判断三行是否相等
{
if (board[i][1] == board[i][0] && board[i][0] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (int i = 0; i < col; i++)//判断三列是否相等
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//
if (board[0][0] == board[2][2] && board[2][2] == board[1][1] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
int count = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
count++;
}
}
}
if (count = 0)
{
return 'p';
}
else
return 'j';
}
void game()
{
//创建一个棋盘数组
char board[ROW][COL] = { ' ' };
//初始化棋盘
init_board(board, ROW, COL);
//打印棋盘并美化棋盘
print_board(board, ROW, COL);
while (1)
{
//玩家下棋
play_board(board, ROW, COL);
//电脑下棋
computer_board(board, ROW, COL);
//print_board(board, ROW, COL);
//判断输赢
//玩家赢返回*
//电脑赢返回#
//平局返回p
//继续返回j
print_board(board, ROW, COL);
if (win(board, ROW, COL) == '*')
{
printf("玩家赢!!!!\n");
break;
}
else if (win(board, ROW, COL) == '#')
{
printf("电脑赢!!!!!\n");
break;
}
else if (win(board, ROW, COL) == 'p')
{
printf("你真的菜,平局!!!!\n");
break;
}
else
printf("请再次下棋!!!\n");
}
}
#include"game.h" void menu() { printf("********************************************\n"); printf("********************************************\n"); printf("*************** 1.paly ***************\n"); printf("*************** 0.exit ***************\n"); printf("********************************************\n"); } void game() { //创建一个棋盘数组 char board[ROW][COL] = { ' ' }; //初始化棋盘 init_board(board, ROW, COL); //打印棋盘并美化棋盘 print_board(board, ROW, COL); while (1) { //玩家下棋 play_board(board, ROW, COL); //电脑下棋 computer_board(board, ROW, COL); //print_board(board, ROW, COL); //判断输赢 //玩家赢返回* //电脑赢返回# //平局返回p //继续返回j print_board(board, ROW, COL); if (win(board, ROW, COL) == '*') { printf("玩家赢!!!!\n"); break; } else if (win(board, ROW, COL) == '#') { printf("电脑赢!!!!!\n"); break; } else if (win(board, ROW, COL) == 'p') { printf("你真的菜,平局!!!!\n"); break; } else printf("请再次下棋!!!\n"); } } void test() { int input = 0; do { menu(); printf("请选择->"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default : printf("输入错误,请重新选择!!!\n"); } }while (input); } int main() { srand((unsigned int)time(NULL)); test(); }
#include"game.h"
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘并美化棋盘
void print_board(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)//这个就是打印数据行,
{
printf(" %c ", board[i][j]);
if (j < col - 1)//最后一个|不要
{
printf("|");
}
}
printf("\n");//注意换行
if (i < row - 1)//最后一个分割行不要
{
for (int z = 0; z < col; z++)//这个循环分割行
{
printf("---");
if (z < col - 1)//同样最后一个|也不要
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家下棋
void play_board(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
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_board(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % 3 + 1;
int y = rand() % 3 + 1;
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '#';
break;
}
}
}
}
//判断输赢
//玩家赢返回*
//电脑赢返回#
//平局返回p
//继续返回j
char win(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)//判断三行是否相等
{
if (board[i][1] == board[i][0] && board[i][0] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
for (int i = 0; i < col; i++)//判断三列是否相等
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//
if (board[0][0] == board[2][2] && board[2][2] == board[1][1] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
int count = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
count++;
}
}
}
if (count = 0)
{
return 'p';
}
else
return 'j';
}
#pragma once
#include
#include
#include
#define ROW 3
#define COL 3
//舒适化棋盘
void init_board(char bpard[ROW][COL], int row, int col);
//打印棋盘并美化棋盘
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void play_board(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char win(char board[ROW][COL], int row, int col);