test.c //测试游戏的逻辑
game.c //实现游戏的功能
game.h //游戏代码声明(主要是函数,符号定义)
一,创建新工程
最好改一下项目名称
二,程序写代码之前要先思考一下,整体逻辑
1,首先肯定是玩完一把之后,要选择是否继续再玩。根据我们要创建的游戏逻辑,我们用到的是do while 循环,我们要打印出选择的菜单,添加一个函数。设置选1 进入游戏,0退出游戏,选择其他的时候,提醒用户”输入错误,重新输入“。
void menu()
{
printf("***************************\n");
printf("**** 1.play 0.exit *******\n");
printf("***************************\n");
}
int main()
{
int input = 0;
do
{
menu();//菜单
printf("请选择;>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
二,我们用设置game进行封装我们的代码逻辑
玩家下后,电脑下并且保存下来,肯定不能这边下,然后电脑下了就没了。这里玩家下的棋我们用 “*” 表示 ,电脑下棋用“#”表示。
1,实现初始化棋盘,这里代码实在game.h的头文件
#pragma once
#include <stdio.h> //把它放在这里是因为test.c 和 game.c都要调用它(<stdio.h>),两个.c文件又都需要调用game.h所以不妨放在里面,方便应用
#include <stdlib.h>
#include <time.h>
//
#define ROW 3 //实现后续如果想该多子棋,直接改掉这里的数即可。
#define COL 3
//
//初始化
void Initboard(char board[ROW][COL], int row, int col);
2,棋盘初始化步骤
打印棋盘其实就是打印数组,最开始数组里放的空格
#define _CRT_SECURE_NO_WARNINGS
#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;
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");
}
}
下图就是打印出来的效果,但是我们思考一下,这个代码有局限性,如果我们想玩五子棋,这里的printf 就有了局限性,很蠢,所以我们要进行改进
改进的代码,后续如果想创建更多规格的棋盘,就可以直接该前面 define 的数字即可。
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0;i < row;i++)
{
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
int j = 0;
for (j = 0;j < col;j++)
{
printf(" %c ", board[i][j]);
if (j < col-1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
int j = 0;
for (j = 0;j < col;j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
/*printf("---|---|--- \n");*/
}
3,开始下棋
game.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#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 PlayerMove(char board[ROW][COL], int row, int col);
game.c
这个我们应该判断棋盘坐标是否在范围内,同时还有是否坐标已经被下过了,要提醒已被占用
还有一个最重要的,就是玩家输入的坐标,例如玩家想下(1,1)的位置,我们电脑规定的棋盘是行列都是0~2的,也就是说,玩家想下的位置对于电脑而言是(0,0).我们怎么解决呢?board[x - 1][y - 1]
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家请输入:>\n");
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");
}
}
}
4,电脑开始下棋
rand调用我们可以在test.c中加上
srand((unsigned int)time(NULL));//设置随机数的生成起点
game.c
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row; //0~2
y = rand() % col; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
4,如果棋盘满了呢,这时候我们就要判断输赢或者平局了。
下篇继续!!!!!!
都是自己学习的小笔记,有错误的,还请大佬订正。