C语言创建三子棋小游戏
初始化棋盘以及设置棋盘的形状
首先先看一下三子棋棋盘的形状,
这个三字棋的基本形状,里面其实一共有六行,但有些地方是空白的,该棋盘的代码如下
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//展示棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
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 < row; j++)
{
printf("---");
if (j < row - 1)//一个不同点
printf("|");
}
printf("\n");//一个不同点
}
}
}
游戏框架
接下来是构建整个游戏的框架,首先得有一个菜单,接下来由玩家选择是否进行游戏,
void menu()
{
printf("***********************\n");
printf("***** 1.play ****\n");
printf("***** 0.exit ****\n");
printf("***********************\n");
}
//首先实现运行游戏的主要框架
int main()
{
srand((unsigned int)time(NULL));
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);//缺少整个循环,所以程序出bug了
return 0;
}
这里面的input变量为0时循环刚好也退出了,设置三种选择让玩家自由选择,游戏框架弄好了之后就可以去看玩家的下棋和电脑下棋了。
玩家下棋
玩家下棋的实现需考虑到代码中的数组坐标和人们的常识中的坐标的差别,通常都是从1开始数,而数组的下标却不一样,数组的下标是从0开始的,所以相应的要将输入的坐标减一,
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋\n");
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");
}
}
判断输赢
接着是判断输赢的函数实现,判断输赢其实是判断棋盘上的连成一条线的坐标里的内容是否相等,
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
char IsWin(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][0] != ' ')
return board[i][0];
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')
return board[0][2];
if (IsFull(board, row, col))//一个不同点
{
return 'Q';//判断用单引号
}
else
return 'C';//判断用单引号
}
电脑下棋
然后是电脑下棋,电脑下棋,由于初学C语言,所以现在只能写出比较笨拙的机器人,就只能先用随机值下棋,以下是电脑下棋的代码,电脑下棋后也要判断输赢,同样是上面判断玩家输赢的代码
//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')//判断用单引号
{
board[x][y] = '#';//判断用单引号
break;
}
}
}
三子棋的完整代码
一共有三个文件:game.h、test.c、game.c、
game.h
#pragma once
#include <stdio.h>
#define ROW 3
#define COL 3
#include <time.h>
#include <stdlib.h>
//初始化棋盘
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);
//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
test.c
#include "game.h"
void game()
{
char ret = 0;
char board[ROW][COL];
InitBoard(board,ROW,COL);
DisplayBoard(board, ROW, COL);
while (1)
{
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);//这里写错了
ret = IsWin(board,ROW,COL);
if (ret != 'C')//一个不同点
{
break;
}//这里少了下面这一次大循环
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')//判断用单引号
{
break;
}
}
if (ret == '*')//判断用单引号
printf("玩家赢\n");
else if (ret == '#')//判断用单引号
printf("电脑赢\n");
else
printf("平局\n");
}
void menu()
{
printf("***********************\n");
printf("***** 1.play ****\n");
printf("***** 0.exit ****\n");
printf("***********************\n");
}
//首先实现运行游戏的主要框架
int main()
{
srand((unsigned int)time(NULL));
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);//缺少整个循环,所以程序出bug了
return 0;
}
game.c
#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 < row; j++)
{
printf("---");
if (j < row - 1)//一个不同点
printf("|");
}
printf("\n");//一个不同点
}
}
}
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋\n");
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 ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')//判断用单引号
{
board[x][y] = '#';//判断用单引号
break;
}
}
}
static int IsFull(char board[ROW][COL], int row, int col)
{
int j = 0;
int i = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')//判断用单引号
return 0;
}
}
return 1;
}
char IsWin(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][0] != ' ')
return board[i][0];
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')
return board[0][2];
if (IsFull(board, row, col))//一个不同点
{
return 'Q';//判断用单引号
}
else
return 'C';//判断用单引号
}
随聊
三子棋是第一个上手感觉挺有难度的一个游戏设计,但在三子棋中里面用到的其实都是较常见的语法,是因为现在没有熟练地掌握才会觉得有难度,完成这个游戏有利于一些较常用的结构的使用,如嵌套循环和数组的组合,通过不断地练习一些较有难度地代码能够更好地熟悉,也可以加深记忆,不断积累才能逐渐成长为一名合格的程序员。任重而道远,一起加油!!!