目录
前言
用c语言实现一个三子棋的游戏,当然也可以实现多子棋,修改一点参数即可
一、创建三子棋的思路过程?
1.首先是需要创建一个头文件和两个源文件(在以后的项目开发过程中,一般是不会将源文件开放的,这里就开始模拟以后的开发过程)
2.头文件用来声明我的游戏模块函数
3.一个测试文件,一个游戏模块文件
二、游戏模块
1.首先是初始化棋盘,将棋盘打印出来
2.玩家下棋,电脑下棋
3.判断输赢
有了思路之后,写代码就会好很多了,先将整体的框架搭建好,细节都是可以慢慢完善的
1.棋盘初始化
棋盘初始化时,先要初始化棋盘的内容,然后将棋盘打印出来,这里就将棋盘内容全部初始化为空
代码如下(示例):
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 j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
2.开始下棋
玩家下棋:
这里的思路大概就是玩家随便输入一个坐标,电脑判断坐标是否合法,合法的坐标就将一个字符输入进棋盘,这里的做法是将二维数组的对应下标值对应的那个字符更改
电脑下棋:
随机生成两个数作为棋盘的下标,生成时保证下标合法
代码如下(示例):
void player_move(char board[Row][Col], int row, int col)
{
int x, y;
printf("玩家下棋,请输入棋盘坐标:");
while (true)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已落子,请重新选择!");
}
}
else
{
printf("坐标输入错误!,请重新输入");
}
}
}
void computer_move(char board[Row][Col], int row, int col)
{
printf("电脑下棋:\n");
while (true)
{
int x = rand() % row;
int y = rand() % col;
if (x >= 1 && x <= row && y >= 0 && y <= col)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
}
3.判断输赢
通过对每一行、每一列、对角线的字符是否相等来判定输赢,这里的判断优化过了,不管是几子棋,这个判定程序都能够实现
同时如果棋盘满了还没有判断出来输赢,则这局游戏为平局
代码如下(示例):
int is_full(char board[Row][Col], int row, int col)//棋盘满了就不再继续了
{
for (int i = 0; i < row; i++)
{
for (int 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 row1 = 0;
int i = 0;
int count = 0;
for (int i = 0; i < row; i++)//判断行相等
{
int j = 0;
count = 0;
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
row1 = 0;
break;
}
if (board[i][0] == board[i][j])
{
row1 = 1;
count++;
if (count == col)
{
return board[i][0];
}
}
else if (board[i][0] != board[i][j])
{
row1 = 0;
}
}
}
int col1 = 0;
for (int i = 0; i < row; i++)//判断列相等
{
count = 0;
for (int j = 0; j < col; j++)
{
if (board[0][i] == ' ')
{
col1 = 0;
break;
}
if (board[0][i] == board[j][i])
{
col1 = 1;
count++;
if (count == row)
{
return board[0][i];
}
}
else if (board[0][i] != board[j][i])
{
col1 = 0;
}
}
}
int x = 0;
count = 0;
for (int i = 0; i < row;i++)//判断正对角线相等
{
if (board[i][i] == ' ')
{
x = 0;
break;
}
if (board[0][0] == board[i][i])
{
x = 1;
count++;
if (count == row)
{
return board[0][0];
}
}
else if (board[0][0] != board[i][i])
{
col1 = 0;
}
}
count = 0;
x = 0;
for (int i = 0, j=col-1; i < row ; i++,j--)//判断反对角线相等
{
if (board[i][j] == ' ')
{
x = 0;
break;
}
if (board[0][col-1] == board[i][j])
{
x = 1;
count++;
if (count == row)
{
return board[0][col-1];
}
}
else if (board[0][col-1] != board[i][j])
{
x = 0;
}
}
if (is_full(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
三、测试模块
1.将所有的模块整合,将这个游戏实现出来
2.制作一个简易的图形化处理界面
3.循环游戏,通过玩家的输入数字来决定是否继续
4.游戏进行时也要循环,只有获胜或者平局是游戏才结束
代码如下(示例):
void menu()
{
printf("********************\n");
printf("*****1.开始游戏*****\n");
printf("*****0.退出游戏*****\n");
printf("********************\n");
}
void game()
{
char board[Row][Col];
char ret;
init_board(board,Row,Col);
print_board(board, Row, Col);
while (true)
{
player_move(board, Row, Col);
print_board(board, Row, Col);
ret = is_win(board, Row, Col);
if (ret != 'C')
{
break;
}
computer_move(board, Row, Col);
print_board(board, Row, Col);
ret = is_win(board, Row, Col);
if (ret != 'C')
{
break;
}
}
if (ret == 'Q')
{
printf("平局");
}
else if (ret == '*')
{
printf("玩家胜利");
}
else if (ret == '#')
{
printf("电脑胜利");
}
}
int main()
{
int input;
do
{
menu();
printf("请输入你的选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:printf("输入有误!请重新输入!");
}
printf("\n");
} while (input);
}
四、源码
//头文件
#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define Row 3
#define Col 3
//初始化棋盘
void init_board(char board[Row][Col], int row, int col);
//打印棋盘
void print_board(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);
//判断输赢
char is_win(char board[Row][Col], int row, int col);
//游戏模块
#define _CRT_SECURE_NO_WARNINGS 1
#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 j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void player_move(char board[Row][Col], int row, int col)
{
int x, y;
printf("玩家下棋,请输入棋盘坐标:");
while (true)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已落子,请重新选择!");
}
}
else
{
printf("坐标输入错误!,请重新输入");
}
}
}
void computer_move(char board[Row][Col], int row, int col)
{
printf("电脑下棋:\n");
while (true)
{
int x = rand() % row;
int y = rand() % col;
if (x >= 1 && x <= row && y >= 0 && y <= col)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
}
int is_full(char board[Row][Col], int row, int col)//棋盘满了就不再继续了
{
for (int i = 0; i < row; i++)
{
for (int 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 row1 = 0;
int i = 0;
int count = 0;
for (int i = 0; i < row; i++)//判断行相等
{
int j = 0;
count = 0;
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
row1 = 0;
break;
}
if (board[i][0] == board[i][j])
{
row1 = 1;
count++;
if (count == col)
{
return board[i][0];
}
}
else if (board[i][0] != board[i][j])
{
row1 = 0;
}
}
}
int col1 = 0;
for (int i = 0; i < row; i++)//判断列相等
{
count = 0;
for (int j = 0; j < col; j++)
{
if (board[0][i] == ' ')
{
col1 = 0;
break;
}
if (board[0][i] == board[j][i])
{
col1 = 1;
count++;
if (count == row)
{
return board[0][i];
}
}
else if (board[0][i] != board[j][i])
{
col1 = 0;
}
}
}
int x = 0;
count = 0;
for (int i = 0; i < row;i++)//判断正对角线相等
{
if (board[i][i] == ' ')
{
x = 0;
break;
}
if (board[0][0] == board[i][i])
{
x = 1;
count++;
if (count == row)
{
return board[0][0];
}
}
else if (board[0][0] != board[i][i])
{
col1 = 0;
}
}
count = 0;
x = 0;
for (int i = 0, j=col-1; i < row ; i++,j--)//判断反对角线相等
{
if (board[i][j] == ' ')
{
x = 0;
break;
}
if (board[0][col-1] == board[i][j])
{
x = 1;
count++;
if (count == row)
{
return board[0][col-1];
}
}
else if (board[0][col-1] != board[i][j])
{
x = 0;
}
}
if (is_full(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
//测试模块
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("********************\n");
printf("*****1.开始游戏*****\n");
printf("*****0.退出游戏*****\n");
printf("********************\n");
}
void game()
{
char board[Row][Col];
char ret;
init_board(board,Row,Col);
print_board(board, Row, Col);
while (true)
{
player_move(board, Row, Col);
print_board(board, Row, Col);
ret = is_win(board, Row, Col);
if (ret != 'C')
{
break;
}
computer_move(board, Row, Col);
print_board(board, Row, Col);
ret = is_win(board, Row, Col);
if (ret != 'C')
{
break;
}
}
if (ret == 'Q')
{
printf("平局");
}
else if (ret == '*')
{
printf("玩家胜利");
}
else if (ret == '#')
{
printf("电脑胜利");
}
}
int main()
{
int input;
do
{
menu();
printf("请输入你的选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:printf("输入有误!请重新输入!");
}
printf("\n");
} while (input);
}
总结
以上就是三子棋的全部实现内容了,有些地方还没有优化好,但是支持各种棋盘,大家有兴趣的可以拷到电脑上玩一下