c语言编写五子棋游戏要有声音和菜单
时间: 2024-03-15 18:46:34 浏览: 16
好的,下面是一个带声音和菜单的五子棋游戏的C语言代码,需要用到Windows API中的一些函数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <Windows.h>
#define ROWS 15
#define COLS 15
// 初始化棋盘
void InitBoard(char board[][COLS], int rows, int cols)
{
int i, j;
for (i = 0; i < rows; ++i) {
for (j = 0; j < cols; ++j) {
board[i][j] = '+';
}
}
}
// 打印棋盘
void DisplayBoard(char board[][COLS], int rows, int cols)
{
int i, j;
printf(" ");
for (i = 0; i < cols; ++i) {
printf("%c ", 'A' + i);
}
printf("\n");
for (i = 0; i < rows; ++i) {
printf("%2d", i+1);
for (j = 0; j < cols; ++j) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
// 判断是否胜利
bool IsWin(char board[][COLS], int row, int col, char ch)
{
int i, j, count;
// 判断横向是否五子连珠
count = 0;
for (i = col-4; i <= col; ++i) {
if (i < 0 || i+4 >= COLS) {
continue;
}
count = 0;
for (j = i; j <= i+4; ++j) {
if (board[row][j] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
// 判断纵向是否五子连珠
count = 0;
for (i = row-4; i <= row; ++i) {
if (i < 0 || i+4 >= ROWS) {
continue;
}
count = 0;
for (j = i; j <= i+4; ++j) {
if (board[j][col] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
// 判断左上到右下是否五子连珠
count = 0;
for (i = row-4, j = col-4; i <= row, j <= col; ++i, ++j) {
if (i < 0 || i+4 >= ROWS || j < 0 || j+4 >= COLS) {
continue;
}
count = 0;
for (int k = 0; k < 5; ++k) {
if (board[i+k][j+k] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
// 判断左下到右上是否五子连珠
count = 0;
for (i = row+4, j = col-4; i >= row, j <= col; --i, ++j) {
if (i >= ROWS || i-4 < 0 || j < 0 || j+4 >= COLS) {
continue;
}
count = 0;
for (int k = 0; k < 5; ++k) {
if (board[i-k][j+k] == ch) {
++count;
}
}
if (count == 5) {
return true;
}
}
return false;
}
// 播放声音
void PlaySoundEffect()
{
PlaySound(TEXT("sound.wav"), NULL, SND_FILENAME | SND_ASYNC);
}
int main()
{
char board[ROWS][COLS];
int row, col, player = 1;
char ch = ' ';
InitBoard(board, ROWS, COLS);
while (true) {
system("cls"); // 清屏
printf("====================\n");
printf(" Menu\n");
printf("====================\n");
printf("1. Start game\n");
printf("2. Exit\n");
printf("====================\n");
printf("Please input your choice(1-2): ");
int choice;
scanf("%d", &choice);
if (choice == 2) {
break;
}
InitBoard(board, ROWS, COLS);
DisplayBoard(board, ROWS, COLS);
while (true) {
printf("player %d input the coordinate(row, column):", player);
scanf("%d %d", &row, &col);
getchar(); // 去除输入缓冲区的回车
if (row < 1 || row > ROWS || col < 0 || col >= COLS) {
printf("Invalid input!\n");
continue;
}
if (board[row-1][col] != '+') {
printf("(%d, %d) has been occupied!\n", row, col);
continue;
}
if (player == 1) {
ch = 'X';
player = 2;
} else {
ch = 'O';
player = 1;
}
board[row-1][col] = ch;
DisplayBoard(board, ROWS, COLS);
if (IsWin(board, row-1, col, ch)) {
printf("player %d win!", player==1 ? 2 : 1);
PlaySoundEffect(); // 播放胜利音效
break;
}
}
printf("Press any key to continue...");
getchar();
}
return 0;
}
```
在该程序中,添加了一个菜单,用户可以选择开始游戏或退出。当用户选择开始游戏时,先清空屏幕,初始化棋盘,打印棋盘,然后进入游戏循环。在用户输入坐标时,需要检查输入是否合法,如是否超出了棋盘范围、是否已经有棋子占据等。如果输入不合法,则需要提示用户重新输入。如果输入合法,则将对应位置的字符替换为当前玩家对应的字符(`X`或`O`),并判断当前玩家是否胜利。如果胜利,则打印胜利玩家的编号,并播放胜利音效。游戏结束后,需要等待用户按下任意键才能返回菜单。