三子棋简介
是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。
具体思路
玩家和电脑各自执棋,首先在屏幕上显示棋盘状况(规定玩家的棋子为’x‘,电脑的棋子为’0‘),玩家通过输入坐标选择下一步落子的位置,代码判断局势情况,若没有分出胜负且棋盘未满则电脑落子,电脑以生成随机数的方式走,在每一次玩家或者电脑落子后都要判断当前情况,若棋盘满则为和棋。
代码实现
这个小游戏我采用的是多文件编程,所有的头文件整合在game.h中,game.c为所有的游戏模块函数,main函数为主体部分。
头文件game.h
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#include<windows.h>
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'O'
void Menu(); //菜单显示函数
void DrawBoard(char board[][COL], int row, int col); //棋盘显示函数
void PlayMove(char board[][COL], int row, int col); //玩家落子函数
void ComputerMove(char board[][COL], int row, int col); //电脑落子函数
char Judge(char board[][COL], int row, int col); //判断哪一方胜出函数
void Game(); //主游戏函数
#pragma warning(disable:4996)
#endif
在头文件中定义棋盘的大小,3行3列 #define ROW 3,#define COL 3,玩家落子为’x‘,电脑落子为’o‘
主函数main.c
int main() {
int quit=0;
while (!quit) {
int select;
Menu();
printf("请输入你的选项\n");
scanf("%d", &select);
switch (select) {
case 1:
Game();
break;
case 2:
printf("退出!");
quit =1 ;
break;
default:
printf("你输入的有误,请重新输入\n");
break;
}
}
printf("Bye,Bye!\n");
system("pause");
return 0;
}
主函数为整个游戏的控制部分,通过玩家输入的数字来执行各部分代码。
游戏文件game.c
棋盘显示函数
void DrawBoard(char board[][COL], int row, int col) {
printf("\n\n\n");
printf(" | 1 | 2 | 3 |\n");
printf("--------------\n");
for (int i = 0; i < row; i++) {
printf("%d|", i + 1);
for (int j = 0; j < col; j++) {
printf(" %c |", board[i][j]);
}
printf("\n--------------\n");
}
}
对棋盘进行显示,在每一行每一列标上序号,并且棋盘内容为空。
显示如下
玩家落子函数
void PlayMove(char board[][COL], int row, int col) {
int x = 0;
int y = 0;
while (1) {
printf("请输入你下一步的位置");
scanf("%d %d", &x, &y);
if (x < 1 || x>3 || y < 1 || y>3) {
printf("输入有误,请重新输入\n");
continue;
}
if (board[x - 1][y - 1] != ' ') {
printf("该位置已有棋子,请重新输入\n");
continue;
}
board[x - 1][y - 1] = P_COLOR;
return;
}
}
玩家通过键盘输入落子的左边,代码判断此位置是否输入正确,输入超过棋盘范围会让玩家重新输入,如该位置已有棋子,也会让玩家重新输入,若判断都没有问题,则在棋盘该位置落子。
电脑落子函数
void ComputerMove(char board[][COL], int row, int col) {
while (1) {
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = C_COLOR;
break;
}
}
}
电脑落子的位置用<time.h>头文件的srand()函数的随机数种子生成随机数并取横竖列的模除来满足上述条件。并且在该位置为空的情况下落子。
判断函数
char Judge(char board[][COL], int row, int col) {
for (int 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 (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[1][1] && \
board[1][1] == board[2][2] && \
board[0][0] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[2][0] != ' ')
return board[0][2];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 'N';
}
}
}
return 'P';
}
三子棋获胜的条件是横或者竖或交叉连续三个棋子一样则为获胜,若棋盘满后还未分出胜负,则为平局。满足获胜条件返回’N‘,平局则返回’P‘
具体代码
// game.h
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#include<windows.h>
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'O'
void Menu(); //菜单显示函数
void DrawBoard(char board[][COL], int row, int col); //棋盘显示函数
void PlayMove(char board[][COL], int row, int col); //玩家走
void ComputerMove(char board[][COL], int row, int col); //电脑走
char Judge(char board[][COL], int row, int col); //判断哪一方胜出函数
void Game(); //主游戏函数
#pragma warning(disable:4996)
#endif
// game.c
#include"game.h"
void Menu() {
printf("------------------------------\n");
printf("------1.Enter Game------------\n");
printf("------2.Quit------------------\n");
printf("------------------------------\n");
}
void DrawBoard(char board[][COL], int row, int col) {
printf("\n\n\n");
printf(" | 1 | 2 | 3 |\n");
printf("--------------\n");
for (int i = 0; i < row; i++) {
printf("%d|", i + 1);
for (int j = 0; j < col; j++) {
printf(" %c |", board[i][j]);
}
printf("\n--------------\n");
}
}
void PlayMove(char board[][COL], int row, int col) {
int x = 0;
int y = 0;
while (1) {
printf("请输入你下一步的位置");
scanf("%d %d", &x, &y);
if (x < 1 || x>3 || y < 1 || y>3) {
printf("输入有误,请重新输入\n");
continue;
}
if (board[x - 1][y - 1] != ' ') {
printf("该位置已有棋子,请重新输入\n");
continue;
}
board[x - 1][y - 1] = P_COLOR;
return;
}
}
void ComputerMove(char board[][COL], int row, int col) {
while (1) {
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = C_COLOR;
break;
}
}
}
char Judge(char board[][COL], int row, int col) {
for (int 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 (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[1][1] && \
board[1][1] == board[2][2] && \
board[0][0] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[2][0] != ' ')
return board[0][2];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 'N';
}
}
}
return 'P';
}
void Game() {
srand((unsigned long)time(NULL));
char board[ROW][COL];
memset(board, ' ',sizeof(board));
char win = '\0';
do {
DrawBoard(board, ROW, COL);
PlayMove(board, ROW, COL);
win = Judge(board, ROW, COL);
if (win != 'N') {
break;
}
ComputerMove(board, ROW, COL);
win = Judge(board, ROW, COL);
if (win != 'N') {
break;
}
} while (1);
switch (win) {
case(P_COLOR):
printf("You win\n");
break;
case(C_COLOR):
printf("You lose\n");
break;
case('P'):
printf("平局\n");
default:
break;
}
DrawBoard(board, ROW, COL);
return;
}
// main.c
#include "game.h"
int main() {
int quit=0;
while (!quit) {
int select;
Menu();
printf("请输入你的选项\n");
scanf("%d", &select);
switch (select) {
case 1:
Game();
break;
case 2:
printf("退出!");
quit =1 ;
break;
default:
printf("你输入的有误,请重新输入\n");
break;
}
}
printf("Bye,Bye!\n");
system("pause");
return 0;
}