一.基本步驟
1.建立游戲選單menu
2.創建一個棋盤并初始化
3.將初始化后的棋盤列印
4.玩家落子并列印棋盤(玩家輸入行列坐標的方式來落子)
5.判定勝負關系(玩家是否獲勝?有則直接游戲結束無則繼續進行)
6.電腦落子并列印棋盤(隨機位置落子,判定勝負關系)
7.若無勝負關系出現則繼續交替下棋直至出現勝負或和棋,
二.創建游戲選單
void menu()
{
printf("**********************\n");
printf("*******1.play *******\n");
printf("*******0.exit *******\n");
printf("**********************\n");
}
三.初始化棋盤
void initboard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
四.列印棋盤
void display(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
int j;
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 < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
列印出來的棋盤效果圖:

五.玩家走
void playmove(char board[ROW][COL], int row, int col)
{
printf("玩家走");
int x = 0, y = 0;
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");
}
}
}
玩家走的時候一定要判斷所落子的范圍,不能超過自己所設定的行和列的范圍,
效果圖:

六.電腦走
void computermove(char board[ROW][COL], int row, int col)
{
int x, y;
printf("電腦走:\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
電腦走的時候要呼叫一個隨機函式,在使用rand的時候要現在主函式中呼叫srand
srand((unsigned int)time(NULL));
效果圖:

七.判斷輸贏
char iswin(char board[ROW][COL], int row, int col)
{
//1.判斷輸贏
//1.行
int i;
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];
}
}
//2.列
int j;
for (j = 0; j< col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//3.對角線
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[0][2] != ' ')
{
return board[0][2];
}
//2.判斷平局
if (isfull(board, row, col))
{
return 'Q';
}
//3.游戲繼續
return 'C';
}
判斷平局的時候可以先呼叫isfull函式,判斷棋盤是否落滿子,如果已經落滿,并且沒有出現輸贏關系,那就代表平局
如果還有位置沒有下棋,那就繼續下棋,
int isfull(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
八.整體代碼
一個分為三個檔案 test.c是測驗游戲 game.c是游戲函式的實作 game.h是游戲函式的宣告
game.h(函式的宣告)
#pragma once
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//初始化棋盤
void initboard(char board[ROW][COL],int row, int col);
//列印棋盤
void display(char board[ROW][COL], int row, int col);
//玩家下棋
void playmove(char board[ROW][COL], int row, int col);
//電腦下棋
void computermove(char board[ROW][COL], int row, int col);
//判斷下棋結果
// 如果為* 玩家贏
// 如果為# 電腦贏
// 如果為Q 平局
// 如果為C 繼續
char iswin(char board[ROW][COL], int row, int col);
game.c(函式的實作)
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initboard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void display(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
int j;
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 < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void playmove(char board[ROW][COL], int row, int col)
{
printf("玩家走");
int x = 0, y = 0;
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");
}
}
}
void computermove(char board[ROW][COL], int row, int col)
{
int x, y;
printf("電腦走:\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int isfull(char board[ROW][COL], int row, int col)
{
int i, j;
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)
{
//1.判斷輸贏
//1.行
int i;
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];
}
}
//2.列
int j;
for (j = 0; j< col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//3.對角線
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[0][2] != ' ')
{
return board[0][2];
}
//2.判斷平局
if (isfull(board, row, col))
{
return 'Q';
}
//3.游戲繼續
return 'C';
}
test.c(函式的測驗)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
//測驗游戲
void menu()
{
printf("**********************\n");
printf("*******1.play *******\n");
printf("*******0.exit *******\n");
printf("**********************\n");
}
void game()
{
char ret;
char board[ROW][COL];
//初始化棋盤
initboard(board, ROW, COL);
//列印棋盤
display(board, ROW, COL);
//下棋程序
while (1)
{
playmove(board, ROW, COL);
display(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
computermove(board, ROW, COL);
display(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏\n");
}
else if (ret == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局\n");
}
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤\n");
break;
}
} while (input);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291731.html
標籤:其他
